TypeError:列表索引必须是整数或切片,而不是LpVariable

时间:2018-12-22 13:06:44

标签: python list optimization linear-programming pulp

我正在学习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 个答案:

答案 0 :(得分:2)

欢迎您!正如@Erwin指出的那样,您不能使用决策变量索引到python列表或数组中。

但是,您可以通过pulp库使用MILP从可能的值列表中进行选择。

执行此操作的方法有几种-一种是引入二进制变量列表以指示是否选择了每个选项(变量采用值1)或不选择(变量采用值{{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))