我的数据是人与爱好,有多对多的关系.
每个人至少有一个爱好.
我需要找到一种方法来安排N座位桌周围的所有人,这样每个桌子上的人之间就有最多的共享爱好.并不要求每个桌子在其周围的所有人之间至少有一个共享的爱好.
此外,表格不一定必须完全填写.
任何想法将不胜感激.
最佳答案 首先,这是一个NP难问题 – 例如,任何可以解决您的问题的算法,都可以解决加权图的
Longest Path问题,如下所示:
>每个图形顶点都是一个人
>可以通过创建新的爱好来编码图的任何边缘,仅由边缘的两个顶点/人共享
(对于NP完全问题,可能会有一个更简单的减少,但我想这会做到).
Skiena建议Simulated Annealing,从任何安排开始,并做出随机选择.诀窍是逐渐降低你接受恶化变化的可能性(因此,在开始时你允许它有一些自由来避免局部最优,但逐渐地“冷却”并在某个区域稳定并进行小的改进).您也可以多次运行它并保持最佳解决方案.
你可以用同样的精神手工编写不太复杂的东西.我猜你的问题实例会很小,所以如果你尝试其中很多(并试着随机改进它们),你一定会找到好的解决方案.
当然,如果您的问题非常小,您可以只列举所有排列并找到最佳排列. (如果你有n个人,请确保你确定某个人的位置,并且只为n – 1个人生成排列).