这是一个优化问题。由于您不需要最佳解决方案,您可以尝试随机优化方法,例如Hill Climbing,其中您从随机解决方案(R 的随机子集)开始并查看相邻解决方案的集合(添加或删除当前解决方案的组成部分之一)对于那些具有各自成本函数更好的组件。
为了获得更好的解决方案,您还可以将模拟退火添加到您的爬山搜索中。这个想法是,在某些情况下,有必要转向一个更糟糕的解决方案,然后再找到一个更好的解决方案。模拟退火效果更好,因为它允许在工艺开始时采用更差的解决方案。随着过程的进行,该算法不太可能允许更差的解决方案。
我在这里粘贴了一些示例爬山 python 代码来解决您的问题:
https ://gist.github.com/921f398d61ad351ac3d6
在我的示例代码中,R
总是包含一个索引列表U
,我使用欧几里得距离来比较邻居之间的相似性。当然,您可以使用其他满足您自己需求的距离函数。还要在代码中注意,我正在快速找到邻居。如果您在 中有大量向量U
,您可能需要缓存预先计算的邻居,甚至考虑使用局部敏感散列以避免O(n^2)
比较。可以将模拟退火添加到上述代码中。
一次随机运行的结果如下所示。
我只使用了 20 个向量U
,S
=10,这样我就可以将结果与最优解进行比较。当没有更好的选择时,爬山过程在第 4 步停止,只替换一个 k 最近邻。
我还进行了详尽的搜索,迭代了所有可能的组合。可以看到,与穷举法相比,爬山的结果相当不错。只需 4 步即可获得相对较小的成本(尽管是局部最小值),这需要超过 82K 步的详尽搜索才能击败它。
initial R [1, 3, 4, 5, 6, 11, 13, 14, 15, 17]
hill-climbing cost at step 1: 91784
hill-climbing cost at step 2: 89574
hill-climbing cost at step 3: 88664
hill-climbing cost at step 4: 88503
exhaustive search cost at step 1: 94165
exhaustive search cost at step 2: 93888
exhaustive search cost at step 4: 93656
exhaustive search cost at step 5: 93274
exhaustive search cost at step 10: 92318
exhaustive search cost at step 44: 92089
exhaustive search cost at step 50: 91707
exhaustive search cost at step 84: 91561
exhaustive search cost at step 99: 91329
exhaustive search cost at step 105: 90947
exhaustive search cost at step 235: 90718
exhaustive search cost at step 255: 90357
exhaustive search cost at step 8657: 90271
exhaustive search cost at step 8691: 90129
exhaustive search cost at step 8694: 90048
exhaustive search cost at step 19637: 90021
exhaustive search cost at step 19733: 89854
exhaustive search cost at step 19782: 89622
exhaustive search cost at step 19802: 89261
exhaustive search cost at step 20097: 89032
exhaustive search cost at step 20131: 88890
exhaustive search cost at step 20134: 88809
exhaustive search cost at step 32122: 88804
exhaustive search cost at step 32125: 88723
exhaustive search cost at step 32156: 88581
exhaustive search cost at step 69336: 88506
exhaustive search cost at step 82628: 88420