【问题标题】:Using index in an array to make a sum使用数组中的索引求和
【发布时间】:2019-04-04 15:14:06
【问题描述】:

我被扔进了一个 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 是 [time] 包含 [product] 的每个 [segment] 上的货车数量:对于两种产品中的每一种以及该产品路径中的每个段,我想在 i.getindex() 中求和 .. time-amountSegments+i.getindex()。

提前谢谢你,我希望这有点可以理解。

编辑:我会尝试澄清我的问题。 我们有两个产品,1 和 2。产品 1 路径由路径 2、1、4、5 组成,产品 2 由路径 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 的总和(路径上的第三段,所以 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)到(路径中段的总时间量 + 路径数组中的位置)

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

【问题讨论】:

  • 当您提到i.getindex() 时,我不清楚i 是什么。如果您能解释如何定义x,可能会更容易理解您的问题,因为您似乎混淆了x 的前两个维度。
  • 我将 X 定义为 x[segment][product][time]。对于产品一,我想求和: x[2][1][from 1 to (15-4+1)] 因为这是数组中的第一段。 x[1][1][from 2 to 15-4+2)] 因为这是数组中的第二段。以此类推。

标签: cplex opl


【解决方案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]x[4]x[5] 的总和,如这里t == 0

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

【讨论】:

  • 编辑了我的问题,因为我认为它并不清楚,因为我担心。感谢您抽出宝贵的时间。
  • 我改了答案。
  • 谢谢,您的 cmets 帮助我了解了我遇到的部分问题。我还有几个问题,但我会再发一篇文章,因为它们可能没有直接关系。
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多