如何根据公式在 LPP 的纸浆中设置 LpVariable 和 Objective 函数?
How to set LpVariable and Objective Function in pulp for LPP as per the formula?
我想根据他的兴趣计算特定用户的最大化价值 |人气 |使用以下线性规划问题 (LPP) 方程
在 python3.7.
中使用 pulp 包
我有 4 个列表
INTEREST = [5,10,15,20,25]
POPULARITY = [4,8,12,16,20]
USER = [1,2,3,4,5]
cost = [2,4,6,8,10]
和2个变量值为
e=0.5 ; e may take (0 or 1 or 0.5)
budget=20
和
i=0 to n ; n is length of the list
表示,要对所有列表值执行求和。
这里如果e==0表示Interest将为0;如果 e==1 表示受欢迎程度为 0 ;如果 e==0.5 表示兴趣和受欢迎程度将被考虑为最大值
xi也取0或1;如果 xi==1 那么用户将被考虑 else 如果 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) line 714, in addInPlace for e in other:
2) line 23, in
prob += lpSum(INTEREST[i]e for i in INTEREST) +
lpSum(POPULARITY[i](1-e) for i in POPULARITY)
IndexError: list index out of range
我的代码做错了什么。指导我解决这个问题。提前致谢。
我想我终于明白你要达到什么目的了。我认为您描述的问题与术语有关。在线性程序中,我们为那些我们想要选择或选择作为优化一部分的变量保留术语变量。
如果我正确理解您的需求,您的 python 变量 e
和 budget
将被视为 参数 或 常量 的线性程序。
我相信这可以满足您的要求:
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)
以下内容应该 return,即使用这些特定参数,仅选择最后一个用户加入 - 但此决定将会改变 - 例如,如果您将预算增加到 100,则将选择所有用户。
Status : Optimal
The Max Value = 22.5
user_vars:
[0. 0. 0. 0. 1.]
我想根据他的兴趣计算特定用户的最大化价值 |人气 |使用以下线性规划问题 (LPP) 方程
在 python3.7.
中使用 pulp 包我有 4 个列表
INTEREST = [5,10,15,20,25]
POPULARITY = [4,8,12,16,20]
USER = [1,2,3,4,5]
cost = [2,4,6,8,10]
和2个变量值为
e=0.5 ; e may take (0 or 1 or 0.5)
budget=20
和
i=0 to n ; n is length of the list
表示,要对所有列表值执行求和。
这里如果e==0表示Interest将为0;如果 e==1 表示受欢迎程度为 0 ;如果 e==0.5 表示兴趣和受欢迎程度将被考虑为最大值
xi也取0或1;如果 xi==1 那么用户将被考虑 else 如果 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) line 714, in addInPlace for e in other:
2) line 23, in prob += lpSum(INTEREST[i]e for i in INTEREST) + lpSum(POPULARITY[i](1-e) for i in POPULARITY) IndexError: list index out of range
我的代码做错了什么。指导我解决这个问题。提前致谢。
我想我终于明白你要达到什么目的了。我认为您描述的问题与术语有关。在线性程序中,我们为那些我们想要选择或选择作为优化一部分的变量保留术语变量。
如果我正确理解您的需求,您的 python 变量 e
和 budget
将被视为 参数 或 常量 的线性程序。
我相信这可以满足您的要求:
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)
以下内容应该 return,即使用这些特定参数,仅选择最后一个用户加入 - 但此决定将会改变 - 例如,如果您将预算增加到 100,则将选择所有用户。
Status : Optimal
The Max Value = 22.5
user_vars:
[0. 0. 0. 0. 1.]