# mTSP with time window

Can solve the problem that the number of nodes is within 20.

The number of nodes is out of 20 and cannot be solved.

No problem with the model.

I feel that it is mainly used in =>.

Use in the model in load weight constraints and time window constraints =>.

I feel that there may be some problems in this logic.

MOD as below:

/*********************************************
* OPL 12.9.0.0 Model
* Author: 86131
* Creation Date: 2019年5月24日 at 下午10:17:34
*********************************************/

int     n       = …;
int     K       = …;
{int}   A  = asSet(1..n);//配送网点与客户点
{int}   N  = asSet(2..n);
{int}   Trucks  = asSet(1..K);//一组同质的车辆(人员)
float   T  =…;//单次收派的最大工作时间
float   Z  =…;//一个极大正数
float        Q[Trucks] = …;//载重量上限
float        d[N] = …;//收件重量
float        v[N] = …;//派件重量

float CC[1..n*n*K] = …;
float c[i in 1..n, j in 1..n,k in 1..K] = CC[k+K*(j-1)+n*K*(i-1)];//行走成本（时间）
float        t[N][Trucks] =…;//客户 i的服务时间
float        a[N] = …;//客户 i要求的最早到达时间
float        b[N] = …;//客户 i要求的最晚到达时间*/
dvar boolean x[A][A][Trucks];//车辆 k 是否访问过客户 i 和客户 j 所构成的弧
dvar float+ q[A][Trucks];//车辆 k 离开客户i时所装载重量
dvar float+ w[A][Trucks];//收派员 k 达到客户 i的时间,原文文中是k，这里符号冲突了

dexpr float time[k in Trucks] =sum(i,j in A:j!=i)(c[i][j][k]*x[i][j][k])+sum(i in A,j in N:j!=i)(t[j][k]*x[i][j][k]);
/************************************************/
// Objective
minimize sum (i,j in A:i!=j,k in Trucks) c[i][j][k]*x[i][j][k];
subject to {
forall(i in N)
ct1:sum(j in A:j!=i,k in Trucks)(x[i][j][k])==1;
forall(j in N)
ct2:sum(i in A:i!=j,k in Trucks)(x[i][j][k])==1;
forall(k in Trucks)
ct3:sum(j in N)(x[1][j][k])==1;
forall(k in Trucks)
ct4:sum(i in N)(x[i][1][k])==1;
forall(j in N)
ct5:sum(k in Trucks)(x[1][j][k])<=1;
forall(i in N)
ct6:sum(k in Trucks)(x[i][1][k])<=1;
forall(k in Trucks,h in N)
ct7:sum(i in A:i!=h)(x[i][h][k])-sum(j in A:j!=h)(x[h][j][k])==0;//改了A
forall(k in Trucks)
ct8:time[k]<=T;
forall(k in Trucks)
ct9:q[1][k]==sum(j in N)(v[j]*sum(i in A:i!=j)(x[i][j][k]));
forall(i in A,j in N:j!=i,k in Trucks)
ct10:x[i][j][k]==1=>(q[j][k]-q[i][k])==-(d[j]+v[j]);//不用考虑回原点
//forall(i in A,j in N:j!=i,k in Trucks)
//ct10:(q[j][k]-q[i][k])>=-(d[j]+v[j])-Z*(1-x[i][j][k]);//不用考虑回原点
forall(i in A,j in A:j!=i,k in Trucks)
ct11:x[i][j][k]==1=>q[i][k]<=Q[k];//之前有问题，q意思是离开客户i的载重量
forall(i in N,j in A:j!=i,k in Trucks)
ct12:x[i][j][k]==1=>maxl(0,-d[i])<=q[i][k];
forall(j in N,k in Trucks)
ct13:x[1][j][k]==1=>w[j][k] >= w[1][k]+c[1][j][k];//这里 w[1][k]表示离开原点1的时间
forall(i in N,j in N:j!=i,k in Trucks)
ct14:x[i][j][k]==1=>w[j][k] >= w[i][k]+t[i][k]+c[i][j][k];
//forall(j in N,k in Trucks)
//ct13:w[j][k] >= w[1][k]+c[1][j][k]-(1-x[1][j][k])*Z;//这里 w[1][k]表示离开原点1的时间
//forall(i in N,j in N:j!=i,k in Trucks)
//ct14:w[j][k] >= w[i][k]+t[i][k]+c[i][j][k]-(1-x[i][j][k])*Z;//这里 w[1][k]表示离开原点1的时间
forall(i in A,j in N:j!=i,k in Trucks)
ct15:x[i][j][k]==1=>a[j]<=w[j][k];
forall(i in A,j in N:j!=i,k in Trucks)
ct16:x[i][j][k]==1=>w[j][k]<=b[j];
ct18:sum(i in A,k in Trucks)x[i][i][k]==0;
}

Personal feeling problems mainly appear in the load weight constraint ct10-ct12 and time window constraint ct13-ct16.

I don’t know if => is correct, if not, how to represent the above constraints.

In addition, with similar constraints such as adding an infinite number Z, the model does not apply.

Thanks for solving my problem.

Source: mTSP with time window