Как использовать большие наборы данных с решателями нелинейной оптимизации в Python? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь решить проблему местоположения объекта, где у меня есть набор клиентов и набор потенциальных местоположений объекта.Хотя традиционная проблема является линейной, я преобразовал некоторые ограничения, и теперь у меня есть нелинейная проблема.

Я знаю, что существуют пакеты нелинейной оптимизации для Python, такие как SciPy, но я не понимаю, какЯ должен перебирать большие наборы.Могу ли я просто использовать цикл for для учета суммирования?И как мне учесть «для всех i в I» и «для всех j в J» в ограничении, как указано в следующем примере?

Цель: Макс: Z = ∑_i ∑_j (d_i* p_ij * a_ij * y_j)

Подлежит: p_ij = (u_ij * a_ij * y_j) / (∑_j (u_ij * a_ij * y_j)) ∀ i ∈ I, j ∈ J

y_j ∈ {0,1} ∀ j ∈ J

, где I - набор клиентов, а J - набор потенциальных местоположений объекта.д, а и у даны.p и y определяются моделью.

Может кто-нибудь объяснить мне, как использовать наборы в SciPy?Или, пожалуйста, пришлите мне пример кода с такой проблемой оптимизации, чтобы я мог видеть, как это делается.

Спасибо!

1 Ответ

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

Я не думаю, что scipy - это путь сюда.Вместо этого я бы предложил вам использовать PuLP ( link ), который предоставляет интерфейс для существенной трансляции вашей алгебраической модели в матрицы и векторы, которые может понять решатель.PuLP работает с несколькими различными решателями.Кроме того, вы можете использовать специальные пакеты Gurobi или CPLEX (gurobipy и docplex).В любом случае, эти пакеты предоставляют функции для выполнения цикла того типа, о котором вы спрашиваете.

Кроме того, как отметил @Erwin Kalvelagen, ваша модель может и должна быть линеаризована: просто умножьте обе стороны вашего ограниченияпо знаменателю.

...