0-100のスキルを持つプレイヤーのリストと、すべてのメンバーリストを持つチームのリストを得ました。さらに強力なチームを生成するための最善のアルゴリズム
今、私はチームがほとんど同じサイズ(+ -1の違いは大丈夫です)になるように選手をチームに入れたいと思っており、スキルの合計は可能な限り近いものにするべきです。
私の現在のソリューションは、単純な投票アルゴリズム(チームが円形に選手を投票、次の最高の選手を取る)である:
public class Teamgenerator {
public void calcTeams(){
List<Team> teams = new ArrayList<>();
teams.add(new Team("Team 1"));
teams.add(new Team("Team 2"));
List<Player> players = new ArrayList<>();
players.add(new Player("Player 1",25));
players.add(new Player("Player 2",50));
players.add(new Player("Player 3",50));
players.add(new Player("Player 4",75));
int nextTeam = 0;
while (players.size() > 0) {
int bestPlayer = findBestPlayerIndex(players);
teams.get(nextTeam).players.add(players.get(bestPlayer));
players.remove(bestPlayer);
if (nextTeam < teams.size() - 1) nextTeam++;
else nextTeam = 0;
}
for(Team t:teams){
System.out.println(t.getName()+":");
for(Player p:t.players)
System.out.println(p.getName()+", Skill "+p.getSkill());
}
}
private int findBestPlayerIndex(List<Player> players) {
//In my real programm i have to pick the skill of a more complex player object from a DB,
//depending on a specific competition, which causes i really need this index finding
int index = -1;
int highestSkill=-1;
for (int i = 0; i < players.size(); i++) {
if (players.get(i).getSkill() > highestSkill) {
highestSkill = players.get(i).getSkill();
index = i;
}
}
return index;
}
}
public class Team {
private String name;
public ArrayList<Player> players=new ArrayList<>();
public Team(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Player {
private String name;
private int skill=50; //From 0-100
public Player(String name, int skill) {
this.name = name;
this.skill = skill;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSkill() {
return skill;
}
public void setSkill(int skill) {
this.skill = skill;
}
}
問題は、それが最もさえチームではない与えている、コンソール出力は次のようになります。
チーム1: プレーヤー4、スキル75; プレーヤー3、スキル50
チーム2: プレーヤー2、スキル50; プレイヤー1、スキル25
チームが4 + 1でプレイヤー3 + 2であれば、より公平になります。 もっと公平なアルゴリズムについて知っていますか?手伝ってくれてありがとう!
もう少し適切なアルゴリズムは、回転が完了するたびに次の回転の方向を変更することです。 – phatfingers
それは本質的にThue-Morseです。 –
ああ、私は学校で時々このような投票をしたことを覚えていますが、それはもっと公平に気づいたことはありません...明日私のコードでそのThue-Morseを使用してテストしようとします; –