【发布时间】:2020-07-13 00:00:51
【问题描述】:
我有以下OF 以最小化供应链成本:
mdl.minimize(mdl.sum((cs+ch+cf+cv*d[j])*q[j] for j in arcs) + mdl.sum(α*(eh+et*d[j])*q[j] for j in arcs) + mdl.sum(β*(gh+gt*d[j])*q[j] for j in arcs) + mdl.sum(X[f]*cjf for f in comb))
其中cs, ch, cf, cv, eh, et, gh, gt, cjf, α and β是一系列常量参数。
d[j] 是在arcs 或元组列表中组合的起点 i 和终点 j 之间的距离。
q[j] 是arcs 中起点i 和终点j 之间的流变量。
X[f] 是一个二进制变量,用于在目标j 中打开容量为f 的设施,j 和f 的可能组合在comb 中列出。
第一个constraint 1 确保来自源i 的流q[i,j] 不超过i 中材料dQ 的最大可用性。 D[(i, j)] 是一个二进制参数,如果起点 i 和终点 j 之间的距离小于或等于阈值,则为 1,否则 D[(i, j)] 的值是 0。 (这个参数可以帮助我们限制传输距离。)
for i in I: mdl.add_constraint(mdl.sum(q[(i, j)]*D[(i, j)] for j in J) <= Qi[i])
第二个constraint 2 确保流向目标j 的q[i,j] 等于目标j 中已打开设施的容量和容量f。
for j in J: mdl.add_constraint(mdl.sum(q[(i, j)]for i in I) == mdl.sum(X[(j,f)] for f in F))
但是,我们需要另一个constraint 3,以确保在目的地j 开设的设施中的容量总和f 必须尽可能接近容量总需求E。假设有 100 MW E = 100 的能源需求,那么我们想降低 OF 的供应成本,但也要确保我们达到需求 E。否则最小化成本将为 0。这个约束可以表述为:
mdl.add_constraint(mdl.sum(X[j,f]for j in J for f in F) == E)
不幸的是,这个解决方案永远不可行。如果我们将== 替换为<= 是可行的,但成本最低且容量远未达到最大值。
我们不需要这是一个严格的限制,但我们确实希望通过在目的地j 开设多个具有不同容量f 的设施来尽可能接近E。 (例如,我们可以有一个 20 MW、一个 5 MW、两个 30 MW 和另一个 15 MW 的目的地,通过开放 5 个目的地达到 100 MW)
一种方法是强制模型打开N 位置数量j,但是,我们有一组 128 个位置。要从N=1 到N=128 的一系列场景中找到最小成本和最大容量,意味着我们需要运行这个模型 128 次。
在上述约束之上,我们还有 3 个额外的约束:
- 我们只能选择目的地
j来建造一个设施,并且只开放一个容量f。 - 要打开的目的地
j的总和大于0。 - 起点
i和终点j之间没有负流q
有没有办法:
- 减少
constraint 3的绑定,但仍尝试在保持最低成本的同时达到E? - 重新制定
OF以将最小成本与最大容量相结合?
重要的是,我们不想让模型运行 128 次。我们要建模选择目的地j 开设设施并相应地选择容量f,以最小化总供应成本并最大化装机容量。在我们的例子中,也不太可能只打开一个目的地j 来满足所有需求E。相反,我们将有多个 j 与较小的 f 容量相加时接近 E。
【问题讨论】:
标签: python mathematical-optimization cplex docplex docplexcloud