Considering multi objective vs iterative single objective
AnsweredI have a utility function I want to minimize in my MILP, and I have an (integer) budget variable that influences utility.
If I model the problem as a single objective problem, then my budget is exhausted every time I solve it.
model.setObjective(utility, sense="minimize")
One way I am comfortable optimizing utility with the lowest budget is to solve my model iteratively.
BUDGET = 1I am considering reframing my model such that budget is a decision variable in a multi-objective problem.
while BUDGET < len(MAX_BUDGET):
run_model()
if model.status == GRB.Status.OPTIMAL:
break
BUDGET += 1
m.setObjectiveN(utility, 0, priorety=0)
m.setObjectiveN(budget, 1, priorety=1)
-
If I define the objectives below, will they have the same effect as the loop above?
No, the effect is slightly different.
You compute a Pareto front with your loop. Your approach can be seen as an alteration of the \(\epsilon\)-method. It computes several points on the Pareto front of a multi-objective optimization problem. Thus, you as the decision maker have the freedom of choice between multiple optimal solution with varying budget/utility relationships.
Gurobi will compute exactly one point on the Pareto front. It will optimize for budget first, then add a constraint to the model which does not allow to degrade the budget up to some tolerance, and finally optimize for utility. This means that Gurobi will provide the optimal point where the budget is at its minimum and you will not have the choice that you have in your first approach. For more details on Gurobi's multi-objective feature, please refer to the documentation.
Your approach is often a better one as it provides more flexibility of choice. However, if each optimization takes a long time then using Gurobi's multi-objective feature may be the way to go.
Best regards,
Jaromił0
Please sign in to leave a comment.
Comments
1 comment