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

Optimization 如何设计具有多种不同成本的模拟退火的接受概率函数?,optimization,np-complete,simulated-annealing,Optimization,Np Complete,Simulated Annealing,我用它来解决一个NP完全的资源调度问题。对于任务的每个候选顺序,我计算几个不同的成本(或能量值)。一些例子是(尽管细节可能与问题无关): global\u finish\u time:计划跨越的总天数 split_cost:由于其他任务的中断而导致每个任务延迟的天数(这是为了阻止任务启动后中断) 截止日期成本:每个错过的截止日期逾期天数的平方和 传统的接受概率函数如下所示(在Python中): def验收概率(旧成本、新成本、温度): 如果新成本我会考虑以下事情: If (new deadl

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

  • global\u finish\u time
    :计划跨越的总天数
  • split_cost
    :由于其他任务的中断而导致每个任务延迟的天数(这是为了阻止任务启动后中断)
  • 截止日期成本
    :每个错过的截止日期逾期天数的平方和
传统的接受概率函数如下所示(在Python中):

def验收概率(旧成本、新成本、温度):
如果新成本<旧成本:
返回1.0
其他:
返回math.exp((旧成本-新成本)/温度)
到目前为止,我只需简单地将前两个成本相加,就可以将结果输入到接受概率中。但我真正想要的是,
截止时间成本
始终优先于
全局完成时间
,而
全局完成时间
优先于
拆分成本

因此,我对堆栈溢出的问题是:我如何设计一个接受概率函数,它考虑了多种能量,但总是认为第一能量比第二能量更重要,依此类推?换句话说,我希望将
old_cost
new_cost
作为多个成本的元组传递,并返回一个合理的值

编辑:在对提议的解决方案进行了几天的试验后,我得出结论,对我来说,唯一有效的方法是迈克·邓拉维的建议,尽管这会给不同单位的成本构成带来许多其他困难。我几乎被迫把苹果和桔子作比较

因此,我在“规范化”这些值方面做了一些努力。首先,
deadline\u 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)。但我还没有试过。这取决于你所说的“优先”是什么意思。 例如,如果
截止时间成本
下降了0.001,但
全局完成时间成本却上升了10000,该怎么办?您是否返回1.0,因为
截止日期\u成本降低了,并且优先于任何其他成本?

这似乎是一个只有你能做出的判断,除非你能提供足够的背景信息,以便其他人能够提出他们自己的明智的判断。

< P>我会考虑以下事情:

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)
当然,计算概率的三个地方都可以使用不同的函数。

mbeckish是正确的

你能把不同的能量作一个线性组合,然后调整系数吗

可能会记录他们的进出


我用Metropolis Hastings做了一些MCMC。在这种情况下,我定义了特定状态的(非标准化)对数似然(给定其先验),我发现这是一种澄清我对我想要什么的想法的方法。

我将从多目标进化算法(MOEA)中得到一个提示如果所有目标同时通过你给出的
acceptance\u probability
函数,则进行转换。这将产生探索帕累托前沿的效果,就像标准模拟退火探索相同能量溶液的高原一样

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


您可能需要调整参数,例如给它一个更高的初始温度。

我想知道这是一个行业问题还是学术问题。重新考虑不是学术性的。我将此用作MS Project的替代方案。该程序的主要目标是使回答“您的团队何时可以将功能X添加到我们的软件中?”这一问题变得更加容易。我知道这个问题已经存在多年了,但对于通过谷歌在这一页面上偶然发现的其他人来说……在模糊逻辑中,加权和相当于逻辑OR,因此您实际上是在说“如果条件A或条件B等”。你到底想要什么
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)