Java 在解决方案级别计算转换

Java 在解决方案级别计算转换,java,optaplanner,Java,Optaplanner,在我的调度问题中,我必须在每次移动时计算位于规划实体中的变量的转换次数 此变量反映了系统的状态,可以在检查问题中查看,因为计算房间从已使用变为未使用的次数 这种计算很难用Drools来描述,所以我想找到另一种方法。我试图在解决方案类级别的方法上使用@ProblemFactCollectionProperty,但它似乎没有被足够的调用来准确地计算转换 方法上的@ProblemFactCollectionProperty是实现这一点的好方法,还是有其他方法 当然,这背后的目标是最小化转换的数量 编辑

在我的调度问题中,我必须在每次移动时计算位于规划实体中的变量的转换次数

此变量反映了系统的状态,可以在检查问题中查看,因为计算房间从已使用变为未使用的次数

这种计算很难用Drools来描述,所以我想找到另一种方法。我试图在解决方案类级别的方法上使用
@ProblemFactCollectionProperty
,但它似乎没有被足够的调用来准确地计算转换

方法上的
@ProblemFactCollectionProperty
是实现这一点的好方法,还是有其他方法

当然,这背后的目标是最小化转换的数量

编辑


何时调用此类
@ProblemFactCollectionProperty
方法?在规划解决方案克隆时或每次我访问Drools规则中的事实时?

solvingStarted()
期间调用
@ProblemFactCollectionProperty
方法,而不是在规划克隆期间或在分数计算期间

Drools/ConstraintStreams分数计算需要它,但只有一次(至少在单线程、非重复求解中)来填充工作事实


计划克隆不会影响分数计算,因为它会从工作解决方案克隆到新的最佳解决方案(因此工作解决方案不会被修改,分数主管也不会注意到).

也许影子变量可能有用-那么drools规则就可以在这些变量之上工作。我考虑过这一点,但我的问题是,在聚合每个
@PlanningEntity
对象的状态时,是否可以在
@PlanningSolution
类中放置影子变量?第二个问题是在我更新的问题中。它应该可以工作,但出于设计原因,我不会在规划解决方案中添加阴影变量:只需创建一个新类,并将其添加为规划解决方案中具有@PlanningEntityProperty(其中没有“Collection”一词)的单例。因此,我需要使用指向实体列表的属性来创建它,以便在规则中每次需要它时执行计算。我说得对吗?我还是有点不明白。我的转换插入不必在计划实体中的状态变量每次更改时计算,而只需在分数计算作为当前解决方案的状态启动之前计算一次。在ScoreDirector类的重写calculateScore方法中调用这些插入而不是使用阴影不是更有趣吗?