我试图根据某些限制在一周内安排一定数量的事件,并希望在整个一周内尽可能均匀地分散这些事件。
如果我将事件之间间隔的标准偏差添加到目标函数,则CPLEX可以将其最小化。
我正在努力根据CPLEX表达式定义区间的标准偏差,主要是因为事件不必是任何特定的序列,并且我不知道哪个事件优先于任何其他事件。
我确信这一定是一个已解决的问题,但我无法在IBM的cplex文档或互联网上找到帮助。
答案 0 :(得分:1)
安排统一间隔事件
这里有一些可能的想法供您尝试:
让t0
,t1
,t2
,t3
... tn
成为活动时间。 (这些是模型选择的变量。)
允许d1 = t1-t0
,d2=t2-t1
等...... dn
。
目标:我们希望所有这些d
大致相等,这样可以大致均匀地隔开t
。
我们举一个例子。让我们假设您想要在一周内安排10个事件(168小时)。除了以外没有其他约束 等间距,我们可以让第一个事件在时间= 0开始,最后一个事件在时间t = 168结束。其他人将是168 /(10-9)= ~18.6小时。让我们称之为d_ideal。
我们不希望d比d_ideal(18.6)小得多,或者比d_ideal大得多。
即,在目标中,添加Cost_dev * (abs(d_ideal - dj))
(您必须为每个d
(d+
和d-
创建两个变量来处理目标函数中的绝对值。)
在上述方法中,所有偏差的定价都相同。因此,如果模型偏离3小时或两个偏差,模型就无需关心 每个1.5小时。处理这种情况的方法是增加逐步成本。小偏差的成本很低,高偏差的成本非常高。 (你使它们逐步线性化,使配方保持LP / IP)
这是你最小化标准。 d的想法的偏差。我们希望最大化每个d(增加事件间分离。) 但我们也会极大地惩罚(大成本)特定的d值,这是最大的。 (在英语中,我们不想让 任何单一的d太大了)
这是MinMax的想法。 (最小化最大d值,但也最大化个别d)
对越来越多的这些侧面约束进行分层的一个缺点是配方变得复杂。 为了解决这个问题,我已经看过两次(或更多次)传球。首先解决基本LP,分配事件然后再分配给另一个 LP,你解决了统一分配时间的问题。
第二个LP的目标是在不破坏任何硬约束的情况下移动事件。
选项3a :从众多"副本中选择一个"
为实现这一目标,我们使用以下想法:
我们允许一个事件有多个可能的时隙,并让模型选择一个。 事件e1(当前分配给时间t1)被复制到(例如)3个其他可能的插槽中。
e11 + e12 + e13 + e14 = 1
第二种模式可以选择将事件移动到更好的"时间段,或留下它。 (旧的解决方案 总是可行的。)
您在CPLEX手册中没有看到太多的原因是这些都是配方创意。如果您搜索作业或事件安排 使用LP,您会看到一些有用的PDF格式。
希望这有帮助。