我目前正在寻找一种算法,该算法将返回给定大小和范围的项目的最优组合(或至少一个最佳次优组合)(通常在50个项目中的10-15个项目之间,因此大约有几百万个可能性……)和一个评分函数,该函数将给出每个组合在过去的性能(函数优化需要在2MSEC和1秒之间运行,这取决于我选择的复杂性。
我的主要问题是,如果我必须测试所有可能的组合(我甚至不能将所有的组合可能性存储在一个列表列表中),就要处理迭代次数如果我不想耗尽内存,则必须使用生成器对每个评估执行此操作)。
不幸的是,对于某些函数,我不能使用基于迭代的所谓“遗传”算法(从2的最佳值,3的最佳值,…一篮子的N等等…在添加新项目时检查子篮子)。
这种算法速度很快,大多数时候都能得到很好的结果。
我已经尝试过模拟退火(scipy.basinhopping版本或自定义版本I编码),但是如果我在25-30之间超过15,每次迭代都会花费太多的时间,因为我无法在算法开始时存储所有的组合,而且每次评估都必须使用生成器此外,有时我并不真的满足于最佳的给定。
如果你有主意,建议或暗示,我会接受一切。如果你想看我的模拟退火函数,请尽管问我。
非常感谢你!

最佳答案

我知道你的问题没有一个最好的解决办法,但这里有一些建议:
分支和绑定(如果可以设计好绑定函数)
模拟退火(尝试不同的冷却速度和邻域大小)
蚁丘群(通常比SA效率低)
大都会(通常效率低于SA)
禁忌搜索(虽然没有太大的改进,但即使遇到困难也很好)
线性规划(如果问题可以用这些术语表述)
在一个真正困难的问题上结合多种技术也是很常见的。
还有一个python库实现了许多这些方法(以及许多其他方法),or-tools。不幸的是,它没有很好的记录
我认为模拟退火不需要一整套组合,因为它是一种局部搜索技术。在典型的场景中,生成一个新的状态(例如,向随机参数添加随机增量,或在问题空间的半径内选择一个随机点),然后使用概率公式决定是否接受此更改也就是说,它的优点之一就是占用的内存非常小

10-06 13:55
查看更多