python - 多目标的模型检测,但只尝试写一个
问题描述
我有一个相当基本的模型,我正在尝试运行,并且不断收到以下错误消息:
错误:运行模型时出现意外异常:NL 编写器在未知模型上检测到多个活动目标函数,但目前仅处理一个目标。
鉴于该错误,我认为 CPLEX 将我的目标函数解释为多目标问题。我想做的是最小化在索引(i,j,t)上定义的'model.obj',但我不相信这意味着我有多个目标函数?目标函数试图表述为下面的等式 11:
from __future__ import division
from pyomo.environ import *
from MPBFunctions import *
# Variable Initialization Matricies
susceptible_init = mpbdata(1,3,1,3)
inf_b4treat_init = mpbdata(1,3,13,15)
##########################################################################################################################
# Set Declaration
##########################################################################################################################
model = ConcreteModel()
Imax = 3
Jmax = 3
Tmax = 2
Kmax = 2
model.Iset = RangeSet(1,Imax) # e.g. i = {1, 2, 3}
model.Jset = RangeSet(1,Jmax)
model.Tset = RangeSet(1,Tmax)
model.Kset = RangeSet(1,Kmax)
##########################################################################################################################
# Parameter Declaration
##########################################################################################################################
##########################################################################################################################
# Variable Declaration
##########################################################################################################################
model.susceptible = Var(model.Iset,model.Jset,model.Tset, initialize=initial_values(3,2,susceptible_init))
model.inf_b4treat = Var(model.Iset,model.Jset,model.Tset, initialize=initial_values(3,2,inf_b4treat_init))
model.inf_treated = Var(model.Iset,model.Jset,model.Tset)
model.level1 = Var(model.Iset,model.Jset,model.Tset,within=Binary)
##########################################################################################################################
# Objective Function
##########################################################################################################################
def objective_rule(model,i,j,t):
return model.obj[i,j,t] == sum(2*model.inf_b4treat[i,j,t] for i in model.Iset for j in model.Jset for t in model.Tset)
model.damages = Objective(model.Iset, model.Jset, model.Tset, rule=objective_rule)
##########################################################################################################################
# Constraint Declaration w/ Imax=Jmax=Tmax = 3 and Kmax = 3
##########################################################################################################################
# Constraint 4: Susceptible recruitment
def susceptible_advance_rule(model, i, j, t):
if t == Tmax:
return Constraint.Skip
else:
return model.susceptible[i, j, t + 1] == model.susceptible[i, j, t] - model.inf_b4treat[i, j, t]
model.susceptible_advance = Constraint(model.Iset, model.Jset, model.Tset, rule=susceptible_advance_rule)
# Constraint 9: Treated Infestation
def treatment_rule(model, i, j, t):
return model.inf_treated[i, j, t] == 0.20 * model.susceptible[i, j,t] * (1 - 0.15 * model.level1[i, j, t])
model.treated_pop = Constraint(model.Iset, model.Jset, model.Tset, rule=treatment_rule)
解决方案
该objective_rule
函数应该返回一个表达式,您正在返回一个相等(好像它是一个约束)。
def objective_rule(model,i,j,t):
return sum(2*model.inf_b4treat[i,j,t] for i in model.Iset for j in model.Jset for t in model.Tset)
还要仔细检查您的输入数据是否正确。
推荐阅读
- javascript - 如何将参数传递给等待函数
- r - 有没有办法只选择部分匹配而不是精确匹配
- angular - 如何在 Angular 应用程序“没有 ControlContainerAngular 的提供者”中修复此错误
- python - Python 输入验证没有 if-else 或 isdigit 或尝试
- javascript - 如何在 url 中添加参数以在脚本之间传递数据
- c# - 当另一个事件即将发生时,如何调试事件处理程序?
- javascript - 阅读更多折叠脚本更改
- regex - 什么是正确的正则表达式从
- 标签具有 data-src 属性?
- algorithm - 如何找到一个数字的除数并按升序打印出来?
- java - 如何在aws中做java基础程序?