c# - C# 中的模拟退火

标签 c# simulated-annealing

我正在使用模拟退火来解决密码分析问题,但我遇到了困难。我一生都无法让我的概率函数正确运行,它要么过于频繁地采用更糟糕的解决方案(所以我在 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/

相关文章:

python - 可以恢复到之前状态的数据结构

java - 使用 Android 应用程序使用模拟退火的最短路径

c# - 尝试使用 Hangfire 时的自引用循环

c# - 我如何动态初始化数组字符串

c++ - 具有实值最大化的模拟退火

c - 海合会表现

c++ - 单位球体 C++ 上 N 个相互排斥点的蒙特卡罗(可能是模拟退火?)方法

c# - 如何防止 Xamarin.Forms.Entry 键盘在按下按钮时失去焦点

c# - 如何使用自定义 JsonConverter 仅反序列化 Json.NET 中的子对象?

c# - 将音频转换为文本