используя целлюлозу, Выбор проекта по некоторому ограничению
|project|loc_Bangalore|loc_Pune|cat_s|cat_c|
|:------|:-----------:|:------:|:---:|:---:|
|abc |1 |0 |0 |1 |
|Sys |1 |0 |0 |1 |
|Syst |0 |1 |1 |0 |
|EPS |1 |0 |0 |1 |
|foss |1 |0 |0 |1 |
|opc |0 |1 |1 |0 |
дано
Выше df 1 - истина, а 0 - ложь. Мне нужно выбрать проект из приведенной выше таблицы, который удовлетворяет следующему условию:1. общее количество выбранных проектов <=4((проект местоположения banglore + проект местоположения пуны + проект cat_s + проект cat_c)<=4)
2.В выбранном проекте:1. проект локации банглора <=32. проект локации пуна <=13. проект cat_s <=14. проект cat_c <=3
Решение пробовали
prob = LpProblem("choose project", LpMinimize)
project_list = list(df['project'])
banglore = dict(zip(project_list,df['loc_Bangalore']))
pune = dict(zip(project_list,df['loc_Pune']))
c = dict(zip(project_list,df['cat_C']))
s = dict(zip(project_list,df['cat_S']))
proj_vars = pulp.LpVariable.dicts("project",project_list,cat='Integer')
no_of_project_choose = 4
prob += pulp.lpSum([proj_vars[f] for f in project_list])<=no_of_project_choose
prob += pulp.lpSum([banglore[f] * proj_vars[f] for f in project_list]) <= 3
prob += pulp.lpSum([pune[f] * proj_vars[f] for f in project_list]) <=1
prob += pulp.lpSum([c[f] * proj_vars[f] for f in project_list]) <=3
prob += pulp.lpSum([s[f] * proj_vars[f] for f in project_list]) <=1
prob.solve()
проблема
Я пробовал вышеуказанное решение, но получил более 4 проектов. Как мне понять это, пожалуйста, помогите мне. Если у них есть какой-либо другой способ, предложите мне это также, пожалуйста.
1 ответ
Думаю, вы близки. Вы не показали, какой ответ получаете сверху, но я предполагаю, что вы получаете кучу диких целочисленных значений, включая отрицательные, потому что ваша переменная решения не имеет границ, поэтому она может выбирать -568 проектов в области __ .
Первая проблема: когда переменная представляет решение типа «да / нет», вы должны сделать ее двоичной переменной. Измените это:
proj_vars = pulp.LpVariable.dicts("project",project_list,cat='Integer')
к:
proj_vars = pulp.LpVariable.dicts("project",project_list,cat='Binary')
Вторая проблема: прямо сейчас вам не хватает целевой функции ... все, что у вас есть, - это набор «верхних ограничений», а модель (по крайней мере, опубликованная вами часть) не имеет мотивации увеличивать (или назначать) проекты. У вас это как модель минимизации .... Что вы минимизируете?
Судя по тому, что вы описываете, вы, похоже, хотите выполнить максимальное количество проектов с учетом ваших ограничений. Поэтому для этого вы должны: добавить простую цель, которая представляет собой просто сумму проектов, и превратить проблему в проблему максимизации. Есть смысл?