PyPSA / linopy

Linear optimization with N-D labeled arrays in Python
https://linopy.readthedocs.io
MIT License
154 stars 42 forks source link

How to add multi-objectives? #233

Open 0wenwu opened 4 months ago

0wenwu commented 4 months ago

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." )

FabianHofmann commented 4 months ago

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.

0wenwu commented 4 months ago

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?

aurelije commented 4 months ago

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

0wenwu commented 4 months ago

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?

FabianHofmann commented 4 months ago

@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 commented 4 months ago

@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.