如何为CPLEX循环添加约束?

发布于 2025-02-10 18:05:06 字数 2425 浏览 5 评论 0原文

**我想将能源消耗从一个细分市场链接到下一个细分市场,我尝试了矩阵,但它们没有起作用,所以我创建了一个命名(ArcandSegment)的元组,该元组接收了三个参数:ARC,该部门和车辆。但是,我收到一个错误的错误(type< int,int,int>无法与索引一起使用),因此我切换到使用循环“ for”,但它仍然不起作用,并且出现相同的错误。问题是最后一行,其中包含能量表达“电池能力[< i,j,k>] == re extainingBatteryCapacity [< i-1,j,k>]+addcapacity+addcapacity [< i,j,j,k>] - 能量消费[< i,j,k>];”预先感谢您的任何帮助。

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>];
}  `**

**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. 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>];" 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>];
}  `**

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ゝ偶尔ゞ 2025-02-17 18:05:06

以下工作正常:

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>)];
}

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>)];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文