如何使用索引作为索引(子集)以及如何使用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 文档中
对于第二个问题,让我分享一个小例子:
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
我正在使用 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 文档中
对于第二个问题,让我分享一个小例子:
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