首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python扩展LP

使用Python扩展LP
EN

Stack Overflow用户
提问于 2021-08-05 05:27:41
回答 1查看 103关注 0票数 1

大家好,今天好。

我有一个小问题,就是我把需要退货的地点安排到配送中心。为了处理这些地点的需求,我们必须安装某些技术(A和B)。我们只能安装尽可能多的B,或者0的B。所以,如果B= 2,那么A也必须是2。但是,如果A=2时,则不能说B=1,它可以是B=0和A= 2。

现在出现了一个问题,我希望得到一些帮助。如果用Python编写这个代码,那么它可以用于各个位置。但是如果我想把它扩展到所有的地方,我会遇到错误.下面是小问题的代码:

代码语言:javascript
复制
# 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)都去过那里。

我认为这将是“简单”的制作addVar,,s,和,但是你需要分配集合等等。实际上,我在这个过程中完全迷失了方向。有人能帮帮我吗?

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

它不需要像Gurobi这样的解决方法,如果你知道什么,我很高兴听到!

EN

回答 1

Stack Overflow用户

发布于 2021-08-05 06:26:33

是的,你得拆掉其中的大部分,然后介绍.*)。我的Gurobi语法很弱,所以这里有几件事情可以让您开始使用伪代码。

你需要几套

代码语言:javascript
复制
T = {A, B}
L = {LA, Chicago, NY}  # for example

您需要一个变量来赋值(这是一个赋值问题),在location L.

代码语言:javascript
复制
X[tech, loc]  # domain non-neg integers, right?

然后,您可以重新构造约束&例如,在适当的情况下使用对索引的求和。我相信有很多Gurobi的例子可以帮助你。启动非常小,这样您就可以排除故障。

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

代码语言:javascript
复制
Eq[loc]    # indicate whether B=A at particular location, binary var

然后,您可以使用大M通过在每个位置设置3个约束来控制位置相等

代码语言:javascript
复制
X[B, loc] <= X[A, loc]
X[A, loc] - X[B, loc] <= (1 - Eq[loc]) * M
X[B, loc] <= Eq[loc] * M
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68661027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档