我正在尝试在图形着色问题中使用时间折叠。
我想知道,创建约束“同一边缘上的点具有不同颜色”的最佳方法是什么。
现在我正在使用此代码:
constraintFactory.forEachUniquePair(Point.class)
.filter(Point::isNeighbour)
.penalizeConfigurable((p1, p2) -> p1.getColor() == p2.getColor()?1:0)
.asConstraint(MainConstraintConfiguration.DIFFERENT_COLORS);
但是有一个问题:“isNeighbour”每次移动都会启动,而只在开始时启动就足够了。
我也尝试过这段代码:
constraintFactory.forEach(PointPair.class)
.penalizeConfigurable(pointPair -> pointPair.getPoint1().getColor() == pointPair.getPoint2().getColor()?1:0)
.asConstraint(MainConstraintConfiguration.DIFFERENT_COLORS);
地点:
@ProblemFactCollectionProperty
private List<PointPair> edges;
这段代码根本不起作用。分数不会对任何移动做出反应。我认为这是合理的,因为 timefold 不明白,哪些点对这个约束有影响。
有什么建议吗?
如果一个点看起来像这样:
class Point {
Set<Point> neighbors;
boolean isNeighbor(Point other) {neighbors.contains(other)}
...
}
这样在调用
Set<Point> neighbors
之前就预先计算了 solve()
,代码可能足够快,不是吗?