如何根据公式在LPP纸浆中设置LpVariable和目标函数?

时间:2019-02-18 06:12:12

标签: python-3.x pulp

我想根据特定用户的兴趣计算其最大价值|人气|遵循线性规划问题(LPP)方程的兴趣和受欢迎度

enter image description here

在python3.7中使用纸浆包。

我有4个列表

  

兴趣= [5,10,15,20,25]

     

流行度= [4,8,12,16,20]

     

USER = [1,2,3,4,5]

     

cost = [2,4,6,8,10]

和2个变量值

  

e = 0.5; e可能取(0或1或0.5)

     

budget = 20

  

i = 0到n; n是列表的长度

表示要对所有列表值执行求和。

在这里,如果e == 0表示兴趣将为0;如果e == 1表示人气将为0;如果e == 0.5表示将考虑“价值”作为“兴趣和流行度”

xi也取0或1;如果xi == 1,则将考虑用户;如果xi == 0,则将不考虑用户。

和我的纸浆代码如下

from pulp import  *

INTEREST = [5,10,15,20,25]
POPULARITY = [4,8,12,16,20]
USER = [1,2,3,4,5]
cost = [2,4,6,8,10]

e=0.5    
budget=10

#PROBLEM VARIABLE
prob = LpProblem("MaxValue", LpMaximize)

# DECISION VARIABLE
int_vars = LpVariable.dicts("Interest", INTEREST,0,4,LpContinuous)

pop_vars = LpVariable.dicts("Popularity", 
           POPULARITY,0,4,LpContinuous)

user_vars = LpVariable.dicts("User", 
           USER,0,4,LpBinary)

#OBJECTIVE fUNCTION
prob += lpSum(USER(i)((INTEREST[i]*e for i in INTEREST) + 
        (POPULARITY[i]*(1-e)  for i in POPULARITY)))

#  CONSTRAINTS

prob += USER(i)cost(i) <= budget

#SOLVE
prob.solve()
print("Status : ",LpStatus[prob.status])

# PRINT OPTIMAL SOLUTION
print("The Max Value = ",value(prob.objective))

现在我遇到2个错误

  

1)第714行,在其他的e的addInPlace中:

     

2)第23行,在        概率+ = lpSum(INTEREST [i] e for i in INTEREST)+        lpSum(POPULARITY中的i的流行度(i)(1-e))        IndexError:列表索引超出范围

我在代码中做错了什么。指导我解决此问题。预先感谢。

1 个答案:

答案 0 :(得分:1)

我想我终于了解您要达到的目标。我认为您的描述问题与术语有关。在线性程序中,对于那些我们要选择或作为优化的一部分选择的变量,我们保留术语 variable

如果我正确理解了您的需求,则您的python变量ebudget将被视为线性程序的参数常数

我相信这可以满足您的需求

from pulp import  *
import numpy as np

INTEREST = [5,10,15,20,25]
POPULARITY = [4,8,12,16,20]
COST = [2,4,6,8,10]
N = len(COST)
set_user = range(N)

e=0.5    
budget=10

#PROBLEM VARIABLE
prob = LpProblem("MaxValue", LpMaximize)

# DECISION VARIABLE
x = LpVariable.dicts("user_selected", set_user, 0, 1, LpBinary)

# OBJECTIVE fUNCTION
prob += lpSum([x[i]*(INTEREST[i]*e + POPULARITY[i]*(1-e)) for i in set_user])

# CONSTRAINTS
prob += lpSum([x[i]*COST[i] for i in set_user]) <= budget

#SOLVE
prob.solve()
print("Status : ",LpStatus[prob.status])

# PRINT OPTIMAL SOLUTION
print("The Max Value = ",value(prob.objective))

# Show which users selected
x_soln = np.array([x[i].varValue for i in set_user])
print("user_vars: ")
print(x_soln)

应返回以下内容,即使用这些特定参数仅选择要包含的最后一个用户-但此决定将改变-例如,如果将预算增加到100,则将选择所有用户。

Status :  Optimal
The Max Value =  22.5
user_vars:
[0. 0. 0. 0. 1.]