Javascript 两组大小不同的成员必须见面(1v1,一次)
我最近一直在努力写一种“速配风格”的算法。基本目标是让一组中的每个成员(男性)与另一组中的每个成员(女性)在他们的餐桌上会面一次 条件是:Javascript 两组大小不同的成员必须见面(1v1,一次),javascript,jquery,algorithm,Javascript,Jquery,Algorithm,我最近一直在努力写一种“速配风格”的算法。基本目标是让一组中的每个成员(男性)与另一组中的每个成员(女性)在他们的餐桌上会面一次 条件是: 桌子的数量与妇女的数量相等 每个男人都被分配到一张有女人坐的桌子上(1v1对话) 在下一轮比赛中,每个人都换到了一张他从未去过的桌子上 如果小组规模不同,则任何成员(男性或女性)不得连续两轮暂停(缺少搭档) 当男性群体的成员多于女性群体时,就会出现困难,反之亦然 例如: var men = [ 'm1', 'm2', 'm3', 'm4', 'm
var men = [
'm1', 'm2', 'm3', 'm4', 'm5',
],
women = [
'w1', 'w2', 'w3'
];
┃ ROUND 1 ┃ ROUND 2
┌─────────────┬─────────────┐ ┌─────────────┬─────────────┐
│ men │ women │ │ men │ women │
├─────────────┴─────────────┤ ├─────────────┴─────────────┤
│ m1 >>> w1 │ │ m4 >>> w1 │
│ m2 >>> w2 │ │ m5 >>> w2 │
│ m3 >>> w3 │ │ m1 >>> w3 │
│ m4 pause │ │ m2 pause │
│ m5 pause │ │ m3 pause │
└───────────────────────────┘ └───────────────────────────┘
┃ ROUND 3
┌─────────────┬─────────────┐
│ men │ women │
├─────────────┴─────────────┤
│ m2 >>> w1 │
│ m3 >>> w2 │
│ m4 >>> w3 │
│ m5 pause │
│ m1 pause │
└───────────────────────────┘
因此,配对为:
var results = [
'm1' = [
'w1', 'w3', null
],
'm2' = [
'w2', null, 'w1'
],
'm3' = [
'w3', null, 'w2'
],
'm4' = [
null, 'w1', 'w3'
],
'm5' = [
null, 'w2', null
],
];
到目前为止,我试图解决这个问题的尝试都没有成功,尽管我在这个网站和其他网站上看到了类似的问题(见下面的截图)。在这次尝试中,我跑了15/15轮,但仍然有人停了2轮或更多轮,以此类推
*截图中的名字是假的;产生于
我当前在Javascript中的(非工作)尝试 我基本上有四个数组
var-men\u数组=[
‘m1’、‘m2’、‘m3’、‘m4’、‘m5’、‘m6’、‘m7’、‘m8’、‘m9’、‘m10’
];
var\u数组=[
“w1”、“w2”、“w3”、“w4”、“w5”
];
var可用表格本轮=[];
var未满足的妇女=[];
//跑来跑去
函数启动\u round(){
console.log('START OF ROUND-------------------');
//在这一轮中设置可用的桌子
//每位女士一张桌子
可用的\u表\u此\u轮=女性\u阵列;
//选定表格
选择的var_表;
//为每个人寻找餐桌伙伴
men_数组.forEach(函数(项){
var current_man=项目;
//检查此用户是否记录了未满足要求的女性
if(未满足的女性[当前男性]=“未定义的”类型){
//未设置未满足的女性数组。正在设置。。。
未满足的女性[当前男性]=女性数组;
}
//循环查看可用的表以查看
//那些男人可以加入的人(还没有去过)。
对于(var i=0;i<可用的表\u此\u round.length;i++){
var current_woman=本轮可用表格[i];
//如果在可供选择的人群中没有遇到女性
如果($.inArray(当前女性,本轮可用桌子)!=-1){
所选表格=当前女性;
//从本轮可用的表格中删除表格
available_tables_this_round=$.grep(available_tables_this_round,函数(值){
返回值!=所选表格;
});
//让女人离开这个男人不满足的地方
未满足的女性[当前男性]=$.grep(未满足的女性[当前男性],函数(值){
返回值!=所选表格;
});
日志(当前人员,'>>>',选中的表格);
//退出循环,因为我们找到了一个匹配的人(这一轮!)
打破
}
}
});
console.log('END OF ROUND-------------------');
}
//按钮处理
$(文档)。在('单击','按钮#开始#循环_btn',开始#循环)上代码>
开始循环
您可以创建一个数组,如下所示:
var tables = men.map((element, index) => index < women.length ? [element, women[index]] : [element, "pause"]);
因此,您只需重新组合“nouvelles rencontres”的耦合即可。首先,您可以用暂停填充数组,并保持数组的相同长度。然后可以使用数组的叉积,在第一个数组上移位,并保留第二个数组的值
功能(a1、a2){
函数填充(a,l){
var p=l-a.长度;
a=a.切片();
while(p){
a、 拼接(p,0,'暂停'+p);
p--;
}
返回a;
}
var max=数学最大值(a2.长度,a1.长度);
a1=填充(a1,最大值);
a2=填充(a2,最大值);
返回a1.map(函数(1;,i){
返回a2.map(函数(b,j){
返回[a1[(i+j)%max],b];
});
});
}
日志(getSeating(['m1',m2',m3',m4',m5'],['w1',w2',w3']);
日志(getSeating(['m1',m2',m3'],['w1',w2',w3',w4',w5']);
日志(getSeating(['m1',m2',m3',m4',m5'],['w1',w2',w3',w4',w5']);
控制台日志(getSeating(['m1',m2',m3',m4',['w1',w2']);
log(getSeating(['m1','m2',['w1','w2','w3','w4']);
日志(getSeating(['m1',m2',m3',m4'],['w1',w2',w3',w4'])代码>
.as console wrapper{max height:100%!important;top:0;}
这里的主要问题是确保男性和女性都不会连续暂停两次
为了确保不会发生这种情况,可以考虑将“暂停桌”放在女性的桌子之间,直到你有足够的桌子让男性就座。这意味着在基于0的表编号中,这些“暂停表”获得奇数位置索引
当你把男人从一张桌子转到下一张桌子时,永远不会有男人连续两次“暂停”,但他们会在回到第一张桌子前遇到每一个女人
通过这种方法,当男性人数是女性的两倍以上时,问题显然没有解决办法。在这种情况下,不可避免地会让一个人按顺序暂停两次
当男性人数较少时,也可以使用类似的技巧:女性可能永远不会在一轮以上的比赛中独处,因此在这种情况下,采用相同的方法引入虚拟男性(“暂停坐姿”):将男性排成一行,然后注射到这个ro中
[ [ 'm1', 'w1' ],
[ 'm2', 'w2' ],
[ 'm3', 'w3' ],
[ 'm4', 'pause' ],
[ 'm5', 'pause' ]
]