Algorithm 是一个常见的图问题,具有众所周知的解决方案

Algorithm 是一个常见的图问题,具有众所周知的解决方案,algorithm,data-structures,Algorithm,Data Structures,在这一点上我们可以说的一件事是,在某些情况下可能没有解决方案(您必须重做以前的一些对) 也可以简单地考虑对偶图(顶点和节点的交换作用:节点是对和对顶点之间的公共个体)。< /P> < P>有两种排序方法吗?如果是这样,您可以通过始终以相同的方式对一对进行排序,在每次迭代中节省一个(可能只有一半)哈希探测。因此,如果有A、B、C和D,那么生成的可能对将是[AB,CD][AC,BD]或[AD,BC] 然后我会这样做: pair_everyone (pool, pairs, history): i

在这一点上我们可以说的一件事是,在某些情况下可能没有解决方案(您必须重做以前的一些对)


也可以简单地考虑对偶图(顶点和节点的交换作用:节点是对和对顶点之间的公共个体)。< /P> < P>有两种排序方法吗?如果是这样,您可以通过始终以相同的方式对一对进行排序,在每次迭代中节省一个(可能只有一半)哈希探测。因此,如果有A、B、C和D,那么生成的可能对将是[AB,CD][AC,BD]或[AD,BC]

然后我会这样做:

pair_everyone (pool, pairs, history):
  if pool is empty:
    all done, update global history, return pairs

  repeat for pool_size/2:
    pick element1 (randomly from pool)
    pick element2 (randomly from pool)
    set pair=pair(e1, e2)
    until pair not in history or all possible pairs tried:
      pick element1 (randomly from pool)
      pick element2 (randomly from pool)
      set pair=pair(e1, e2)

    if pair is not in history:
      result=pair_everyone(pool-e1-e2, pairs+pair, history+pair)
      if result != failure:
        return result
    else:
      return failure

你还需要考虑的是,对于一组中的前几个人来说,选择特定的配对可能会导致剩余的不可能完成的情况。什么是合理的最大池大小?可能处理200到300个人。@ Jeriko,这正是我的问题……我怎么知道我什么时候到了这一点?即使留下一组无法配对的个体,其中一些个体也可以与已经在“配对”列表中的成员配对。这会把个人撞回未配对的池中。好的但这可以建立一个无限循环。。。我是否有一个计数器,循环次数最多?几天前发布了一篇文章,它解决了这个问题,并推广到任何大小的子集-请查看。这听起来不是一个有效的方法,并且缺少详细信息。如何随着时间的推移,随着个人信息库的变化(一些增加,一些删除),生成此列表。一般来说,池会增长。n有多大?保持配对的规范化形式(强制所有配对从(b,a)到(a,b)->先减小)。将这些数据存储在平衡的数据结构中应该很容易。将个人列表保存在单独的结构中。使用构造性算法构建您的配对集。从1个个体的池中,如何在添加下一个个体时添加配对?如果有2个人,如何为第3个人添加配对?个人列表最多可能在200-300左右。我了解如何形成随机配对,并对照历史进行检查。如果一对已经匹配,我可以从列表中选择一个新的个体。我不确定的是如何处理这样一种情况,即我只有一个人,而所有剩余的可能配对在过去都已匹配。我猜@paintcan建议可能会以上对角矩阵的形式实现,以True或False为元素。您可以根据人口的变化删除或添加行/列对。如果性能是一个问题,您可以在计数器中保留为一行形成的最后一对,在删除时仔细更新它(没有真正的随机配对需要)@Andrew Robinson:“我不确定的是如何…”请更新您的问题以强调这一点。这对于理解你真正的要求是至关重要的。如果个体列表随时间变化,此算法仍能正常工作,您只需使用更新的列表在步骤2中选择两个个体“退出循环”意味着确定配对是否可行。这看起来需要枚举所有可能的配对,很像@paintcan解决方案。我不确定这是不是一个进步。我推荐的跳出循环的方法是计算迭代次数,如果迭代次数高于某个合理的阈值(如1000)。@S.Lott),则跳出循环。我不会费心检查是否所有可能的配对都已测试。1000次迭代应该可以工作,直到99%以上的所有可能的配对都用尽。此时,如果您愿意,您可以开始对配对进行彻底搜索。一般来说,这是一个可行的解决方案,但一旦可能的配对池耗尽,剩余的一些未配对个体仍可能与已经配对的成员配对(并且已经配对的伙伴将必须重新加入)(交换)未配对个体的池。通常是一个可行的解决方案,但一旦可能的配对池耗尽,剩余的一些未配对个体仍可能与已经配对的成员配对(并且已经配对的伙伴必须重新加入(交换)未配对个体的池。
如果PP为空
步骤尝试通过将池中没有可能的伙伴的个体与池中仍有可能匹配的个体进行交换来解决此问题,该个体与a的可能伙伴进行配对。这应该找到所有可能的组合,并仅将那些保留在池中“他们的历史相当于一个完整的合作伙伴库。”安德鲁·罗宾逊在第3步中补充了一些解释。附言。如果你想在仍然有大量未使用的配对的常见情况下得到一个非常快的结果,请将此与我的另一个答案的少量迭代结合起来。
pair_everyone (pool, pairs, history):
  if pool is empty:
    all done, update global history, return pairs

  repeat for pool_size/2:
    pick element1 (randomly from pool)
    pick element2 (randomly from pool)
    set pair=pair(e1, e2)
    until pair not in history or all possible pairs tried:
      pick element1 (randomly from pool)
      pick element2 (randomly from pool)
      set pair=pair(e1, e2)

    if pair is not in history:
      result=pair_everyone(pool-e1-e2, pairs+pair, history+pair)
      if result != failure:
        return result
    else:
      return failure