Multi-objective scheduling end-to-end
Set up a job with two competing objectives and read the Pareto front.
A real scheduling problem usually has more than one thing you care about. Minimise the total makespan, maximise the on-time delivery rate, and minimise overtime hours are three competing goals that frequently appear together. Pursuing one in isolation will hurt the others, and a single weighted-sum fitness hides the trade-offs.
This recipe walks you through running the same problem as a multi-objective optimisation and reading the result.
1. Pick the multi-objective quick form¶
From the dashboard, open Quick start โ Multi-objective optimisation. You can also use this recipe with the full submission form โ the parameter set is the same.
2. Tell Vilvik how many objectives you have¶
Set num_objectives to the number of things you're optimising. On the quick form the value is a numeric input next to the title; on the full form it's a top-of-page parameter.
You can give each objective a human-readable name in the Objective names field. They show up everywhere the result page renders an objective (Pareto explorer, parameter importance chart, results list). Leave it blank if you only care about positional labels.
3. Encode each objective in the fitness function¶
PyGAD's MOO mode expects your fitness_func to return a list of objective values โ one per objective in the order they appear in num_objectives. A scheduling fitness might look like:
def fitness_func(ga, solution, solution_idx):
makespan = _compute_makespan(solution)
on_time_pct = _compute_on_time_pct(solution)
overtime_hrs = _compute_overtime(solution)
return [
-makespan, # minimise -> negate
on_time_pct, # maximise as-is
-overtime_hrs, # minimise -> negate
]
The sign convention is higher = better per slot, so anything you want to minimise should be negated before returning.
4. Run and read the Pareto front¶
After the run completes, the result page renders a Pareto front explorer: each dot is one non-dominated solution. Hover any dot to see its objective vector and the genes that produced it.
Two charts pair nicely with the Pareto front:
- Parameter importance (added in cookbook recipe 3 below) โ shows which inputs are most sensitive per objective, not just overall.
- Fitness boxplot โ surfaces objectives that the algorithm is comfortable with vs. ones it never improves on; a tight boxplot on one axis usually means that objective is over-constrained.
5. Pick a winner¶
Multi-objective doesn't give you a single answer โ it gives you a frontier. The "right" trade-off depends on policy. A typical workflow:
- Select two or three Pareto points that look promising.
- Click "Continue execution as a copy" on each (the result page exposes this when the owner has enabled it).
- Run a few more generations focused on the part of the search space that produced those points.
Related¶
- Reading a result โ full result-page guide.
- Using the parameter-importance chart โ interpret the per-objective sensitivity chart that ships with every MOO result.