82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
"""
|
||
main.py - Основ
|
||
|
||
ный скрипт для создания графика смен
|
||
Использует модуль models.py для создания и решения модели
|
||
"""
|
||
from models import create_model, solve_model, get_solution, SHIFTS, OPERATORS
|
||
import csv
|
||
|
||
def generate_csv_report(schedule: dict, filename: str = 'shift_schedule.csv'):
|
||
"""
|
||
Генерирует CSV-отчет на основе расписания.
|
||
|
||
Аргументы:
|
||
schedule: словарь расписания из get_solution()
|
||
filename: имя файла для вывода CSV
|
||
|
||
Возвращает:
|
||
True если файл создан успешно
|
||
"""
|
||
with open(filename, 'w', newline='', encoding='utf-8') as file:
|
||
writer = csv.writer(file)
|
||
# Заголовок
|
||
writer.writerow(['День'] + [f'Смена {i+1}' for i in range(len(SHIFTS))])
|
||
|
||
for day, day_shifts in schedule.items():
|
||
row = [day]
|
||
for shift_idx in range(len(SHIFTS)):
|
||
op = None
|
||
for op_name in OPERATORS:
|
||
if schedule[day][shift_idx].get(op_name, False):
|
||
op = op_name
|
||
break
|
||
row.append(op)
|
||
writer.writerow(row)
|
||
|
||
print(f"График успешно составлен и сохранен в '{filename}'")
|
||
return True
|
||
|
||
def main():
|
||
"""
|
||
Главная функция: создает и решает модель, затем генерирует CSV-отчет.
|
||
"""
|
||
print("=" * 60)
|
||
print("Создание графика смен")
|
||
print("=" * 60)
|
||
|
||
# Шаг 1: Создаем модель
|
||
print("\n[1] Создание модели...")
|
||
model, variables, operators_set = create_model()
|
||
print(f" Модель создана с {len(variables)} переменными")
|
||
print(f" Операторы: {', '.join(operators_set)}")
|
||
|
||
# Шаг 2: Решаем модель
|
||
print("\n[2] Решение модели...")
|
||
success = solve_model()
|
||
|
||
if success:
|
||
print(" ✅ Модель решена успешно!")
|
||
|
||
# Шаг 3: Получаем решение
|
||
print("\n[3] Получение решения...")
|
||
schedule = get_solution()
|
||
print(f" Решение получено для {len(schedule)} дней")
|
||
|
||
# Шаг 4: Генерируем CSV-отчет
|
||
print("\n[4] Генерация CSV-отчета...")
|
||
generate_csv_report(schedule, 'shift_schedule.csv')
|
||
|
||
else:
|
||
print(" ❌ Не удалось составить график!")
|
||
print(" Проверьте ограничения и предпочтения операторов.")
|
||
return False
|
||
|
||
print("\n" + "=" * 60)
|
||
print("Готово!")
|
||
print("=" * 60)
|
||
|
||
return True
|
||
|
||
if __name__ == '__main__':
|
||
main() |