Как установить переменную LpVariable и целевую функцию в пульпе для LPP по формуле?

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

введите здесь описание изображения

с использованием пакета pulp в 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; е может принимать (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 в INTEREST) ​​+ lpSum (POPULARITY [i] (1-e) для i в POPULARITY) IndexError: вывод списка индекса диапазона

Что я сделал не так в своем коде. Помогите мне решить эту проблему. Заранее спасибо.


person user1999109    schedule 18.02.2019    source источник
comment
Какова ваша переменная решения, то есть что вы пытаетесь выбрать? На данный момент у вас есть фиксированная стоимость 5, которая не имеет отношения к каким-либо переменным решения - стоимость всегда будет 5 и всегда будет меньше бюджета, который всегда равен 10, поэтому что-то кажется неправильным.   -  person kabdulla    schedule 18.02.2019
comment
Спасибо за ваш ответ. Я очень новичок в этой концепции кодирования LPP. Используя один онлайн-материал, я написал свой код (я знаю, что он может ошибаться). Я не знаю, как оформить код целлюлозы (LPP) по моей формуле. Согласно формуле «Интерес» и «Популярность» - это список, а e, стоимость, бюджет - это обычная переменная. В моем вопросе я дал только примерное значение стоимости и бюджета. иногда бюджет может ›= стоимость. e обычно имеет значение 0,1,0,5. Если возможно, попробуйте изменить мой код в соответствии с моей формулой. Спасибо..   -  person user1999109    schedule 19.02.2019
comment
Ваша формулировка не показывает, как стоимость зависит от переменных решения. Возможно, вы объясните свое приложение - какую проблему вы пытаетесь решить?   -  person kabdulla    schedule 19.02.2019
comment
В соответствии с вашим разъяснением я изменил свой вопрос. Просмотрите измененный вопрос. Надеюсь, теперь вы получили представление о моем приложении. Я знаю, что мой код может быть неправильным. Поэтому, если возможно, предложите мне код целлюлозы (LPP) для моей формулы и описания вопроса. Спасибо.   -  person user1999109    schedule 20.02.2019
comment
пусть считают xi == 1 всегда для моего приложения .. Спасибо ..   -  person user1999109    schedule 20.02.2019


Ответы (1)


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

Если я правильно понимаю ваши потребности, ваши переменные 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.]
person kabdulla    schedule 20.02.2019
comment
Большое спасибо kabdulla за ваш ценный ответ и потраченное драгоценное время. Теперь я получаю результат, и для разных значений он дает другой результат .. Спасибо .. - person user1999109; 21.02.2019