我被扔进了Cplex,绝对没有使用它的经验。我可能会缺少一些明显的信息。
我们正在尝试基于港口的火车处理能力建立一个简单的优化模型。使用多个铁路路段,每种经过处理的产品都有其自己的路径。我正在寻找一种方法来获取我的细分数组中的当前索引以求和。
简而言之,我正在Cplex中寻找“ .getindex()”的等效项。我环顾四周无济于事。
这是相关参数的简化版本。
int amountSegments=6;
int products=1..2;
int time=15;
int path[products][segments]=[[2,1,4,5],[2,1,3,6,4,5]];
这是相关限制之一
forall(l in products)
forall(i in path)
sum(t in XXXX)
x[i][l][t]==d[l];
如果x是[时间]包含[产品]的每个[细分]上的货车量,则我要在此处执行的操作:对于两个产品中的每个产品以及该产品路径中的每个细分,我想在i.getindex().. time-amountSegments + i.getindex()中求和。
预先感谢您,我希望这是可以理解的。
编辑:我将尝试清除我的问题。 我们有两个乘积1和2。乘积一路径包含路径:2,1,4,5,乘积二包含路径2,1,3,6,4,5。对于该特定约束,对于乘积一,模型需要为段2、1、4和5生成总和。顺序对于模型的其余部分很重要。
对于段2,我需要t上从1到12的总和(路径上的第一个段为15-4 + 1)
对于段1,我需要t上的总和为2到13(路径上的第二段为15-4 + 2)
对于第4部分,我需要t上的总和为3至14(路径上的第3个部分为15-4 + 3)
对于第5部分,我需要t上的总和从4到15(路径上的第4个部分为15-4 + 4)
对于第二个产品: 对于网段2,我需要从1到10的t上的总和(路径上的第一网段为15-6 + 1)
对于段1,我需要t上的总和为2至11(路径上的第二段为15-6 + 2)
对于第3段,我需要t上的总和为2至12(路径上的第3段为15-6 + 3)
对于段6,我需要t上从3到13的总和(路径上的第四段,所以15-6 + 4)
对于段4,我需要t上的总和从4到14(路径上的第五段,所以15-6 + 5)
对于第5段,我需要2到15上的t的总和(路径上的第6段为15-6 + 6)
简而言之,对于[i],我需要模型来读取正确产品的路径数组。 对于[l],我认为这很简单。 对于[t]的总和,我需要从路径数组中的位置(索引+1)到(路径段中的总时间量+路径数组中的位置)
我希望这可以更好地解释我的问题!
答案 0 :(得分:1)
鉴于每种产品的细分数量不同,我认为您必须使用元组
dvar boolean x[1..10];
int time=0;
range products=1..2;
{int} paths[products]=[ {2,1,4,5},
{2,1,3,6,4,5} ];
minimize (0);
subject to {
forall(p in products)
sum(t in paths[p]) x[time+t]==0;
}
p
的范围是1到2。对于p == 1
,t
将遍历paths[1]
,它是元组{2, 1, 4, 5}
。并且您可以在索引time
时将任何常量t
添加到x
...这样您将得到x[2]
,x[1]
,{{1} },x[4]
,如此处x[5]
。
诀窍是,数组t == 0
中的元组不必具有相同的大小。正如您所要回答的那样,矩阵必须是规则的:一行不能包含4个元素,而另一行不能包含6个元素。