Вот ключевые части мой код:
1. Определения технических специалистов и устройств (domain.py):
Код: Выделить всё
@dataclass
class Technician:
id: int
name: str
rbh_to_plan: float
rbh_assigned: float
iums: Set[str]
# Technician class with available hours and skills
@planning_entity
@dataclass
class Device:
index: int
ium: str
technician: Technician | None = field(default=None)
# Devices assigned to technicians
Код: Выделить всё
def technician_capacity_hard(constraint_factory: ConstraintFactory):
return (constraint_factory
.for_each(Device)
.filter(lambda device: device.technician is not None)
.group_by(lambda device: device.technician, ConstraintCollectors.sum(lambda device: device.rbh_norm))
.filter(lambda technician, total_rbh_norm: total_rbh_norm > technician.rbh_to_plan)
.penalize(HardSoftScore.ONE_HARD)
.as_constraint("Technician capacity (hard constraint)"))
Код: Выделить всё
solver_factory = SolverFactory.create(
SolverConfig(
solution_class=DeviceSchedule,
entity_class_list=[Device],
score_director_factory_config=ScoreDirectorFactoryConfig(
constraint_provider_function=define_constraints # Enabling constraints
),
termination_config=TerminationConfig(
best_score_limit="0hard/1000soft",
spent_limit=Duration(minutes=1)
)
)
)
- Я распечатал общее количество назначенных часов (rbh_norm) для каждого техник,
и во многих случаях это значение превышает rbh_to_plan. - Показатель HardSoftScore.ONE_HARD используется для наказания жестких ограничений
нарушений, но похоже, что это так. не срабатывает правильно. - Мои мягкие ограничения, такие как вознаграждение за назначения технических специалистов,
работают должным образом.
- Почему жесткое ограничение на мощность технического специалиста не применяется
правильно?< /li>
Может ли возникнуть проблема с тем, как я группирую и суммирую значения rbh_norm
в ограничении? - Каковы наилучшие методы отладки проблемы с поставщиком ограничений
в Timefold?
Подробнее здесь: https://stackoverflow.com/questions/790 ... onstraints