Как установить LpVariable и Objective Function в целлюлозе для LPP по формуле? - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу рассчитать максимальное значение конкретного пользователя на основе его интереса |Популярность |и интерес, и популярность, используя следующее уравнение задачи линейного программирования (LPP)

enter image description here

с использованием пакета целлюлозы в python3.7.

У меня есть4 списка

ИНТЕРЕС = = [5,10,15,20,25]

ПОПУЛЯРНОСТЬ = [4,8,12,16,20]

ПОЛЬЗОВАТЕЛЬ= [1,2,3,4,5]

стоимость = [2,4,6,8,10]

и 2 значения переменных как

е = 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 для e в другом:

2) строка 23, в prob + = lpSum (INTEREST [i] e дляi in INTEREST) ​​+ lpSum (POPULARITY [i] (1-e) для i in POPULARITY) IndexError: список индексов вне диапазона

Что я сделал неправильно в своем коде.Направь меня, чтобы решить эту проблему.Заранее спасибо.

1 Ответ

0 голосов
/ 20 февраля 2019

Мне кажется, я наконец понял, чего вы пытаетесь достичь.Я думаю, что проблема с вашим описанием связана с терминологией.В линейной программе мы зарезервируем термин переменная для тех переменных, которые мы хотим выбрать или выбрать как часть оптимизации.

Если я правильно понимаю ваши потребности в переменных 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)

Что должно возвращать следующее, то есть с этими конкретными параметрами только последний пользователь будет выбран для включения - но это решение изменится - например, если вы увеличите бюджет до 100, будут выбраны все пользователи.

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