Как написать многоцелевую функцию в gurobi python - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над многоцелевой задачей оптимизации с использованием Gurobi с Python.

Вот часть моего кода, которая показывает, как я определяю целевую функцию:

model.setObjective( quicksum(w[k]*R[k]*3 for k in stations)
                   +quicksum(cost[l]*z[l,k] for l in L for k in stations),
                   GRB.MINIMIZE )

Я хочу несколько целей. Сначала я хочу оптимизировать первое слагаемое, затем второе.

1 Ответ

0 голосов
/ 14 мая 2019

Вы можете определить несколько целей в иерархическом порядке. Вот как бы вы это сделали:

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.

...