【发布时间】:2020-12-19 10:52:10
【问题描述】:
我想找到从供应商处购买商品的最佳解决方案,其中运费取决于从指定供应商处购买商品的成本。我正在使用 Pyomo。到目前为止我的代码是:
model = ConcreteModel(name="(MN_2)")
# products
N = ['prod1', 'prod2', 'prod3']
# suppliers
M = ['A', 'B']
# price
p = {('prod1', 'A'): 10,
('prod2', 'A'): 9,
('prod3', 'A'): 50,
('prod1', 'B'): 16,
('prod2', 'B'): 20,
('prod3', 'B'): 35}
# user quantity contraint
q_u = {('prod1', 'A'): 2,
('prod2', 'A'): 1,
('prod3', 'A'): 1,
('prod1', 'B'): 1,
('prod2', 'B'): 1,
('prod3', 'B'): 1}
# seller quantity contraint
q_s = {('prod1', 'A'): 20,
('prod2', 'A'): 10,
('prod3', 'A'): 10,
('prod1', 'B'): 10,
('prod2', 'B'): 10,
('prod3', 'B'): 10}
# quantity of product n bough in shop m
model.x = Var(N, M, bounds=(0,10))
def obj_rule(model):
return sum(p[n,m]*model.x[n,m] for n in N for m in M)
model.obj = Objective(rule=obj_rule)
def user_quantity(model, n, m):
return model.x[n,m] >= q_u[n,m]
model.user_quantity = Constraint(N, M, rule=user_quantity)
def seller_quantity(model, n, m):
return model.x[n,m] <= q_s[n,m]
model.seller_quantity = Constraint(N, M, rule=seller_quantity)
solver = SolverFactory('glpk')
solver.solve(model)
model.x.pprint()
我正在努力解决的问题是如何包含取决于从给定供应商处购买的商品成本的运费。例如:
对于供应商 A:运费为 =
- 如果从他们那里购买的产品的成本总和为
- 0 如果从他们那里购买的产品的成本总和> 100
对于供应商 B:运费为 =
- 8 如果从他们那里购买的产品的成本总和为
- 0 如果从他们那里购买的产品的成本总和> 150
【问题讨论】:
-
您的额外费用似乎各有两个可能的值。从数学上讲,您将如何建模/跟踪总成本是否超过阈值?
-
我会说例如 A: shipping_cost = {10 for model.x[n,m] * p[n,m]
-
您不能在整数程序中直接使用该逻辑语句,因为它不是线性函数。您正在寻找的是使用二进制变量的 if-else 约束的实现。 (这里)[math.stackexchange.com/q/2500415] 是对这个概念的一个很好的数学解释。如果成本总和达到阈值,您可以为每个供应商添加一个二进制变量和使变量为 1 的相应约束。然后你可以将该变量乘以成本
-
为什么假设这应该被表述为线性问题?
-
对不起,在这种情况下我对线性的使用很松散。我只是说您在评论中对运输成本的定义并没有直接转化为(混合整数)线性编程模型中的实现。但是使用二元变量的约束的 if-else 公式确实如此。
标签: optimization pyomo