如何使用索引作为索引(子集)以及如何使用cplex中的内部数据计算索引值

How to use index as index (subset) and How to calculate the index value using internal data in cplex

我正在使用 CPLEX 解决 MILP 卡车调度问题,我发现了两个我无法解决的问题。

首先,我尝试使用具有多个索引的变量作为

 int p=...;     //plant index
 int r=...;     //request index
 int k=...;     //truck index
 int t=...;     //concrete type index

 range plant        =   1..p;
 range request      =   1..r;
 range truck        =   1..k;

 int m=...;
 int j=...;

 range deliveries   =   1..m; //total number of delivery each customer
 range jobs         =   1..j; //total jobs in a day each truck

dvar boolean    x[plant][request][deliveries][truck][jobs]

但是索引 deliveries(m) 和 jobs(j) 分别是 request(r) 和 truck(k) 的子集。最大交付数量 "m" 取决于请求的需求,最大工作数量取决于旅行时间。然后,根据要求和车改了。

其次,通过计算得到"m"和"j"的值:

m[r] = roundup(max{Q[r][t]}/min{C[k]})

j[k] = 汇总(工作时长 day/minimal 每辆卡车的任务时长 [k])

对于 "m" 我目前尝试使用的代码,但它不起作用,因为它无法应用索引(第一个问题):

 float maxQ = maxl(demand[r][t]);
 float minC = minl(capacity[k]);

 int m = ftoi(ceil(maxQ/minC));

 range deliveries   =   1..m;

但是对于"minimal lenght of a task each truck"计算,它是从模型有运行后计算的行进时间约束得到的,我是否应该输入"j"值作为常量然后在模型时更新它运行 ?或者可以用另一种方式完成?提前谢谢你。

PS。抱歉我的英语不好。

您可以使用元组集而不是完整的欧几里德积。

参见 IDE 和 OPL > 优化编程语言 (OPL) > 语言用户手册 > OPL 简介 > 建模技巧 > 稀疏性

在 CPLEX 文档中

https://www.ibm.com/support/knowledgecenter/SSSA5P_12.8.0/ilog.odms.ide.help/OPL_Studio/opllanguser/topics/opl_languser_modelingtips_sparsity_first.html

对于第二个问题,让我分享一个小例子:

range R=1..3;
range T=1..2;
range K=1..4;

float demand[r in R][t in T]=1+r*t;
float capacity[k in K]=k;


float maxQ = max(r in R,t in T)(demand[r][t]);
float minC = min(k in K)(1/capacity[k]);

 int m = ftoi(ceil(maxQ/minC));

 range deliveries   =   1..m;

 execute
 {
 writeln(deliveries); 
 }

这给出了

1..28