Условное ограничение линейного программирования - PullRequest
0 голосов
/ 19 марта 2019

Есть 22 драйвера.Каждый водитель должен работать не менее 7,6 часов и может работать не более 10 часов.Стоимость каждого драйвера и производительность разные.

Если какой-то водитель работает сверхурочно (более 7,6 часов), за первые 2 часа нам нужно заплатить 1,5 раза.За оставшиеся 0,4 часа нам нужно заплатить 2 раза.

195 часов работы должны выполнить 22 водителя.Нам нужно составить расписание таким образом, чтобы затраты можно было минимизировать.

Driver,Cost,Productivity
A,70,0.8
B,22,0.8
C,24,0.8
D,26,0.8
E,28,0.8
F,30,0.8
G,32,0.8
H,34,0.8
I,36,0.8
J,38,0.8
K,40,0.8
L,42,0.9
M,44,0.9
N,46,0.9
O,48,0.9
P,50,0.9
Q,52,0.9
R,54,0.9
S,56,0.9
T,58,0.9
U,60,0.9
V,62,0.5

Переменные решения:

X1, X2 ........ X22 представляет общее количество часовназначается каждому водителю

Функция цели:

Мин. Z = 20 * X1 + 22 * ​​X2 ...... 62 * X22

Ограничения:

X1> = 7,6, X2> = 7,6 .... X22> = 7,6

X1 <= 10, X2 <= 10 .... X22 <= 10 </p>

X1 +X2 ..... + X22 <= 195 </p>

Я до сих пор пробовал следовать программе на Python.

import pulp
import pandas as pd


def main():
    model = pulp.LpProblem("Cost minimising scheduling problem", pulp.LpMinimize)

    totalHours = 192
    minHourEachDriver = 7.6
    maxHourEachDriver = 10

    # importing data from CSV

    drivers = pd.DataFrame.from_csv('csv/drivers.csv', index_col=['Driver', 'Cost', 'Productivity'])

    # Decision Variables
    drv = pulp.LpVariable.dicts("driverName", indexs=((i) for i, j, k in drivers.index), lowBound=0,
                                cat='Continuous')

    # Objective
    model += pulp.lpSum([j * (1 / k) * drv[i] for i, j, k in drivers.index]), "Cost"

    # Constraints

    # total no of hours work to be done
    model += pulp.lpSum([drv[i] for i, j, k in drivers.index]) == totalHours

    for i, j, k in drivers.index:
        # minimum hours driver has to work
        model += drv[i] >= minHourEachDriver
        # Maximum hour driver can work
        model += drv[i] <= maxHourEachDriver

    model.solve()

    # model status
    print(pulp.LpStatus[model.status])

    # Total Cost
    print(pulp.value(model.objective))

    # No of hrs allocated to each driver

    for i, j, k in drivers.index:
        var_value = drv[i].varValue
        # print(var_value)
        print("The number hours for driver {0} are {1}".format(i, var_value))


if __name__ == '__main__':
    main()

Но я не могу понять, как мы можем поставить следующиеограничение.

Если какой-то водитель работает сверхурочно (более 7,6 часов), за первые 2 часа нам нужно заплатить 1,5 раза.За оставшиеся 0,4 часа нам нужно заплатить 2 раза.

1 Ответ

1 голос
/ 19 марта 2019

Если для каждого водителя обязательно работает 7,6ч, то нет необходимости ставить его в условия.Это просто статическое время (стоимость), которое может быть вычтено из общего количества часов (затрат), потому что оно всегда происходит:

195 - (NumDrivers * 7.6) = - это оставшееся время, которое необходимо гибко распределить между водителями, каких сверхурочные часы достигают 195 часов (когда общее количество часов> NumDrivers * 7,6).

Я бы представлял каждого водителя с двумя переменными (одна для времени, работающего со скоростью 1,5, а вторая для двойного времени) исделать следующий LP:

Xij = представляет часы, выделенные i-драйверу в режиме j-работы (скажем, j = 1 для 1,5 и j = 2 для 2)

На основевходной файл:


Мин. Z = 70 * 1,5 * X11 + 70 * 2 * X12 + 22 * ​​1,5 * X21 + 22 * ​​2 * X22 + ... 62 * 1, 5 * X221 + 62 * 2 * X222

Ограничения:

X11 + X12 + X21 + X22 + ... X221 + X222 = 27,8 (195 - (22 * 7,6)))

X11 + X12 <= 3,4 X21 + X22 <= 3,4 ... X221 + X222 <= 3,4 </p>

X11 <= 2 X21 <= 2... X221 <= 2 </p>

Для полноты должен быть также набор условий, представляющих этоДрайвер ch может начать работу в режиме j (2 *) только после 2 часов при 1,5 *, но в этом случае целевая функция должна сделать это автоматически.

...