I’m using MultiJuMP.jl to solve a MOO problem with 2 objectives, f1 and f2. Here, f1 is a continuous function to minimize, f2 is an integer function to maximize.
When I post
model.pointsperdim = 10, I got a pareto front with 10 points(in blue). Compared values of f1 for the same value of f2, the points linked with red line might be better. So I decrease the number of points to 7
The result with
model.pointsperdim = 7 is below, I got different result:
model.pointsperdim = 5, only 2 points in pareto front are catched:
Why this happens? How many points in pareto front are appropriate?
Hard to say without a reproducible example.
Are you sure you’re not trying to maximize the x axis and minimize the y axis?
Yes, I am sure with code below f1 should be min, f2 should be max
obj1 = SingleObjective(f1, sense = MOI.MIN_SENSE)
obj2 = SingleObjective(f2, sense = MOI.MAX_SENSE)
The result might due to the fact that the variables are not exactly integers. You can see in the table below, each column corresponds to one point in the pareto front plot. In my case, f2 is the sum of six elements(values for each row). As there are values of 0.99999999, f2 are not exactly equal to each other for the 5th point and the 6th point.
Why the value is not exactly binary? I have
@variable(model, time60[1:numtime], Bin)
It’s hard to say anything without a reproducible example.
Note that no solver will produce values which are exactly integers; they all use some sort of tolerance to check whether the value is “integer.” In this case, values like 0.999999 are expected.
Hard to say anything without knowing your model. For 2-MILP, the efficient solutions in the decision space may correspond to (1) points, (2) closed segments, and (3) opened/closed segments in the objective space, and these non-dominated “points” are not connected in general (see e.g. Multiple objective branch and bound for mixed 0-1 linear programming: Corrections and improvements for the biobjective case - ScienceDirect).