【问题标题】:Simulated Annealing in C#C# 中的模拟退火
【发布时间】:2013-03-14 11:40:02
【问题描述】:

我正在使用模拟退火来解决密码分析问题,但我遇到了难题。我一辈子都无法让我的概率函数正确运行,它要么过于频繁地采用更差的解决方案(所以我在 0.03 和 0.2 的分数附近反弹)或者它不经常采用它(所以我被困在0.35)。我浏览了互联网,但我只遇到了问题涉及找到最小值的示例......我的问题需要找到最大值,最差分数是 0,最好是 1。

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

【问题讨论】:

  • 如果您想使用最小化算法找到最大值,只需否定您的目标函数,即 max f(x) => min -f(x)
  • 我确定这很有帮助,但我不确定我是否理解,你能给我举个例子吗?
  • 通常,优化算法搜索目标函数的最小值。如果您想在最大化问题上使用这样的算法,请让优化器最小化您的目标函数的否定。例如,假设您要为其找到最大值 的目标函数是f(x)=1-(x-1)^2。然后,让优化器最小化 -f(x)。顺便说一句,修剪 SA 算法可能很乏味。 SA 是您唯一的选择,还是其他无导数优化算法也可以?
  • 我想我现在可能正在这样做,概率函数现在类似于 Math.Exp(-((1-score)-(1-bestScore))/temperature) 通过从 1 中获取分数我想我正在把它变成最小化,是吗?
  • 如果您的目标是最大化 score 那么是的,在最小化算法中应用1-score 似乎是合理的。 Here 是一些全局优化选项,尽管我不确定是否有任何代码是用 C# 编写的。 Here 是一个无梯度算法列表,它们不一定关心寻找全局最优值。至少其中之一,BOBYQA,在C# 中可用(我改编为 C# :-)

标签: c# simulated-annealing


【解决方案1】:

Wikipedia 上的模拟退火文章提供了一些关于如何初始化和降低 SA 温度的一般指导。这些参数的有效选择通常是针对特定问题的,可能需要通过繁琐的反复试验来确定。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多