Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两组大小不同的成员必须见面(1v1,一次)_Javascript_Jquery_Algorithm - Fatal编程技术网

Javascript 两组大小不同的成员必须见面(1v1,一次)

Javascript 两组大小不同的成员必须见面(1v1,一次),javascript,jquery,algorithm,Javascript,Jquery,Algorithm,我最近一直在努力写一种“速配风格”的算法。基本目标是让一组中的每个成员(男性)与另一组中的每个成员(女性)在他们的餐桌上会面一次 条件是: 桌子的数量与妇女的数量相等 每个男人都被分配到一张有女人坐的桌子上(1v1对话) 在下一轮比赛中,每个人都换到了一张他从未去过的桌子上 如果小组规模不同,则任何成员(男性或女性)不得连续两轮暂停(缺少搭档) 当男性群体的成员多于女性群体时,就会出现困难,反之亦然 例如: var men = [ 'm1', 'm2', 'm3', 'm4', 'm

我最近一直在努力写一种“速配风格”的算法。基本目标是让一组中的每个成员(男性)与另一组中的每个成员(女性)在他们的餐桌上会面一次

条件是:

  • 桌子的数量与妇女的数量相等
  • 每个男人都被分配到一张有女人坐的桌子上(1v1对话)
  • 在下一轮比赛中,每个人都换到了一张他从未去过的桌子上
  • 如果小组规模不同,则任何成员(男性或女性)不得连续两轮暂停(缺少搭档)
  • 当男性群体的成员多于女性群体时,就会出现困难,反之亦然

    例如:

    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' ] 
    ]