SCIP Objective Function quicksum over a exponential term

送分小仙女□ 提交于 2021-01-29 17:22:03

问题


I am having issues summing over an exponential equation and using this as is the objective function.

Am I able to use the exponential equation in the objective function? If not, is it possible to put the exponential function in as a constraint?

Any help on this would be appreciated.

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()

The error that occurs from this code is:

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

It is my understanding that the format of the objective function should be (which is the result I get from printing exp_power):

Expr({Term(): 0.0, Term(x4): 12390.400000000001, Term(x8): 39562.6, Term(x12): 20818.6})

However, once the exponential term is added (w), the format becomes:

exp(sum(0.0,prod(12390.400000000001,x4),prod(39562.6,x8),prod(20818.6,x12)))

Further, when adding the quicksum[w], the format becomes:

sum(0.0,exp(sum(0.0,prod(12390.400000000001,x4),prod(39562.6,x8),prod(20818.6,x12))))

The aim is to minimize \sum_{r=1}^N W_r

Where \W_r = exp(population_dict[r]*sum_{s∈S} d_r,s * y_r,s) ∀r ∈ R

来源:https://stackoverflow.com/questions/65695286/scip-objective-function-quicksum-over-a-exponential-term

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!