/*********************************************
 * OPL 4.0 Model
 * Author: Owner
 * Creation Date: Wed Aug 29 13:54:31 2007
 *********************************************/

int NoOfNode = 6;
int NoOfCar = 4;
int Servicetime=...;
range car = 1..NoOfCar;
range start = 1..NoOfNode;
range finish = 1..NoOfNode;

int Demand[start] = ...;

float distance[start][finish] = ...;
float t[start][finish];

dvar boolean x[start][finish][car];
dvar int b[start][car];
dvar int e[start];
dvar int l[start];
 
execute {
   for (i=1; i<NoOfNode+1; i++)
   {
      for (j=1; j<NoOfNode+1; j++)
      { t[i][j]=distance[i][j]+Servicetime;}
   }
} 

minimize
sum (k in car) sum (i in start) sum (j in finish) distance[i][j]*x[i][j][k];
subject to {
   forall(i in start) 
      sum(j in finish)sum(k in car)x[i][j][k]==1;
   forall(j in finish) 
      sum(i in start)sum(k in car)x[i][j][k]==1;
   forall(i in start) 
      sum(k in car)  Demand[i]*sum(j in finish)x[i][j][k]<=200;
   forall(k in car) 
      sum(j in finish) x[1][j][k]==1;
   forall(k in car) 
      sum(i in start) x[i][1][k]==1;  
   forall(i in start, j in finish, k in car) 
      x[i][1][k]*(b[i][k]+t[i][j])<=b[j][k];           
   forall(i in start, k in car) 
      (e[i]<=b[i][k])&&(b[i][k]<=l[i]);     


}
     
