我正在学习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()
这只是我凌乱代码的简化,但是它使您了解我的问题。
那么有可能浏览列表以获取最佳变量值吗?
答案 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))