我打算进行优化,在此过程中,我希望在受到某些时间限制和某些“必须满足这些路线”约束的情况下最大化系统中的流量。首次时间限制规定,每辆车的工作量不得超过24小时(以分钟表示)。第二个时间约束是子行程消除约束,该约束还指出,“访问”节点上的开始时间无法在车辆有时间行驶之前被激活,等等。约束3描述了K1和N1之间的路段不得超过9条次,使用任何车辆k。最后一个约束指出,来自特定节点的所有车辆都必须在一天结束时返回。
maximize maxamount: sum{i in V, j in V, k in K} x[i,j,k];
subject to TimeConstraint {k in K}:
sum{i in V, j in V} traveltime[i,j]*x[i,j,k] <= 1440;
subject to StartTime{i in V,j in V, k in K}:
starttime[i] + servicetime[i] +traveltime[i,j] - 1300 * (1 - x[i,j,k]) <= starttime[j];
subject to Constraint3:
sum{k in K} x["K1","N1",k] <= 9;
subject to EndNode{k in K}:
sum{i in V}x[i,"K1",k] - sum{j in V} x["K1",j,k]= 0;
Constraint3和EndNode具有多个相同类型的约束(仅对于其他“预定义位置”,例如K1和N2之间的道路不能超过4次访问,依此类推)。
我的问题是,我得到了错误不可能演绎边界x [K1,K1,1]的下限= 0,上限= -76,我知道这是由冲突约束引起的。但是我的问题是:如何?使用几乎排他的二进制变量,我看不到上面的代码为什么不起作用。我是否误解了我在模型中实际上正在做什么?
我注意到编译器仅在i = j时抱怨,所以我检查了.dat文件,并注意到当i = j很大时,i和j之间的行程时间(因此程序将不会选择那些路线)。但是,将.dat文件编辑为不再自动超过TimeConstraints限制仍然会给我同样的错误(虽然会减少,但现在的上限是-1而不是-76)。
我希望有人可以对此有所了解
在此先感谢Cenderze
当i = j很大时,i和j之间的旅行时间(因此程序将不会选择那些路线)
如果traveltime[i,j]
= M
(非常大),则StartTime
用于i=j
读取
servicetime[i] + M - 1300 * (1 - x[i,j,k]) <= 0 <=>
1300 * x[i,j,k] <= 1300 - servicetime[i] - M
因此,无论何时M > 1300 - servicetime[i]
,问题都是不可行的。
我建议用或(如果问题是对称的)用定义X
所有对的变量。(i,j)
i<>j
i < j
从评论中跟进
将以下代码片段插入AMPL在线编辑器后,效果很好:
param n := 10;
set N:= 1..n;
set V := {i in N, j in N: i <> j};
display V;
输出:
set V :=
(1,2) (2,3) (3,4) (4,5) (5,6) (6,7) (7,8) (8,9) (9,10)
(1,3) (2,4) (3,5) (4,6) (5,7) (6,8) (7,9) (8,10) (10,1)
(1,4) (2,5) (3,6) (4,7) (5,8) (6,9) (7,10) (9,1) (10,2)
(1,5) (2,6) (3,7) (4,8) (5,9) (6,10) (8,1) (9,2) (10,3)
(1,6) (2,7) (3,8) (4,9) (5,10) (7,1) (8,2) (9,3) (10,4)
(1,7) (2,8) (3,9) (4,10) (6,1) (7,2) (8,3) (9,4) (10,5)
(1,8) (2,9) (3,10) (5,1) (6,2) (7,3) (8,4) (9,5) (10,6)
(1,9) (2,10) (4,1) (5,2) (6,3) (7,4) (8,5) (9,6) (10,7)
(1,10) (3,1) (4,2) (5,3) (6,4) (7,5) (8,6) (9,7) (10,8)
(2,1) (3,2) (4,3) (5,4) (6,5) (7,6) (8,7) (9,8) (10,9);
== 1 ==========================
将您的代码段更改为
set N = {'K1', 'K2','K3','K4'};
set V := {i in N, j in N: i != j};
display V
放手一搏。我得到:
set V :=
(K1,K2) (K1,K4) (K2,K3) (K3,K1) (K3,K4) (K4,K2)
(K1,K3) (K2,K1) (K2,K4) (K3,K2) (K4,K1) (K4,K3);
== 1 ==========================
我希望这有帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句