在巨大的离散宇宙中寻找最优的算法

时间:2016-12-03 16:24:54

标签: python algorithm optimization combinations mathematical-optimization

我目前正在寻找能够返回给定大小和宇宙的最佳(或至少一个最佳次优)项目组合的算法(一般在50到50之间,所以大约有几百万十亿种可能性...)和一种评分函数,它给出了过去每种组合的性能(优化功能需要2毫秒到1秒才能运行,具体取决于我选择的复杂程度)。 对我来说,主要的问题是如果我必须测试所有可能的组合来处理迭代次数(我甚至无法将所有组合可能性存储在列表列表中......并且必须使用生成器为每个组合执行此操作评估,如果我不想耗尽内存)。 不幸的是,对于某些功能,我不能使用所谓的"遗传"基于迭代的算法(来自最好的2,最好的,3,...篮子的n等等......在添加新项目时对子篮子进行一些检查)。 这种类型的算法非常快,并且在大多数情况下都能提供相当好的结果。

我已经尝试过模拟退火(scipy.basinhopping版本或我编写的自定义版本),但如果我在25-30之间超过15,那么每次迭代需要花费太多时间,因为我无法在开始时存储所有组合算法并且必须使用生成器进行每次评估。而且,有时我对最佳给定并不满意。

如果你有想法,建议或暗示,我会采取一切。如果你想看看我的模拟退火函数,请不要犹豫,问我。

非常感谢!

1 个答案:

答案 0 :(得分:2)

我知道您的问题没有单一的最佳解决方案,但这里有一些建议:

  • 分支和绑定(如果你可以设计一个好的绑定函数)
  • 模拟退火(尝试不同的冷却速率和邻域尺寸)
  • 蚁丘殖民地(通常效率低于SA)
  • 大都市(通常效率低于SA)
  • 禁忌搜索(虽然没有很多改进,但即使对于难题也很好)
  • 线性规划(如果问题可以用这些术语表达)

在一个非常棘手的问题上结合几种技术也很常见。 还有一个python库实现了许多这些方法(以及许多其他方法),or-tools。不幸的是,它没有很好的记录

我认为你不需要模拟退火的全套组合,因为它是一种局部搜索技术。在典型情况下,您生成新状态(例如,通过向随机参数添加随机增量,或在问题空间中选择半径内的随机点),然后决定是否要使用随机点接受此更改概率公式。即它的一个优点是内存占用很小