OptaPlanner - 将匹配限制为 x 数量
OptaPlanner - restricting matches to x amount
我对 OptaPlanner 比较陌生,Java 总的来说 - 但希望这是有道理的。我想做的是匹配 Client
到 Associate
- 我想做的是确保所说的 Associate
只能有 X 数量的客户分配给他们。我的域现在非常简单,因为它只是 Associate
和 ClientAssignment
(其中包含所有客户信息)以及将它们映射在一起的计划 solution/constraints。
问题:
我如何推断已经 'matched' 的内容以获得计数?
我假设您正在使用 Constraint Streams API 来实现您的评分功能。如果是这样,下面的代码应该可以让您了解如何实现您的需要:
.from(ClientAssignment.class)
.groupBy(ClientAssignment::getAssociate,
ConstraintCollectors.count())
.filter((associate, assignmentCount) -> assignmentCount > MAX_ALLOWED_CLIENT_COUNT)
.penalize("Overloaded associate",
HardSoftScore.ONE_HARD,
(associate, assignmentCount) -> assignmentCount - MAX_ALLOWED_CLIENT_COUNT)
显然,我对您的数据模型的外观做了一些假设。具体来说,我假设 ClientAssignment
是一对独特的 Client
和 Associate
。如果该假设不正确,请在您的问题中更具体,我将编辑我的答案。
此外,您应该将 HardSoftScore.ONE_HARD
替换为您认为适用于您的问题的任何惩罚,在您需要的任何 Score
类型中。
我对 OptaPlanner 比较陌生,Java 总的来说 - 但希望这是有道理的。我想做的是匹配 Client
到 Associate
- 我想做的是确保所说的 Associate
只能有 X 数量的客户分配给他们。我的域现在非常简单,因为它只是 Associate
和 ClientAssignment
(其中包含所有客户信息)以及将它们映射在一起的计划 solution/constraints。
问题:
我如何推断已经 'matched' 的内容以获得计数?
我假设您正在使用 Constraint Streams API 来实现您的评分功能。如果是这样,下面的代码应该可以让您了解如何实现您的需要:
.from(ClientAssignment.class)
.groupBy(ClientAssignment::getAssociate,
ConstraintCollectors.count())
.filter((associate, assignmentCount) -> assignmentCount > MAX_ALLOWED_CLIENT_COUNT)
.penalize("Overloaded associate",
HardSoftScore.ONE_HARD,
(associate, assignmentCount) -> assignmentCount - MAX_ALLOWED_CLIENT_COUNT)
显然,我对您的数据模型的外观做了一些假设。具体来说,我假设 ClientAssignment
是一对独特的 Client
和 Associate
。如果该假设不正确,请在您的问题中更具体,我将编辑我的答案。
此外,您应该将 HardSoftScore.ONE_HARD
替换为您认为适用于您的问题的任何惩罚,在您需要的任何 Score
类型中。