使用数组中的索引求和

时间:2019-04-04 15:14:07

标签: cplex opl

我被扔进了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)到(路径段中的总时间量+路径数组中的位置)

我希望这可以更好地解释我的问题!

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 == 1t将遍历paths[1],它是元组{2, 1, 4, 5}。并且您可以在索引time时将任何常量t添加到x ...这样您将得到x[2]x[1],{{1} },x[4],如此处x[5]

诀窍是,数组t == 0中的元组不必具有相同的大小。正如您所要回答的那样,矩阵必须是规则的:一行不能包含4个元素,而另一行不能包含6个元素。

相关问题