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

标签 python algorithm optimization combinations mathematical-optimization

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

我已经尝试过模拟退火(scipy.basinhopping 版本或我编写的自定义版本)但是如果我在 25-30 中超过 15 个,每次迭代都会花费太多时间,因为我无法在开始时存储所有组合算法并且必须为每个评估使用生成器。此外,有时我对给出的最佳方案并不真正满意。

如果您有想法、建议或提示,我会全力以赴。如果您想查看我的模拟退火函数,请随时问我。

非常感谢!

最佳答案

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

  • 分支定界(如果你能设计好的定界函数)
  • 模拟退火(尝试不同的冷却率和邻域大小)
  • 蚁丘群(通常效率低于 SA)
  • 大都市(通常效率低于 SA)
  • 禁忌搜索(不会带来很大的改进,但即使对于难题也有好处)
  • 线性规划(如果问题可以用这些术语来表述)

将多种技术结合起来解决一个非常困难的问题也很常见。 还有一个 python 库实现了许多这些方法(以及许多其他方法),or-tools .不幸的是,它没有很好的记录

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

关于python - 在巨大的离散宇宙中寻找最优值的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949900/

相关文章:

python - 从时间列中提取小时分量

python - 为什么 tkinter 比例小部件需要 tkinter 变量

r - 加快查找过程

c++ - 优化直方图更新

python - 贝塞尔函数(来自 scipy.special)可以与 Numba 一起使用吗

python - 在 Django 的 Queryset 中过滤 django-taggit 的标签

python - 我应该使用 numpy 的随机生成器吗?

c# - 复杂物体的体积

java - 适用于这种特定情况的最佳数据结构和排序算法

c++ - 流布局面板的算法?