如何设计具有多个不同成本的模拟退火的接受概率函数?

时间:2009-07-09 14:33:20

标签: optimization np-complete simulated-annealing

我正在使用simulated annealing来解决NP完全资源调度问题。对于任务的每个候选顺序,我计算几个不同的成本(或能量值)。一些例子(尽管细节可能与问题无关):

  • global_finish_time:时间表跨越的总天数。
  • split_cost:由于其他任务中断而导致每项任务延迟的天数(这是为了阻止任务启动后中断)。
  • deadline_cost:每个错过截止日期的平方天数总和。

传统的接受概率函数看起来像这样(在Python中):

def acceptance_probability(old_cost, new_cost, temperature):
    if new_cost < old_cost:
        return 1.0
    else:
        return math.exp((old_cost - new_cost) / temperature)

到目前为止,我已将前两个成本合并为一个,只需添加它们,以便我可以将结果输入acceptance_probability。但我真正想要的是deadline_cost始终优先于global_finish_time,而global_finish_time优先于split_cost

所以我对Stack Overflow的问题是:我如何设计一个考虑多个能量的接受概率函数,但总是认为第一个能量比第二个能量更重要,依此类推?换句话说,我想传递old_costnew_cost作为几个成本的元组并返回合理的价值。

编辑经过几天试验提出的解决方案后,我得出的结论是,对我来说唯一合适的方法是Mike Dunlavey的建议,尽管这会给成本组件带来许多其他困难有不同的单位。我实际上被迫将苹果与橙子进行比较。

所以,我付出了一些努力来“规范化”价值观。首先,deadline_cost是平方和,因此它呈指数增长,而其他组件线性增长。为了解决这个问题,我使用平方根来获得类似的增长率。其次,我开发了一个函数来计算成本的线性组合,但是根据到目前为止看到的最高成本组件自动调整系数。

例如,如果最高成本的元组是(A,B,C)并且输入成本向量是(x,y,z),则线性组合是BCx + Cy + z。这样,无论z有多高,它都不会比x值为1更重要。

这会在成本函数中产生“锯齿”,因为会发现新的最高成本。例如,如果C上升,那么对于给定的(x,y,z)输入,BCx和Cy都将更高,因此成本之间的差异也会更高。较高的成本差异意味着接受概率将下降,就好像温度突然降低一个额外的步骤。在实践中虽然这不是问题,因为最大成本在开始时只更新几次而且以后不会更改。我相信这甚至可以在理论上证明收敛到正确的结果,因为我们知道成本会收敛到较低的值。

让我感到有些困惑的一件事是当最高成本为1.0且更低时,例如0.5,会发生什么。利用(0.5,0.5,0.5)的最大向量,这将给出线性组合0.5 * 0.5 * x + 0.5 * y + z,即优先顺序突然反转。我想处理它的最好方法是使用最大向量来将所有值缩放到给定范围,这样系数总是可以相同(例如,100x + 10y + z)。但我还没有尝试过。

4 个答案:

答案 0 :(得分:2)

mbeckish是对的。

你可以对不同的能量进行线性组合,并调整系数吗?

可能会将它们进行日志转换吗?

我使用Metropolis-Hastings完成了一些MCMC。在那种情况下,我正在定义一个特定状态的(非标准化的)对数似然性(鉴于它的先验),我发现这是一种澄清我对我想要的想法的方法。

答案 1 :(得分:1)

我会考虑以下几点:

If (new deadline_cost > old deadline_cost)
  return (calculate probability)

else if (new global finish time > old global finish time)
  return (calculate probability)

else if (new split cost > old split cost)
  return (calculate probability)

else 
  return (1.0)

当然,你计算概率的三个地方中的每一个都可以使用不同的函数。

答案 2 :(得分:1)

我会从多目标进化算法(MOEA)中得到一个提示,并且如果所有目标同时通过您给出的acceptance_probability函数,则会进行转换。这将有助于探索帕累托前沿,就像标准模拟退火探索相同能量解决方案的平台一样。

然而,这确实放弃了让第一个优先考虑的想法。

您可能需要调整参数,例如为其提供更高的初始温度。

答案 3 :(得分:0)

这取决于你的意思是“优先”。 例如,如果deadline_cost下降0.001,但global_finish_time成本上升10000,该怎么办?你是否返回1.0,因为deadline_cost减少了,并且优先于其他任何东西? 这似乎是一个只有你能做出的判断电话,除非你能提供足够的项目背景信息,以便其他人可以建议他们自己明智的判断电话。