计算两个具有球员评分的相等球队

Calculate two equal teams with player rating

我经常玩每个玩家都有等级的游戏。比如1678或者1820。赢了就得分,输了就丢分。

现在,当 8 名玩家加入一个大厅时,我们希望拥有平等的团队 (4v4),或者尽可能接近,评级明智。总是有 2 支球队和 3 到 8 名球员(也可以是不平衡的球队,比如 2v1)。

我可以使用什么算法在 JavaScript 中创建两个相等的团队?

例如:

ratings = [1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600];

team 1: [xxxx,xxxx,xxxx,xxxx] ??
team 2: [xxxx,xxxx,xxxx,xxxx] ??

对其进行了编辑,使其更加简洁,并为清楚起见将比较移到了外面。但这确实是按排名排序后玩家的基本分布。

let ratings = [1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600];

let team1 = [];
let team2 = []; 

const sortNumber = (n1, n2) => {
  if(n1 > n2) return -1;
  if(n1 < n2) return 1;
  return 0;
};


// Simple distibution
function distributePlayers(arrPlayers) {

  let sortedPlayers = arrPlayers.sort(sortNumber);
  console.log(sortedPlayers);
  let teams = [[],[]];
  
  sortedPlayers.forEach((player, index) => {
      teams[index%2].push(player);
  });
  
  return teams;
}

distributePlayers(ratings).forEach(team => {
  console.log(team);
});

这是基本的排序和分发。

let ratings = [1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600];

let team1 = [];
let team2 = []; 


// Simple distibution
function distributePlayers(arrPlayers) {
  let sortedPlayers = arrPlayers.sort((p1, p2) => {
    if(parseInt(p1) > parseInt(p2)) {
      return -1;
    } else if (parseInt(p1) < parseInt(p2)) {
      return 1;
    }
    return 0;
  });
  console.log(sortedPlayers);
  let teams = [[],[]];
  
  sortedPlayers.forEach((player, index) => {
      let teamIndex = index%2;
      teams[(teamIndex)].push(player);
  });
  
  return teams;
}

distributePlayers(ratings).forEach(team => {
  console.log(team);
})

您可以先对其进行排序,然后根据每个数组的总和添加到第一个或第二个数组。

function distribute(arr) {
  arr.sort().reverse()
  let a = [], b = [], sumA = 0, sumB = 0, i = 0

  while (i < arr.length) {
    if (!sumA && !sumB || sumA == sumB) {
      a.push(arr[i])
      sumA += arr[i]
    } else if (sumA < sumB) {
      a.push(arr[i])
      sumA += arr[i];
    } else if (sumB < sumA) {
      b.push(arr[i])
      sumB += arr[i];
    }
    i++
  }
  
  console.log(`Total: ${sumA} ${sumB}`)
  return [a, b]
}

console.log(distribute([1466, 1678, 1988, 1200, 1362, 1555, 1844, 1600]))
console.log(distribute([1466, 6000, 1988, 1200, 1362, 1555, 1844, 1600]))

我知道你在 javascript 中问过,但也许它对你有帮助。 我所做的只是得到数组的平均值(所有值的总和和/到团队的数量,在我的例子中是 2 个团队)=> 排序数组=> 将值推送到 team1 数组,直到 team1 数组的总和 > 然后是平均值 => 其余推送到 team2 数组

    ratings = [1306, 1578, 1458, 1450,1602, 1355, 1454, 1300]
    from functools import reduce
    class match_making(object):
        team1 = []
        team2 = []
        def __init__(self,ratings): 
            self.ratings = ratings
        def get_value(self):
            self.average_value = reduce(lambda x,y: x + y / 2 ,self.ratings)
        def split_players (self):
            x = 0
            for player in sorted(self.ratings):
                x = x + player
                if x < self.average_value:
                    self.team1.append(player)
                    print(x)
                elif x > self.average_value:
                    self.team2.append(player)

        def dowork(self):
            self.get_value()
            self.split_players()
            some = reduce(lambda x , y :x +y , self.team1) #just too see average rating of the team1
            some2 = reduce(lambda x , y :x +y , self.team2)# same as above for team2
            return some,some2,self.team1,self.team2


    divide_players = match_making(ratings)
    print(divide_players.dowork())