Search code examples
pythonpyomo

Model Detection of Multiple Objectives, But Only Trying To Write One


I have a fairly basic model that I am trying to run and I keep getting the following error message:

ERROR: Unexpected exception while running model: The NL writer has detected multiple active objective functions on model unknown, but currently only handles a single objective.

Given that error, I think that CPLEX is interpreting my objective function as a multi-objective problem. What I am trying to do is minimize 'model.obj' which is defined over the indices (i,j,t), but I don't believe this would mean that I have multiple objective functions? The objective function is trying to be formulated as equation 11 below:

enter image description here

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)

Solution

  • The objective_rule function should return an expression, you are returning an equality (as if it was a constraint).

    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)
    

    Also double check that your input data are correct.