-
Notifications
You must be signed in to change notification settings - Fork 25
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
lexicographic (hierachical) multi-objective optimization #304
Comments
I like this idea Jeff! Personally, I like the first approach of adding a parameter. Maybe instead of This way current code would still work as the behavior wouldn't change. At least I think so. Would it break existing code to add another parameter like this? I don't think users would be too confused as long as the documentation explains things well. Maybe I'm off though. Would be great to get some feedback from users on this too. |
Yeah, I agree the first approach has its benefits. For example, (1) we don't need to introduce a new family of functions, (2) we don't need to update the One other thing to think about is that we might want to also add a parameter to allow the optimization process to degrade the primary/main objective by a relative amount. E.g., you might havbe a main objective of minimizing cost and a secondary objective of minimizing boundary length. In some cases, you might not want to accept any degradation (meaning that you want to reduce boundary length as much as possible, but don't make it any more costly). In other cases, you might want to accept a small amount of degredation (meaning that you want to reduce boundary length as much as possible, and you're happy for the cost to increase slightly [e.g. 5%]). So, if we wanted to add this, we would need to add an extra parameter too - so I don't know if/how that would influence our choice of API? |
Great points! Interesting idea about the additional parameter. I think that's a good idea and I don't think it influences the choice of API at least for me. What about you? |
Yeah, I worry that such a function could be confusing, because some parameters would only have an effect when other parameters are
This would turn into something like (where
So, to use blended optimization, it would be the same as usual, e.g.:
And for hierachical optimization, it would be something like this:
If we had the hierachical stuff in a different family of functions, then it would look something like this instead:
However, I'm not 100% happy with |
Hmmm, the way you describe things here makes me reconsider my initial preference. Given the potential for confusion of the approach to keep the functions and adding parameters, I am now favoring the Its still hard to say how much appetite for the |
I've been starting to use lexicographic (hierachical) multi-objective optimization a lot more in my own work, and I think it could potentially be useful to formally add this to prioritizr. For example, one of my projects involves doing a multi-objective prioritization that first uses the min shortfall objective and then minimizes cost. Although the calibrating trade-offs vignette shows how to do this manually, I wonder if there would be some way we could provide a more convienent API to do this?
I imagine one approach for implementing this could be to update all the
add_*_penalties()
functions so that users could specify whether the penalty should be treated as a blended or lexicographic objective for optimization. However, this would mean adding in extra parameters to the functions that may, or may not, have an effect depending on other parameters. For example, if we had newblended
parameter inadd_boundary_penalties()
, such thatblended = FALSE
means that the penalty should be treated as a lexicographic objective (instead of a blended objective), then thepenalty
parameter would have no effect. However, I worry this added complexity would confuse users?Alternatively, another approach for implementing this could be to create a new family of functions to handle lexicographic optimization. So, if users wanted to account for total boundary length using a blended optimization approach, they could still use
add_boundary_penalties()
. And if they wanted to account for total boundary length using a lexicographic optimization approach, they could use a new function (e.g.,add_boundary_${insert_something_clever}()
)?Or perhaps you can think of a better way to do this? Also, does anyone else think this would be useful? If you think the second option sounds better, can you think of what a new family of functions for lexicographic optimization should be called (i.e., the
${insert_something_clever}
in the function above)? I'm pretty busy at the moment so don't have time to implement this in the near future, but I thought it might be useful getting input from other people?The text was updated successfully, but these errors were encountered: