【问题标题】:Extending a LP using Python使用 Python 扩展 LP
【发布时间】:2021-08-05 05:27:41
【问题描述】:

大家好。

我有一个小问题,我分配了要求将货物退回到配送中心的位置。为了在这些位置处理这种需求,我们必须安装某些技术(A 和 B)。我们只能安装与 A 一样多的 B,或 B 的 0。因此,如果 B = 2,则 A 也必须为 2。但是,如果 A = 2,则 B 永远不能说 B = 1。它可以是 B = 0 和 A = 2。

现在问题出现了,我需要一些帮助。如果用 Python 编码,它适用于各个位置。但是如果我想将它扩展到覆盖所有位置,我会遇到错误......下面是小问题的代码:

# Create a new model
m = gp.Model("mip1")

BigM = 100

q = locations[i]

# Create parameters
cost_A = 20000
cost_B = 13500
cost_transport = 0.007
cap_A = 400000
cap_B = 500000

# Create variables
x = m.addVar(lb=0, ub=3, vtype=GRB.INTEGER, name="A")
y = m.addVar(lb=0, ub=3, vtype=GRB.INTEGER, name="B")
z = m.addVar(lb=0, vtype=GRB.INTEGER, name="flow_1")
a = m.addVar(vtype=GRB.BINARY, name="BigM")

# Set objective to minimize cost
m.setObjective(cost_A * x + cost_B * y + cost_transport * z, GRB.MINIMIZE)

# Add constraint: amount of UBC
m.addConstr(z == q, "accept returned demand")

# Add constraint: capacity
m.addConstr(z <= cap_A * x + cap_B * y, "capacity of locations")

# Add constraint: only B if location exists/has A
m.addConstr(y <= x, "B constraint_1")

# Add constraint: only B if location exists/has A
m.addConstr(x - y <= BigM * a, "B constraint_2")

# Add constraint: only B if location exists/has A
m.addConstr(y <= BigM * (1 - a), "B constraint_3")

# Optimize model
m.optimize()

鉴于该位置的需求,上述模型会生成关于在某个位置安装多少 A 和 B 的输出。这当然非常简单。但是,我现在想扩展这个问题,考虑到多个位置,这就是我遇到错误的地方......KeyError: (0, 1)KeyError: (1, 1)KeyError: (1)KeyError: (0) 都已经存在了......

我认为这将是“简单地”制作 addVars 和 addConstraints,但是你需要分配集合等。我实际上在这个过程中很迷茫.有谁可以帮帮我吗?

非常感谢大家的时间和考虑。

附:它不必由像 Gurobi 这样的求解器来解决,如果你知道我很高兴听到的任何其他信息!

【问题讨论】:

  • 你能展示一些你尝试过的错误吗?
  • 我无法在这里发布答案,所以我添加了一条新评论。很抱歉给您带来不便

标签: python linear-programming gurobi


【解决方案1】:

是的,您将不得不拆除大部分内容并引入集合...:)。我的 Gurobi 语法很弱,所以这里有一些东西可以帮助你开始使用伪代码。

你需要几套

T = {A, B}
L = {LA, Chicago, NY}  # for example

您需要一个变量来分配(这是一个分配问题)位于L 位置的技术数量T...

X[tech, loc]  # domain non-neg integers, right?

然后,您可以根据需要使用对索引的求和来重新构建您的约束等。我确信有很多 Gurobi 示例可以帮助解决这个问题。从非常小的开始,以便您可以排除故障。

您将需要对技术 B 的条件进行约束。您没有说明该约束是全局性的还是由位置强制执行的。让我们假设它是按位置(更难的情况)。然后,您需要另一个指示变量来指示它们是否相等。

Eq[loc]    # indicate whether B=A at particular location, binary var

然后你可以使用 Big M 来控制位置的相等性,方法是设置 3 个约束 per 位置

X[B, loc] <= X[A, loc]
X[A, loc] - X[B, loc] <= (1 - Eq[loc]) * M
X[B, loc] <= Eq[loc] * M

【讨论】:

  • 嗯,这看起来确实是个不错的开始!我会更深入地研究这一点,非常感谢您。我会回来找你的!
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2017-06-11
  • 2011-03-31
相关资源
最近更新 更多