简体   繁体   English

如何向 CPLEX 循环添加约束?

[英]How do I add a constraint to the CPLEX loop for?

**I want to link energy consumption from one segment to the next,I tried matrices but they didn't work, so I created a Tuple named (arcAndsegment) that receives three parameters: the arc, the segment, and the vehicle. **我想将能源消耗从一个段链接到下一个段,我尝试了矩阵但它们不起作用,所以我创建了一个名为 (arcAndsegment) 的元组,它接收三个参数:弧、段和车辆。 However, I receive an error that says (type <int, int, int > cannot be used with indexation), so I switched to using the loop "for," but it's still not working, and the same error appears.my problem is in the last line that contains energy expression" BatteryCapacity[<i,j,k>]== remainingBatteryCapacity[<i-1,j,k>]+AddedCapacity[<i,j,k>]-EnergyConsumption[<i,j,k>];"但是,我收到一条错误消息(类型 <int, int, int > 不能与索引一起使用),所以我切换到使用循环“for”,但它仍然无法正常工作,并且出现相同的错误。我的问题是在包含能量表达式的最后一行" BatteryCapacity[<i,j,k>]== remainingBatteryCapacity[<i-1,j,k>]+AddedCapacity[<i,j,k>]-EnergyConsumption[<i, j,k>];" Thank you in advance for any assistance.`提前感谢您的任何帮助。`

int N=10;
range NumNodes=0..6;//max Num of  nodes 
{int}Nodeset=asSet(NumNodes);//node set
range Numofarcs=1..12;//max Num of arcs
{int}arcset=asSet(Numofarcs);//arc set
range Numofvehicles=1..N;//NumOf vehicles
range Numofsegments=1..12;//max Num of segments
{int} segmentset=asSet(Numofsegments);//segments set
range P=1..5;//max Num of paths
{int}pathset=asSet(P);//paths set
tuple path_definition{int a;int b;}
setof (path_definition) paths= {<a,b>| a in pathset,b in Nodeset};
tuple location{int x; int y;}
location NodeLocation [Nodeset];
tuple edge{
  int i;
  int j;
  int k;
}
setof (edge) arc = {<i,j,k>| i,j in Nodeset,k in  Numofsegments :i!=j};

float travelTime[arc]; 
float distance[arc];
tuple speedVcr{
  float speed;
  float vcr;
}
float speed[arc];
tuple Vedge{
  int i;
  int j;
  int k;
}
setof (Vedge) vehicleEdges = {<i,j,k>| i,j in Nodeset,k in Numofvehicles :i!=j};
tuple combinaison{int a; int b; int c;}
setof (combinaison) arcAndsegment={<a,b,c>| a in segmentset,b in arc ,c in  Numofvehicles };


//variables 
float BatteryCapacity[arcAndsegment];
float remainingBatteryCapacity[arcAndsegment]; 
float AddedCapacity[arcAndsegment];
float EnergyConsumption[arcAndsegment];
 
//decision variable 
dvar boolean y[arc][segmentset];
dvar boolean z[arc][segmentset];
dvar boolean s[arc][arc][segmentset];
dvar float+ Ibat;

//float batteryCapacity[segments];
//data
int cbat=800;
int ccab=100;
int cond=500;
float Imax=34;
float Imin=15;
//objective
minimize
  sum(u in arc, j in segmentset) N*cbat*Ibat+ sum(u in arc, j in segmentset) ccab*y[u][j] + sum(u in arc, j in segmentset)cond*z[u][j];

//constraintes
subject to {
forall ( u in arc,j in segmentset)y[u][j]>=z[u][j];

forall ( u in arc,j in segmentset,k in Numofvehicles)
  startBatteryCapacity:
   BatteryCapacity[<0,j,k>]==Imax;
forall (i in segmentset,j in arc,k in Numofvehicles)
   BatteryCapacity[<i,j,k>]== remainingBatteryCapacity[<i-1,j,k>]+AddedCapacity[<i,j,k>]-EnergyConsumption[<i,j,k>];
}  `**

the following works fine:以下工作正常:

int N=10;
range NumNodes=0..6;//max Num of  nodes 
{int}Nodeset=asSet(NumNodes);//node set
range Numofarcs=1..12;//max Num of arcs
{int}arcset=asSet(Numofarcs);//arc set
range Numofvehicles=1..N;//NumOf vehicles
range Numofsegments=1..12;//max Num of segments
{int} segmentset=asSet(Numofsegments);//segments set
range P=1..5;//max Num of paths
{int}pathset=asSet(P);//paths set
tuple path_definition{int a;int b;}
setof (path_definition) paths= {<a,b>| a in pathset,b in Nodeset};
tuple location{int x; int y;}
location NodeLocation [Nodeset];
tuple edge{
  int i;
  int j;
  int k;
}
setof (edge) arc = {<i,j,k>| i,j in Nodeset,k in  Numofsegments :i!=j};

float travelTime[arc]; 
float distance[arc];
tuple speedVcr{
  float speed;
  float vcr;
}
float speed[arc];
tuple Vedge{
  int i;
  int j;
  int k;
}
setof (Vedge) vehicleEdges = {<i,j,k>| i,j in Nodeset,k in Numofvehicles :i!=j};
tuple combinaison{int a; edge b; int c;}
setof (combinaison) arcAndsegment={<a,b,c>| a in segmentset,b in arc ,c in  Numofvehicles };


//variables 
float BatteryCapacity[arcAndsegment];
float remainingBatteryCapacity[arcAndsegment]; 
float AddedCapacity[arcAndsegment];
float EnergyConsumption[arcAndsegment];
 
//decision variable 
dvar boolean y[arc][segmentset];
dvar boolean z[arc][segmentset];
dvar boolean s[arc][arc][segmentset];
dvar float+ Ibat;

//float batteryCapacity[segments];
//data
int cbat=800;
int ccab=100;
int cond=500;
float Imax=34;
float Imin=15;
//objective
minimize
  sum(u in arc, j in segmentset) N*cbat*Ibat+ sum(u in arc, j in segmentset) ccab*y[u][j] + sum(u in arc, j in segmentset)cond*z[u][j];

//constraintes
subject to {
forall ( u in arc,j in segmentset)y[u][j]>=z[u][j];

forall ( u in arc,j in segmentset,k in Numofvehicles:u.j==0 && <0,u,k> in arcAndsegment )
  startBatteryCapacity:
   BatteryCapacity[item(arcAndsegment,<0,u,k>)]==Imax;
forall (i in segmentset,j in arc,k in Numofvehicles:i>=2)
   BatteryCapacity[item(arcAndsegment,<i,j,k>)]== remainingBatteryCapacity[item(arcAndsegment,<i-1,j,k>)]+AddedCapacity[item(arcAndsegment,<i,j,k>)]-EnergyConsumption[item(arcAndsegment,<i,j,k>)];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM