Как реализовать ограничение временного тракта с помощью вспомогательной функции? print () неожиданное поведениеJAVA

Программисты JAVA общаются здесь
Anonymous
Как реализовать ограничение временного тракта с помощью вспомогательной функции? print () неожиданное поведение

Сообщение Anonymous »

Проблема: планирование работников на двухчасовые смены. Цель состоит в том, чтобы максимизировать количество сдвигов, которые каждый работник завершает в течение 8-часового рабочего периода. Рабочий период для каждого сотрудника начинается с первой смены и должен сопровождаться обязательным 10-часовым периодом отдыха. Кроме того, не должно быть перекрывающихся сдвигов, назначенных одному и тому же рабочему. Домен и основные ограничения одинаковы, включая: < /p>
required_skill(constraint_factory)
no_overlapping_shifts(constraint_factory)
unavailable_employee(constraint_factory)
undesired_day_for_employee(constraint_factory)
desired_day_for_employee(constraint_factory)
< /code>
Кроме того, я реализовал пользовательское ограничение: < /p>
enforce_10_hour_rest_period(constraint_factory)
< /code>
Код ограничения: < /p>
def enforce_10_hour_rest_period(constraint_factory):

return (
constraint_factory.for_each(Shift)
.filter(lambda shift: shift.employee is not None)
.group_by(
lambda shift: shift.employee, ConstraintCollectors.to_list())
.map(lambda employee_name, shifts: calculate_insufficient_breaks(employee_name, sorted(shifts, key=lambda sh: sh.start)))
.penalize(
HardSoftDecimalScore.ONE_HARD,
lambda insufficient_breaks: insufficient_breaks
)
.as_constraint("10-hour rest period after 8-hour working period")
)
< /code>
Код функции вспомогательной: < /p>
def rest_period_sufficient(last_shift_end, next_shift_start):
return (next_shift_start - last_shift_end).total_seconds() >= 10 * 3600

def calculate_insufficient_breaks(employee, shifts):
filtered_shifts = [shift for shift in shifts if shift.employee.name == employee.name]
l = len(filtered_shifts)
if len(filtered_shifts) < 2:
return 0

insufficient_breaks = 0
working_period_end = filtered_shifts[0].start + timedelta(hours=8)

#delete print line
print(f"working period start: {filtered_shifts[0].start}, working period end {working_period_end}")

for i in range(1, l):
#delete print line
print(f"start: {filtered_shifts.start}, end: {filtered_shifts.end} ")

if filtered_shifts.end >= working_period_end:
if not rest_period_sufficient(working_period_end, filtered_shifts.start):
insufficient_breaks += 1
working_period_end = filtered_shifts.start + timedelta(hours=8)
return insufficient_breaks
< /code>
Вопросы: < /p>
  • Проблема: в функции Calculate_Insuffict_breaks, если я печатаю shift.employee.name значения i получит разные имена сотрудников. Хотя фильтрация представляется необходимой, неясно, почему это происходит, учитывая группу, используемой в функции Searce_10_HOUR_REST_PERIOD. Кроме того, я заметил, что удаление первой линии печати - алгоритм (ограничение) не работает, промежутки не 10 часов. И если я удалю второй оператор печати, я получу следующее исключение: typeerror: rest_period_suffict () получил неожиданный аргумент ключевого слова Полем Почему это происходит? Является ли моя текущая реализация подходящей, или есть более эффективный подход к определению этого ограничения? :

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

    Есть ли оптимальный способ к Создать это ограничение в сфере времени?


Подробнее здесь: https://stackoverflow.com/questions/794 ... xpected-be

Вернуться в «JAVA»