используя целлюлозу, Выбор проекта по некоторому ограничению

      |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')

Вторая проблема: прямо сейчас вам не хватает целевой функции ... все, что у вас есть, - это набор «верхних ограничений», а модель (по крайней мере, опубликованная вами часть) не имеет мотивации увеличивать (или назначать) проекты. У вас это как модель минимизации .... Что вы минимизируете?

Судя по тому, что вы описываете, вы, похоже, хотите выполнить максимальное количество проектов с учетом ваших ограничений. Поэтому для этого вы должны: добавить простую цель, которая представляет собой просто сумму проектов, и превратить проблему в проблему максимизации. Есть смысл?

Другие вопросы по тегам