使用数组中的索引求和

Using index in an array to make a sum

我被扔进了一个 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().

中对 t 求和

提前谢谢你,我希望这是可以理解的。

编辑:我会尽力解决我的问题。 我们有两个产品,1 和 2。产品一路径由路径 2、1、4、5 组成,产品二由路径 2、1、3、6、4、5 组成。对于该特定约束,对于产品 1,模型需要为细分市场 2、1、4 和 5 生成总和。顺序对于模型的其余部分很重要。

对于第 2 段,我需要 t 从 1 到 12 的总和(路径上的第一个段是 15-4+1)

对于第 1 段,我需要 t 从 2 到 13 的总和(路径上的第二段所以 15-4+2)

对于第 4 段,我需要 t 从 3 到 14 的总和(路径上的第三段所以 15-4+3)

对于第 5 段,我需要 t 从 4 到 15 的总和(路径上的第四段所以 15-4+4)

第二个产品: 对于第 2 段,我需要 t 从 1 到 10 的总和(路径上的第一段所以 15-6+1)

对于第 1 段,我需要 t 从 2 到 11 的总和(路径上的第二段所以 15-6+2)

对于第 3 段,我需要 t 从 2 到 12 的总和(路径上的第三段所以 15-6+3)

对于第 6 段,我需要 t 从 3 到 13 的总和(路径上的第四段所以 15-6+4)

对于第 4 段,我需要 t 从 4 到 14 的总和(路径上的第五段所以 15-6+5)

对于第 5 段,我需要 t 从 2 到 15 的总和(路径上的第六段,所以 15-6+6)

简而言之,对于 [i],我需要模型读取正确产品的路径数组。 对于 [l],我认为这非常简单。 对于 [t] 上的总和,我需要从我在路径数组中的位置(索引+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}。你可以在索引x时将任何常量time添加到t...所以你将得到x[2]x[1],[=21=的总和], x[5], 如此处 t == 0.

诀窍在于数组 paths 中的元组不需要具有相同的大小。虽然在你的问题中矩阵必须是规则的:你不能有一行有 4 个元素,而另一行有 6 个元素。