我正在尝试为大学工作解决VRPWT,但遇到了一些麻烦,CPLEX一直使我感到这是不可行的。
有人可以检查我的代码以查看我丢失的内容吗?
int n=...;
range cliente=0..n+1;
int nveiculos=...;
range K=1..nveiculos;
tuple edge {
int i;
int j;
int z;
}
{edge} edges = {<i,j,z> | i,j in cliente : i!=j && i!=6 && j!=0 , z in K};
int custo[edges]=...;
int d[cliente]=...;
int t[edges]=...;
float a[cliente]=...;
float b[cliente]=...;
float q[K]=...;
dvar boolean x[edges];
dvar int s[cliente][K];
minimize sum(j in edges) sum(i in edges) custo[i]*x[j];
subject to {
forall(k in K){
sum( j in cliente: j!=0) x[<0,j,k>] ==1;
}
forall(k in K)
forall(p in cliente: p!=6 ){
sum( h in cliente: h!=p && h!=0) x[<p,h,k>]==1; }
forall(k in K){
sum(i in cliente) sum(j in cliente: i!=j && i!=6 && j!=0, k in K) d[i]* x[<i,j,k>] <=q[k];
}
forall(k in K)
forall(h in cliente: h!=0){
sum(i in cliente: i!=h && i!=6) x[<i,h,k>] == sum(j in cliente: j!=h && h!=6 && j!=0) x[<h,j,k>];
}
forall(k in K){
sum(i in cliente: i!=6) x[<i,6,k>] ==1;
}
forall(k in K)
forall(i in cliente){
a[i]<= s[i][k]<=b[i];
}
forall(k in K)
forall(i,j in cliente: i!=j && i!=6 && j!=0)
s[i][k]+t[<i,j,k>]- 1000*(1-x[<i,j,k>]) <= s[j][k];
}
我正在使用2辆车(nveiculos)和5个客户,使用了一系列客户来添加家得宝和最后一个得宝。 a和b代表客户的营业时间,b代表客户的营业时间。 d是每个客户的需求,q是车辆容量。 s变量代表车辆到达客户的时间。
我已经有很多简单的解决方案,尽管它与im所基于的文章中的算法不匹配,而且我有点固执,想解决这个问题。
如果有人可以帮助我,那将是非常棒的。 最好的问候