AMPL中不可能推导出的上界
我打算进行优化,我希望最大化系统中受某些时间限制和一些“这些路径必须满足”的限制条件下的流量。第一次约束规定每辆车不得超过24小时的工作量(以分钟表示)。第二个时间约束是一个子转移消除约束条件,该约束条件还规定,在“访问”节点的起始时间在车辆有时间行驶之前不能被激活。约束3描述了K1和N1之间的道路必须不超过9次数,使用任何车辆k。最后一个约束规定,来自特定节点的所有车辆必须在一天结束时返回。AMPL中不可能推导出的上界
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和终端节点具有相同类型的几个约束(只是与其他“预定位置”,诸如例如K1和N2之间的道路不能超过4次参观等)。
我的问题是,我得到的错误不可能的推论范围x [K1,K1,1]具有下界= 0和上界= -76,我已经理解源于冲突约束。但是我的问题是:如何?使用几乎完全是二进制变量,我不明白为什么上面的代码不起作用。我误解了我在模型中实际做了什么?
我注意到编译器只会抱怨当我= j,所以我检查了我的.dat文件,并注意到我和j之间的旅行时,当我= 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]
,问题是不可行的。
我建议界定所有对(i,j)
与i<>j
,或者(如果该问题是对称的)与i < j
的X
变量。
从评论跟进,在插入时
下面的代码片段行之有效的AMPL Online Editor:
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 ==========================
我希望这有助于!
非常感谢您的意见! 我一直在寻找如何定义X,以避免使用I = j的,使用在[链接](http://myweb.clemson.edu/~pbelott/bulk/teaching/mthsc440/flows+networks的例子。 pdf)它说,可以写 设置V:= 1..n; 集合A在{i中的V,j中的V:i!= j}; 但是,这给出了一个错误(关于“{”)。你知道一个人是否可以在另一个问题上获得所需要的吗? – Cenderze 2014-09-25 07:33:39
你是否将'n'声明为参数?如果你用'='改变'within'会发生什么? – Ioannis 2014-09-25 11:17:11
使用两个 设置N:='K1','K2','K3','K4'; set V:= {i in N,j in N:i!= j}; 并设置V = {i in N,j in N:i!= j}; 会产生相同的错误,即编译器不具有{它在哪里。奇怪,因为我看到与之前链接中提供的代码没有区别。 – Cenderze 2014-09-25 14:23:58