[英]SCIP Optimization of an Exponential Function
我在对指数方程求和时遇到问题,并将其用作目标 function。
我还尝试将指数方程写成约束,因为我认为这可能是解决此问题的另一种方法,但这对我也不起作用。
对此的任何帮助将不胜感激。
import pandas as pd
from pyscipopt import Model, quicksum, multidict, exp
num_fac_to_open = 1
order_to_open = []
opened_fac = []
closed_fac = [0, 1, 2]
S = [0, 1, 2]
R = [10, 11, 12]
distance_dict = {(0, 10): 300.8, (1, 10): 150.6, (2, 10): 1567.8, (0, 11): 1241.0, (1, 11): 2012.1, (2, 11): 789.2, (0, 12): 563.2, (1, 12): 1798.3, (2, 12): 946.3}
population_dict = {10:54, 11:46, 12:22}
# n is the desired number of facilities to open
n = len(opened_fac) + num_fac_to_open
# create a model
model = Model()
z, y= {}, {}
for s in S:
# x_i is binary, 1 if service facility i is opened, 0 otherwise
z[s] = model.addVar(vtype="B")
for r in R:
# y_i,j is binary, 1 if service facility i is assigned to residential area j, 0 otherwise
y[s, r] = model.addVar(vtype="B")
for r in R:
want_list = (distance_dict[s, r]*y[s, r] for s in S)
want_list_quicksum = quicksum(want_list)
exp_power = population_dict[r]*want_list_quicksum
w = exp(exp_power)
model.setObjective(quicksum([w]), 'minimize')
model.optimize()
此代码发生的错误是:
Traceback (most recent call last):
File "stack_overflow_code.py", line 38, in <module>
model.setObjective(quicksum([w]), 'minimize')
File "src/pyscipopt/scip.pyx", line 1246, in pyscipopt.scip.Model.setObjective
AssertionError: given coefficients are neither Expr or number but SumExpr
据我了解,目标 function 的格式应该是(这是我打印 exp_power 得到的结果):
Expr({Term(): 0.0, Term(x4): 12390.400000000001, Term(x8): 39562.6, Term(x12): 20818.6})
但是,一旦添加指数项 (w),格式变为:
exp(sum(0.0,prod(12390.400000000001,x4),prod(39562.6,x8),prod(20818.6,x12)))
此外,当添加 quicksum[w] 时,格式变为:
sum(0.0,exp(sum(0.0,prod(12390.400000000001,x4),prod(39562.6,x8),prod(20818.6,x12))))
目的是最小化 \sum_{r=1}^N W_r
其中 \W_r = exp(population_dict[r]*sum_{s∈S} d_r,s * y_r,s) ∀r ∈ R
quicksum
需要一个可迭代对象,但distance_dict[s, r]*y[s, r] for s in S
并没有像您预期的那样返回一个可迭代对象。
尝试将该行简化为多行,并确保在将其输入quicksum
之前有一个可以使用的列表。
为了在 Python 中使用列表理解,我们必须将语句括在方括号中。 [distance_dict[s, r]*y[s, r] for s in S]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.