好的,这是一个抽象的算法挑战,它将保持抽象,因为它是我要使用它的绝密。
假设我们有一组对象O = {o_1,...,o_N}和对称相似性矩阵S,其中s_ij是对象o_i和o_j的成对相关。
我们假设我们有一个具有离散位置的一维空间,可以放置物体(比如有一排N个盒子或人们有椅子)。
具有一定的位置,我们可以测量从一个物体的位置移动到另一个物体的位置的成本,作为我们需要经过的箱子的数量,直到我们达到我们的目标乘以它们的成对物体相似度。在该位置之后或之前从一个位置移动到该位置的成本为零。
想象一个例子,对于三个对象,我们有以下相似度矩阵:
1.0 0.5 0.8
S = 0.5 1.0 0.1
0.8 0.1 1.0
然后,树框中对象的最佳排序显然是:
[o_3] [o_1] [o_2]
此排序的成本是从一个对象移动到另一个对象的成本(计数框)的总和。所以这里我们只花费o_2和o_3之间的距离等于1box * 0.1sim = 0.1,相同如下:
[o_3] [o_1] [o_2]
另一方面:
[o_1] [o_2] [o_3]
费用=费用(o_1 - > o_3)= 1box * 0.8sim = 0.8。
目标是确定N个对象在可用位置的位置,以便最小化上述所有可能对象的总成本!
模拟是想象我们只有一排桌子和椅子(就像盒子一样),你需要让N个人坐在椅子上。现在那些人们有一些关系 - 小伙子说 - 他们中的一个人可能想要与另一个人说话。这是通过一些椅子站起来,并与那里的人说话。当人们坐在两个连续的椅子上时,他们不需要移动以便彼此交谈。
那么我们怎样才能将这些ppl放下来,以便使两个ppl之间的每个距离成本最小化。这意味着在夜间,客人走的总距离接近最小值。
贪婪的搜索是......好吧忘了! 我有兴趣听听是否存在这样的问题的标准公式,我可以找到一些文献,也可以找到不同的搜索方法(例如动态编程,禁忌搜索,模拟退火等来自组合优化领域)。
期待听到您的想法。
PS。我的问题与这个帖子Algorithm for ordering a list of Objects有一些共同点,但我认为这里的问题更好,可能略有不同。
答案 0 :(得分:1)
这听起来像是二次分配问题的一个例子。专业是因为这些地点只放在一条线上,但我认为这不会让它更容易解决。 QAP一般是NP难的。除非我误解了你的问题,否则你无法找到一个在多项式时间内解决问题的最优算法,而不会同时证明P = NP。
如果实例很小,您可以使用精确的方法,例如分支和绑定。如果问题更加困难,您还可以使用禁忌搜索或其他元编辑。我们在HeuristicLab中实现了QAP和一些元启发式。您可以在GUI中配置问题,只需将相似度和距离矩阵粘贴到适当的参数中即可。尝试从强大的禁忌搜索开始。这是一个较旧但仍然很好的算法。 Taillard在他的网站上也有它的C代码,如果你想自己实现它。我们的实现基于该代码。
有很多关于QAP的出版物。更现代的算法将遗传搜索能力与本地搜索启发式相结合(例如,来自StützleIIRC的遗传本地搜索)。
答案 1 :(得分:0)
让我用一种简单的排序方法帮助(我自己的)主题。
1。订购相似度矩阵的上半部分。
2。从具有最高相似权重的一对对象开始,并将它们放在中心位置。3。下一个对象可以放在它们的左侧或右侧。因此,每次您可以选择向左或向右放置的对象 预先放置的物体的成本最高。转到第2步。
选择第3步是因为如果您将此对象放置并稍后放置,则此成本将再次是剩余的最大值,甚至更多(远离预先放置的对象)。因此,昂贵的安置应该尽早完成。
这太简单了,当然也没有找到一个好的解决方案。
另一种方法是
1。以某种方式生成的完整排序开始(随机或来自其他算法)
2。尝试使用对象对的“交换”来改进它。
我相信当地最低限度将是一个巨大的威慑力量。
答案 2 :(得分:0)
以下是已发布方法的变体。我不认为这个是最佳的,但它可能是一个开始。
Create a list of all the pairs in descending cost order.
While list not empty:
Pop the head item from the list.
If neither element is in an existing group, create a new group containing
the pair.
If one element is in an existing group, add the other element to whichever
end puts it closer to the group member.
If both elements are in existing groups, combine them so as to minimize
the distance between the pair.
组合并可能要求组中的顺序颠倒,数据结构应该 旨在支持这一点。