Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to add multi-objectives? #233

Open
0wenwu opened this issue Feb 21, 2024 · 6 comments
Open

How to add multi-objectives? #233

0wenwu opened this issue Feb 21, 2024 · 6 comments

Comments

@0wenwu
Copy link

0wenwu commented Feb 21, 2024

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
Copy link
Collaborator

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
Copy link
Author

0wenwu commented Feb 22, 2024

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
Copy link
Contributor

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
Copy link
Author

0wenwu commented Feb 22, 2024

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
Copy link
Collaborator

@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
Copy link
Author

0wenwu commented Feb 22, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants