添加和删除人员的循环算法



好吧,在这个代码笔中,我已经找到了一个循环赛调度算法:https://codepen.io/Piconey/pen/mwPamw

var players = [
{
playerName: 'Person 1',
},
{
playerName: 'Person 2',
},
{
playerName: 'Person 3',
},
{
playerName: 'Person 4',
},
{
playerName: 'Person 5',
},
{
playerName: 'Person 6',
},
{
playerName: 'Person 7',
},
{
playerName: 'Person 8',
},
{
playerName: 'Person 9',
},
{
playerName: 'Person 10',
},
{
playerName: 'Person 11',
},
{
playerName: 'Person 12',
},
{
playerName: 'Person 13',
},
{
playerName: 'Person 14',
},
{
playerName: 'Person 15',
},
{
playerName: 'Person 16',
},
];
var numberOfRounds = players.length - 1;
function generateRounds() {
for(i = 0; i < numberOfRounds; i++) {
document.write('<h1 class="round">'+'Round ' + (i+1) + '</h1>');

for (var j = 0; j < players.length / 2; j++) { 
document.write('<div class="match">' + players[j].playerName + " - " + players[players.length - 1 - j].playerName +'</div>');
}
players.splice(1, 0, players[15]);
players.pop();
}
}
generateRounds();

我用它来进行快速约会,即使你可以和每个人约会。

我的问题:每轮比赛结束后,新人都可以参加或离开比赛(如果他们感到无聊;(

注:迟到者不需要和所有人约会,因为他们已经错过了x轮注2:如果很多人离开,最好限制轮次,这样人们就不需要在两次约会之间等待那么长时间

对于像男女分开的快速约会这样的二部分匹配问题,可以使用最大流量算法。

构建4层图形:

  1. 源节点S
  2. 每个人一个节点
  3. 每个女人一个节点
  4. 汇点节点T
  • 完全连接第1层到第2层,边缘容量为1
  • 完全连接第2层到第3层,边缘容量为1
  • 完全连接第3层到第4层,边缘容量为1

添加人员时,将其添加为第2层或第3层中的新节点,并如上所述完全连接到相邻层。

删除人员后,请删除其在第2层和第3层中的节点以及节点中的所有边。

在每一轮中,使用最大流量算法来识别您的配对。循环后,设置第2层的容量->配对中涉及的第3层边缘为0。这将防止同一个人在随后的几轮比赛中再次配对。


启发式:您可以修改最大流量算法,将约会次数最少或轮次最多的人配对,这样,如果存在奇数人,则最新的人和同一个人都不会轮次。

扩展:可以通过过滤在第2层和第3层之间添加的边集来实现首选项以限制潜在匹配集。

时间:每轮大约O(n^3(

github上的一些javascript最大流量包,从未尝试过,祝你好运:https://github.com/orcaman/flownetwork


对于任何人对任何人的匹配问题,必须用更复杂的Blossom算法替换最大流量算法。

与max-flow一样,该算法通过查找扩充路径然后修改其当前匹配集来迭代地细化匹配。

该算法的输入是:

  • 为每个人添加一个节点
  • 完全连接所有节点

在二分情况下,在每一轮结束时,删除与前几轮匹配对应的所有边,以防止相同的两个人匹配。

当一个新人加入时,添加一个节点并将他们完全连接到其他人。

当人员离开时,移除其节点和所有连接的边。

Blossom算法在这里有更好的描述https://en.wikipedia.org/wiki/Blossom_algorithm

快速搜索显示了该算法的几个javascript实现,您的里程可能会有所不同。

  • Javascript 中的匹配算法

  • https://www.npmjs.com/package/edmonds-blossom

最新更新