Соотнесение ограничений с целью в PULP - PullRequest
0 голосов
/ 03 декабря 2018

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

У меня есть спрос, время, затраченное каждой технологией, список техникови т. д. в отдельных фреймах данных.

Я могу найти количество экзаменов для минимизации цели, однако я хочу добавить ограничение на максимальное количество технологий, которое будет использоваться как 8.

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

Ниже приведен мой код:

model = pulp.LpProblem("Time minimizing problem", pulp.LpMinimize)

capacity = pulp.LpVariable.dicts("capacity",
                             ((examdate , techname, region) for examdate, techname, region in tech_data_new.index),
                             lowBound=0,
                             cat='Integer')

for examdate, techname,region in tech_data_new.index:
var = capacity[(examdate,techname,region)]
var.upBound = tech_data_new.loc[(examdate,techname,region), 'Max Capacity']


model += pulp.lpSum(capacity[examdate,techname, region] * tech_data_new.loc[(examdate,techname, region), 'Time taken'] for examdate,techname, region in tech_data_new.index)

for date in demand_data.index.get_level_values('Exam Date').unique():
    for i in demand_data.loc[date].index.tolist():
         model += pulp.lpSum([capacity[examdate,techname,region] for examdate, techname, region in tech_data_new.index 
if (date == examdate and i == region)]) == demand_data.loc[(demand_data.index.get_level_values('Exam Date') == date) & (demand_data.index.get_level_values('Body Region') == i), shiftname].item()

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

techs = pulp.LpVariable.dicts("techs",
                                 (techname for techname in tech_data_new.index.get_level_values('Technologist Name').unique()),

                                 cat='Binary')

days = pulp.LpVariable.dicts("day",
                             (examdate for examdate in tech_data_new.index.get_level_values('Exam Date').unique()),

                             cat='Binary')

Любое преимущество будет оценено.Заранее спасибо.Пожалуйста, дайте мне знать, если требуется какая-либо другая поддержка.

1 Ответ

0 голосов
/ 16 декабря 2018

Если вы хотите установить ограничение для каждого examdate, а целочисленные переменные capacity, которые имеют индексы (examdate, techname, region), представляют количество экзаменов, которые каждый техник сдает на каждую дату в каждом регионе, тогда я бы создалнабор двоичных переменных tech_used, которые проиндексированы (examdate, techname), которые представляют, используется ли технология достижения каждый день.

После определения этих переменных вам нужно установить ограничения, чтобы они работали должным образом ... при условии, что списки examdates, technames, regions были должным образом объявлены:

for examdate in examdates:
    for techname in technames:
        model += Lp.sum([capacity[examdate, techname, region] for region in regions]) < max_capacity*tech_used(examdate, techname)

Обратите внимание, что в приведенном выше max_capacity должна быть емкость для каждой технологии, и эти ограничения могут заменить ограничения максимальной мощности, которые вы установили в другом месте.

Тогда вам просто нужно установить ограничение на количество технологий не более 8:

for examdate in examdates:
    model += Lp.sum([tech_used[examdate, techname] for techname in technames])  <= 8
...