Timefold过约束规划中InitializingScoreTrend的适用性与配置咨询
InitializingScoreTrend 在过约束规划中的适用性与配置方案
适用性结论
InitializingScoreTrend 完全适用于过约束规划场景,尤其匹配你这种含单个实体、单个可空规划值,且采用Hard/Medium/Soft三级惩罚式评分的需求,它能引导求解器按你预期的评分趋势完成初始化与解搜索。
配置方法
针对你描述的评分变化规律,按以下步骤配置即可:
1. 明确各维度评分趋势
结合你的需求,三个评分维度的趋势定义如下:
- Hard评分:初始为0且始终无违反(维持0),趋势设为
ONLY_UP(评分只允许提升或保持) - Medium评分:初始是极低负值,分配合规值后趋近0(评分从负向提升),趋势设为
ONLY_UP - Soft评分:初始为0,后续通常变负但存在波动(可能下降或回升),趋势设为
ANY(无固定限制)
2. 代码/配置文件示例
Java注解配置
在你的规划实体类中,通过@PlanningScore注解指定趋势:
@PlanningScore( definitionClass = HardMediumSoftScoreDefinition.class, initializingScoreTrend = "ONLY_UP,ONLY_UP,ANY" ) private HardMediumSoftScore score;
XML配置
若使用XML配置求解器:
<scoreDefinitionType>HARD_MEDIUM_SOFT</scoreDefinitionType> <initializingScoreTrend>ONLY_UP,ONLY_UP,ANY</initializingScoreTrend>
注:字符串顺序严格对应Hard、Medium、Soft三个评分维度,每个维度可选值为ONLY_UP(评分仅能变好)、ONLY_DOWN(评分仅能变差)、ANY(无趋势限制)。
3. 约束逻辑适配可空值
要实现你描述的初始与动态评分效果,需在约束中区分未分配值和已分配值的场景:
- Hard约束:仅对已分配值中的违规情况扣分,未分配时不触发,因此初始Hard评分为0
- Medium约束:对未分配值直接施加高额惩罚(极低负值),已分配值仅在违反对应规则时扣分,分配合规值后评分趋近0
- Soft约束:未分配时不触发(得0),已分配值后根据规则扣分,因不同值的违规程度不同,会出现评分波动(比如部分值违规少,评分趋近0)
逻辑验证
- 求解启动时,实体未分配规划值:Medium约束触发高额惩罚,Hard和Soft约束无触发,符合你说的初始评分状态
- 分配值过程中:若值符合Medium约束要求,Medium评分从极低负向0提升;若分配的值违反Soft约束,Soft评分变负,后续调整到更优值时,Soft评分可能回升趋近0,匹配你提到的波动情况
内容的提问来源于stack exchange,提问作者Pezetter
相关产品推荐
相关产品推荐

