Как расширить ограничения, чтобы включить максимальное рабочее время в течение 48 часов? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть скрипт, который планирует X рабочих в реестре 24/7 в соответствии с количеством ограничений Y.Выходными данными является 24-часовой график работы каждого работника, который повторяется каждый день.

Текущие ограничения включают в себя максимальное количество последовательных часов работы на машине, максимальное совокупное количество часов работы на машине в день, максимальное присутствие на работе (часы на машине+ перерывы на работе).

Мой вопрос заключается в том, как ввести ограничение, ограничивающее совокупное количество часов работы на машине каждые 48 часов (или два дня) и вводящее обязательный выходной день через каждые шесть дней.

//these are the current parameters
param1 = {
    "nWorkers": 9, //no. of workers
    "nHours":24, //no. of hours in a day
    "maxContinuousOnMachine": 2, //consecutive onMachine
    "maxMachineHours": 6, //cumulative onMachine per day
    "maxHoursAtWork": 8 //onMachine+Breaks during Wrok
}
params.append(param1)

//below are functions that shows how the constraints are currently executed
def start_end(worker):
    start, end = -1,-1
    for i in range(len(worker)):
        if worker[i] == 1:
            start = i
            break
    for i in reversed(range(len(worker))):
        if worker[i] == 1:
            end = i
            break
    return start, end

def max_consec(worker, maxContinuousOnMachine):
    consec = 0
    for i in range(len(worker)):
        if worker[i]:
            consec +=1
        else:
            consec = 0
        if consec > maxContinuousOnMachine:
            logging.info("fail in maxContinuousOnMachine")
            return False
    return True

def max_presence(worker, maxHoursAtWork):
    start, end = start_end(worker)
    logging.info("Start: %s End: %s", str(start), str(end))
    if end - start + 1 > maxHoursAtWork:
        logging.info("fail in maxHoursAtWork")
        return False
    return True

def max_hours(worker, maxMachineHours, maxHoursAtWork):
    if sum(worker) > maxMachineHours:
        return False

    start, end = start_end(worker)

    logging.info("Start: %s End: %s", str(start), str(end))
    if end - start > math.ceil(maxMachineHours + maxHoursAtWork*0.2):
        logging.info("fail in maxMachineHours")
        return False
    return True

# check that the worker can work in the new hour and all constraints are satisfied.
def can_work(worker, hour, constraints):
    if worker[hour] == 1:
        return False
    worker[hour] = 1
    if not max_consec(worker, constraints["maxContinuousOnMachine"]) or not max_presence(worker, constraints["maxHoursAtWork"]) or \
            not max_hours(worker, constraints["maxMachineHours"], constraints["maxHoursAtWork"]) or not consec_and_rest(worker, constraints["maxContinuousOnMachine"]):
        return False
    return True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...