我正在使用模拟退火来解决密码分析问题,但我遇到了困难。我一生都无法让我的概率函数正确运行,它要么过于频繁地采用更糟糕的解决方案(所以我在 0.03 和 0.2 的分数附近跳来跳去),要么不经常采用它(所以我陷入困境0.35)。我查遍了互联网,但我只遇到过一些例子,其中的问题涉及找到最小值......我的问题需要找到最大值,最差分数是 0,最好是 1。
我需要有关温度以及应该使用什么概率函数的建议。
最佳答案
关于 Wikipedia 的模拟退火文章提供了有关如何初始化和降低 SA 温度的一些一般指导。这些参数的有效选择通常是针对特定问题的,可能需要通过繁琐的反复试验来确定。
通常,优化算法会搜索目标函数的最小值。如果您想在最大化问题上按原样使用这样的算法,请要求优化器最小化目标函数的求反。例如,假设您要查找最大值的目标函数是f(x)=score
。然后,您应该请求优化器最小化 -f(x)
,即 -score
(或者,正如您在上面的评论中指出的那样,1-分数
)。
网上有很多模拟退火和其他全局优化算法,例如 this优化软件决策树上的列表。不幸的是,这些代码通常不是用 C# 编写的,但如果这些代码是用 Fortran 或 C 编写的,则通常很容易通过 P/Invoke 与这些代码进行交互。
如果您不要求优化器一定要找到全局最优值,还列出了一些无导数优化器 here 。这些代码中至少有一个有 C# 版本,即 BOBYQA (事实上,这个算法已经被我改编成C#了:-)。
关于c# - C# 中的模拟退火,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15408237/