PyPSA/linopy

How to add multi-objectives?

Opened this issue · 6 comments

According to the source code, only one objective can be added to a model. Instead of converting to single objective, how to optimize multi-objective problems?

if not overwrite:
assert self.objective.expression.empty(), (
"Objective already defined."
" Set overwrite to True to force overwriting."
)

Hey @0wenwu, thank you for your comment. Multiple objective are not supported yet. However, this feature will not be difficult to implement. It is just that we haven't been in need of it so far, and I'm honestly not sure when I would have time to deal with it.

Hey @0wenwu, thank you for your comment. Multiple objective are not supported yet. However, this feature will not be difficult to implement. It is just that we haven't been in need of it so far, and I'm honestly not sure when I would have time to deal with it.

Thank you for your reply. Indeed, I hava faced an multi-objective optimization problem considering hydro generation maximization and transimission loss minization while using PyPSA. Can you provide some suggestions to implement the feature?

If you do not need hierarchical MO solution (meaning multiple calls to solver if implemented by linopy or using specific api from solvers supporting it) you can just blend your multiple objectives in one objective by summing them and multiplying by weight

If you do not need hierarchical MO solution (meaning multiple calls to solver if implemented by linopy or using specific api from solvers supporting it) you can just blend your multiple objectives in one objective by summing them and multiplying by weight

Thx, hierarchical MO solution means call solvers several times as below:

m.add_objective(obj1)
n.optimize.solve_model()
m.add_objective(obj2)
n.optimize.solve_model()

Does it work?

@0wenwu I think @aurelije meant, packing all in one objective but with weights.

If you want to tackle the multiobjective support in linopy, I would propose to create a new class MultiObjective which serves as a container of multiple Objective objects. These could be stores in a dictionary under the hood. I don't have time to make a draft, but I am happy to support.

@0wenwu I think @aurelije meant, packing all in one objective but with weights.

If you want to tackle the multiobjective support in linopy, I would propose to create a new class MultiObjective which serves as a container of multiple Objective objects. These could be stores in a dictionary under the hood. I don't have time to make a draft, but I am happy to support.

Thank you for your excellent job.
Sorry for troubling you. It is my first time to use linopy, so it is hard for me to modify the source code in a short time.
As you know, the weights is difficult to determine while packing all in one objective. It is better to solve the problem in term of multi-objectives originally.