Вы можете определить несколько целей в иерархическом порядке. Вот как бы вы это сделали:
model.setObjectiveN(quicksum(w[k]*R[k]*3 for k in stations), 0, 1)
model.setOjbectiveN(quicksum(cost[l]*z[l,k] for l in L for k in stations), 1, 0)
Этот код определяет две иерархические цели. Первый аргумент - это выражение (т.е. слагаемые в исходном коде), второй аргумент - это индекс цели, третий аргумент определяет приоритет. (Более высокий приоритет означает, что эта задача будет решена первой.) См. здесь для получения дополнительной информации о setObjectiveN.
По умолчанию Gurobi сворачивает, но вы также можете сделать это явно:
model.ModelSense = GRB.MINIMIZE
Когда вы вызываете Оптимизация, Gurobi решит модель с первой целью, затем добавит ограничение, которое гарантирует, что объективное значение этого ограничения не будет ухудшаться, и затем решит модель для второй цели.
Вы также можете разрешить определенное снижение качества, определив (абсолютные и / или относительные) допуски.
Вот дополнительная информация о работе с несколькими целями в Gurobi.