Ошибка типа: индексы списка должны быть целыми числами или частями, а не LpVariable - PullRequest
0 голосов
/ 22 декабря 2018

Я изучаю кодирование на Python, а также использую pulp для оптимизации LP.У меня есть функция, которую мне нужно максимизировать, но похоже, что python / pulp не позволит моей переменной просматривать список.

turbiinit_lista = [0,1,2,3]

prob = LpProblem("Vesivoima", LpMaximize)
k = LpVariable("Test", 0, 3, LpInteger)

развернуть эту функцию

prob += (10*turbiinit_lista[k])-50-(350*turbiinit_lista[k])


prob.writeLP("Vesivoima.lp")
prob.solve()

Это простоупрощение моего грязного кода, но оно дает вам представление о моей проблеме.

Так можно ли просматривать список оптимальных значений переменных?

1 Ответ

0 голосов
/ 22 декабря 2018

Добро пожаловать на ТАК!Как отметил @Erwin, вы не можете использовать переменную решения для индексации в списке или массиве Python.

Однако вы можете использовать MILP через pulpбиблиотека для выбора из списка возможных значений.

Есть несколько способов сделать это - один из них - ввести список двоичных переменных, чтобы указать, выбран ли каждый из параметров (переменная принимает значение 1) или нет (переменная принимает значение 0), и следите за тем, чтобы точно один из них был истинным.

Используя этот подход, ваша проблема станет следующей.Обратите внимание, что choose_vars - это список двоичных переменных решения, которые отслеживают, какой из списка вариантов выбран, а chosen_value - это непрерывная переменная, которая ограничена выбранным значением.

from pulp import *
turbiinit_lista = [1.1,2.2,3.3,4.4]
n = len(turbiinit_lista)
N = range(n)

prob = LpProblem("Vesivoima", LpMaximize)
choose_vars = LpVariable.dicts("choose_%s", N, 0, 1, cat="Integer")
choosen_value = LpVariable("choosen")

prob += (10*choosen_value-50-(350*choosen_value))
prob += choosen_value == lpSum([turbiinit_lista[i]*choose_vars[i] for i in N])
prob += lpSum([choose_vars[i] for i in N]) == 1

prob.writeLP("Vesivoima.lp")
prob.solve()

choose_vars_soln = [choose_vars[i].varValue for i in N]
print("choose_vars_soln: " + str(choose_vars_soln))
print("choosen_value: " + str(choosen_value.varValue))

, котораявыходы:

choose_vars_soln: [1.0, 0.0, 0.0, 0.0]
choosen_value: 1.1
...