Ошибка типа: индексы списка должны быть целыми числами или частями, а не 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
Другие вопросы по тегам