routing - opl 无法在位置路由问题中提取 CPLEX 中的表达式
问题描述
当我在 CPLEX 中运行代码时,对于 dexpr 和第一个约束,我收到此错误“opl 无法提取表达式”。这个错误背后的原因是什么?我该如何解决?如果你能帮助我,我会很高兴的。
dexpr 得到错误“OPL 无法提取表达式 X[]*Ok[k]”:dexpr float fromdepot=sum(m in M, j in C, k in K) X[]*Ok[k];
并且我得到的错误是:OPL 无法提取表达式 X[] 并索引数组“x”:<1,4,1> 对于第一个约束:forall (j in C) ct1b: sum (k in K, i 在 V: i!=j) X[]==1;
我的代码如下:
//depot
int m=...;
range M=1..m;
//customer
int n=...;
range C=m+1..m+n; //mulai dari 4-11
int c=...;
range V=1..c;
//vehicle
int k=...;
range K=1..k;
int q=...; //vehicle capacity
int U=...;//limits the number of vehicle u
//operating cost between pairs of depots and customers
tuple Cij{
int i;
int j;
}
setof (Cij) operatingcost={<i,j> | i,j in C: i!=j};//diganti
//tuple route
tuple xijk{
int i;
int j;
int k;
}
setof (xijk) route={<i,j,k> | i,j in C: i!=j, k in K};
float fm[M]=...;
float cij[operatingcost]=...;
float di[C]=...;
float Ok[K]=...;
float Qm[M]=...;
//decision variable
dvar boolean X[route];
dvar boolean Y[M];
dexpr float depotestablish=sum(m in M) fm[m]*Y[m];
dexpr float fromdepot=sum(m in M, j in C, k in K) X[<m,j,k>]*Ok[k];
dexpr float travelcost=sum(i,j in C: i!=j, k in K) cij[<i,j>]*X[<i,j,k>];
//objective functions:
minimize (depotestablish+fromdepot+travelcost);
subject to{
forall (j in C)
ct1b: sum (k in K, i in V: i!=j && <i,j,k> in route) X[<i,j,k>]==1;
forall (i in C)
ct1: sum (k in K, j in V: j!=i && <i,j,k> in route) X[<i,j,k>]==1;
forall (m in M, k in K)
ct2: sum (j in V: j!=m && <m,j,k> in route) X[<m,j,k>] == 1;
forall (m in M, k in K)
ct3: sum (i in V: i!=m && <i,m,k> in route) X[<i,m,k>] == 1;
forall (h in V, k in K)
ct4: sum(i in V: i!=h && <i,h,k> in route) X[<i,h,k>] - sum (j in V: j!=h&& <h,j,k> in route) X[<h,j,k>]==0 ;
forall (k in K)
ct5: sum(i in C) di[i]*sum(j in V: j!=i&& <i,j,k> in route) X[<i,j,k>]<= q;
forall (m in M)
ct6: sum(k in K, i in C) di[i]*sum(j in V: j!=i&& <i,j,k> in route) X[<i,j,k>]==Qm[m]*Y[m];
ct7: sum (m in M, j in C, k in K:<m,j,k> in route) X[<m,j,k>]-U==0;
}
DATA:
n=8; //customer
k=4; //vehicle
m=3; //depot
c=11;
q=400;
U=4;
Qm=[534 534 534];
Ok=[2000 2000 2000 2000];
fm=[150000000, 150000000, 150000000];
cij=[3 40 20 60 50 786 54 627 29 29
30 20 21 14 40 28 5 631 23 23
4 5 40 89 28 288 9 947 96 96
627 29 54 12 288 937 104 786 97 97
631 23 5 631 937 282 85 28 53 53
947 96 9 947 96 104];
di=[200 250 150 170 225 180 220 200];
the result:
OPL cannot extract expression: X[<m,j,k>]*Ok[k].
解决方案
在这段代码中:
dexpr float fromdepot=sum(m in M, j in C, k in K) X[<m,j,k>]*Ok[k];
你可能有一些<m,j,k>
不在路线上
你能把它改成这个吗?
dexpr float fromdepot=sum(m in M, j in C, k in K:<m,j,k> in route) X[<m,j,k>]*Ok[k];
推荐阅读
- r - 从 R 中的唯一大列表对象创建新文本文件
- hibernate - Hibernate StaleObjectStateException 问题调用合并
- android - android:navigationBarDividerColor 需要 API 级别 28
- javascript - 关闭 Glide.js 轮播上的拖动
- javascript - WebSockets 在本地主机上工作,但在远程 Ubuntu 主机上不工作
- scala - Akka Streams - 了解物化何时以及如何工作
- jwplayer - 如何从 JWPlayer 获取#EXT-X-PROGRAM-DATE-TIME
- zooming - 升级到 v4.6.5 后不显示 Shift-zoom 边框
- java - 如何在 Spring 数据中读取 JSON 字符串并写入数据库 MySql
- elixir - Elixir/Phoenix/Guardian - 在 conn 中分配 current_user 不适用于测试