|
|
1
3
欢迎来到多目标优化领域。这是我写论文的领域。求解这类问题的算法有很多,但最著名的两个可能是NSGA-II和SPEA2。
我可以指给你看吗 http://jmetalnet.sourceforge.net/ ? 其思想是,您将生成包含输入的随机向量的总体,这些输入在您的100^6个可能解的域中。这些种群将发生变异并相互交配,以产生新的解决方案,从这些新种群中,它们被向下选择,从而选择更偏好的解决方案保留下来(并在进化中幸存下来)。 在多世界中,比较不同解决方案的适用性可能会遇到挑战。但在你的单目标世界中,比较适合度很容易:你只需要决定你想要更高还是更低的数字。看起来你想要更高的。 概述
结果:
结果格式为之前、之后的平均分数,最大值为600
PopSize=10000,NumGens=500,MutRate=0.2,CrossRate=0.8
我在大约20分钟内编写了这段代码,所以它并不意味着优雅或令人敬畏。我希望它能让人明白这一点。
其他注释您的运行时间主要取决于您的健身评分函数。对于简单的数学函数,此运行时并不困难。显然,如果涉及到一个过程,那么您应该将评估的数量保持在最低限度。这就是我在攻读博士学位时研究的内容,并开发了一种新算法,名为GALE: |
|
|
2
2
您可以尝试使用元启发式/随机局部搜索算法来解决这类问题,如许多评论和BurnsCA的解决方案中所述。 模拟退火和遗传算法都是例子,但还有更多例子。 这种方法是否可行,取决于计算目标函数变化的速度,即评估解决方案的质量及其变化。 如果模拟的输出具有微小变化会显著改变结果的特性,那么它可能是也可能不是比暴力强制通过一些随机分配并选择最佳分配更好的方法。你必须进行实验。
http://www.centerspace.net/doc/NMath/user/simulated-annealing-85273.htm 您的“目标函数”,即您试图最大化(或最小化)的值是模拟的输出。 虽然算法本身的实现并不困难,但它们的各个方面的高效实现都很重要。 你需要做的是定义一个邻域函数,即从解(或状态,如果你喜欢)到另一个解的一种方式。 一 参数如果1-opt没有足够快地显示改进,您也可以尝试2-opt移动或更多。 如果可能的话 最简单的方法(通常称为下降法)是随机移动到相邻的解决方案,如果它发现了更好的(在您的情况下更高的目标函数)值,则将其作为新的解决方案,然后重复该步骤,直到找不到更多的改进。 这种方法的问题是,你很快就会陷入局部极大值。模拟退火提供了一种试图避免这种情况的方法,它不仅选择改进,而且选择非改进动作的概率取决于当前的“温度”,这只是一个变量,您可以根据一些规则减少每次迭代 退火计划 由于实现这些方法的关键不在于整体算法本身(尽管它确实需要一点时间),而在于实现您的邻域和邻域评估函数,我个人认为使用一些框架不会节省很多时间。 如果这是一次性的,而上述方法不可行,您也可以考虑跨数千台机器并行计算,以获得最优解。E、 g.Azure Batch或类似服务。由于您可以在30分钟内测试50 mio组合(在一台机器上,无需并行化?),原则上,您可以提供20000台虚拟机,并在30分钟内测试所有组合。 |
|
|
3
1
上述方法很快收敛到一个解,主要是因为计算函数非常友好。500次迭代后:
最优解决方案是
注意,这种局部优化方法只适用于大多数线性问题。
有一个 nifty image 在维基百科页面上 hill climbing 这种算法显示了这种方法的本质。 |