PULP: проверить настройку переменной на соответствие ограничениям - PullRequest
0 голосов
/ 01 мая 2018

Я хочу настроить проверку ограничений в Python, используя PULP. Предположим, у меня были переменные A1, .., Xn и ограничение (AffineExpression) A1X1 + ... + AnXn <= B, где A1, .., An и B - все постоянные. </p>

Учитывая назначение для X (например, X1 = 1, X2 = 4, ... Xn = 2), как я могу проверить, выполнены ли ограничения? Я знаю, как это сделать с матрицами, использующими Numpy, но мне интересно, можно ли это сделать с помощью PULP, чтобы библиотека справилась с работой.

Я надеюсь, что смогу проверить определенные назначения переменных. Я не хочу запускать алгоритм оптимизации проблемы (например, prob.solve ()).

Может ли PULP сделать это? Есть ли другая библиотека Python, которая была бы лучше? Я думал об инструментах Google OR, но обнаружил, что с документацией разобраться немного сложнее, чем с PULP.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Похоже, что это возможно сделать следующим образом:

  1. Определение переменных и ограничений PULP и добавление их в LpProblem
  2. Составьте словарь ваших назначений в виде {'имя переменной': значение}
  3. Используйте LpProblem.assignVarsVals (your_assignment_dict), чтобы назначить эти значения
  4. Запустите LpProblem.valid (), чтобы убедиться, что ваше назначение соответствует всем ограничениям и ограничениям переменных

Обратите внимание, что это почти наверняка будет медленнее, чем использование numpy и Ax <= b. Постановка проблемы может быть проще, но производительность будет снижаться из-за того, как PULP выполняет эти проверки. </p>

0 голосов
/ 01 мая 2018

Вы можете остаться в тупике и выполнить это. Глядя на одну строку из матрицы, вы можете установить строку A равной вектору, а затем создать сумму строк, которая позволит вам проверить индекс и определить, является ли он истинным. Например:

a = A[0, :]
row_sum = a*x
sum(row_sum) <= B[0]

Последняя строка вернет только True или False. Затем, если вы хотите изменить один индекс, вы можете обновить массив row_sum, используя

row_sum[3] = a[3]*new_val

и повторите анализ.

...