c#中的模拟退火

本文关键字:模拟退火 | 更新日期: 2023-09-27 18:03:47

我正在使用模拟退火来解决密码分析问题,但我遇到了瓶颈。我一辈子都无法让我的概率函数正确运行,要么它经常使用更糟糕的解决方案(所以我的得分在0.03和0.2之间波动),要么它使用的次数不够多(所以我的得分停留在0.35)。我在互联网上看了看,但我只遇到了一些例子,其中的问题涉及找到最小值....我的问题需要找到最大值,最差分数是0,最好是1。

我需要关于温度和我应该使用什么概率函数的建议

c#中的模拟退火

维基百科上的模拟退火文章提供了一些关于如何初始化和降低SA温度的一般指导。这些参数的有效选择通常是非常具体的问题,可能需要通过繁琐的试错来确定。

通常,优化算法搜索目标函数的最小值。如果您想在最大化问题上使用这样的算法,请要求优化器最小化目标函数的负值。例如,假设您想要找到最大值的目标函数是f(x)=score。然后,您应该请求优化器最小化 -f(x),即-score(或者,正如您在上面的评论中指出的,1-score)。

网上有很多模拟退火和其他全局优化算法,例如,可以参见优化软件决策树上的这个列表。不幸的是,这些代码通常不是用c#编写的,但如果代码是用Fortran或C编写的,那么通过P/Invoke与这些代码进行接口通常是相当容易的。

如果您不要求优化器一定要找到全局最优,这里也列出了一些无导数的优化器。这些代码中至少有一个在c#版本中可用,即BOBYQA(实际上,该算法已被我改编为c#:-)。