【问题标题】:How to set LpVariable and Objective Function in pulp for LPP as per the formula?如何根据公式为 LPP 设置纸浆中的 LpVariable 和目标函数?
【发布时间】:2019-02-18 06:12:11
【问题描述】:

我想根据他的兴趣计算特定用户的最大化价值 |人气 |使用以下线性规划问题(LPP)方程同时获得兴趣和流行度

在python3.7中使用pull包。

我有 4 个列表

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

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

用户 = [1,2,3,4,5]

成本 = [2,4,6,8,10]

和2个变量值作为

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

预算=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 行,在 addInPlace for e in other 中:

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

我在代码中做错了什么。指导我解决这个问题。提前致谢。

【问题讨论】:

  • 您的决策变量是什么 - 即您要选择什么?目前,您的固定成本为 5,与任何决策变量无关 - 成本将始终为 5,并且始终小于始终为 10 的预算,因此似乎有些不对劲。
  • 感谢您的回复。我对这个 LPP 编码概念很陌生。我使用一种在线材料编写了我的代码(我知道它可能是错误的)。我不知道如何按照我的公式构建纸浆(LPP)代码。根据公式兴趣和流行度是一个列表,而 e、成本、预算是一个正常变量。在我的问题中,我只给出了成本和预算的样本值。有时预算可能 >= 成本。 e 的值通常为 0,1,0.5。如果可能,请尝试根据我的公式更改我的代码。谢谢..
  • 您的公式没有显示成本如何随决策变量而变化。如果您解释一下您的应用程序可能会有所帮助 - 您要解决什么问题?
  • 根据您的说明,我修改了我的问题。请通过修改后的问题。希望现在您对我的申请有所了解。我知道我的代码可能是错误的。因此,如果可能的话,建议我为我的公式和问题描述提供纸浆(LPP)代码。谢谢。
  • 让我的应用程序始终考虑 xi==1.. 谢谢..

标签: python-3.x pulp


【解决方案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.]

【讨论】:

  • 非常感谢 kabdulla 花费您宝贵的时间提供宝贵的回答。现在我得到了输出,对于不同的值,它给出了不同的输出..谢谢..
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多