【问题标题】:How to use Simulated Annealing in R (GenSA) for a function with discrete variables with a few options without pattern?如何将 R (GenSA) 中的模拟退火用于具有离散变量的函数,该函数具有一些没有模式的选项?
【发布时间】:2025-12-22 06:00:11
【问题描述】:

我想使用模拟退火。我的目标函数存在多个变量,其中一些变量只有几个可能的选项。我在这里的 Stack 上看到了同样的问题: How to use simulated annealing for a function with discrete paremeters?,但没有答案,只能参考:How to put mathematical constraints with GenSA function in R

我不明白如何将第二个链接中的建议应用于我的情况(但我认为可以在那里找到答案)。

例如:

v <- c(50, 50, 25, 25)
lower <- c(0,0,0,20)
upper <- c(100,100,50,40)
out <- GenSA(v, lower = lower, upper = upper, fn = efficientFunction)

假设第四个参数 v[4] 只能在 {20,25,30,35,40} 中。他们建议使用拉格朗日乘数,因此,我想的是:lambda * ceil(v[4] / 5)。这是一个好主意吗 ?

但是我能做什么呢?变量的样本空间没有很好的模式,例如第三个参数 v[3],只能在 {0,21,33,89,100} 中。我不明白为什么拉格朗日乘数可以在这种情况下提供帮助。我是否需要使参数的形式不同于它们遵循某种模式,还是有其他选择?

如果拉格朗日乘数是唯一的选择,我将在我的目标中得到 8 个这些公式。在我看来,还有另一种选择,但我不知道如何!

提前致以诚挚的问候和感谢, 罗斯

【问题讨论】:

    标签: r discrete-mathematics simulated-annealing


    【解决方案1】:

    使用 SA,您可以从一个非常简单的社区方案开始,

    选择 1 个参数,并通过选择一个新的有效设置来更改它,高于 1 个,或低于当前设置 1 个(我们假设它们有一个订单,就像我觉得是你的情况一样)。

    据我所知,SA 中不涉及拉格朗日乘数。但是有很多变体,可能有些变体带有约束或其他使用它们。

    【讨论】:

    • 这听起来可以解决我的问题。但我目前在 R 中使用包 GenSA。你的方法在这个包中可行吗?我不确定我是否可以预先拥有邻里计划。 (因此我的解决方案是关于拉格朗日乘数,以强制执行此操作。)
    • 您是否受限于仅使用 GenSA ?因为还有其他的包。您也可以编写自己的 SA 方案。