Ошибка типа: индексы списка должны быть целыми числами или частями, а не LpVariable
Я изучаю программирование на Python, а также использую целлюлозу для оптимизации 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 ответ
Добро пожаловать на ТАК! Как отметил @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