时间折叠:为特定实体对创建约束的最佳方式

问题描述 投票:0回答:1

我正在尝试在图形着色问题中使用时间折叠。

我想知道,创建约束“同一边缘上的点具有不同颜色”的最佳方法是什么。

现在我正在使用此代码:

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 不明白,哪些点对这个约束有影响。

有什么建议吗?

java constraints optaplanner timefold
1个回答
0
投票

如果一个点看起来像这样:

class Point {
    Set<Point> neighbors;
    boolean isNeighbor(Point other) {neighbors.contains(other)}
    ...
}

这样在调用

Set<Point> neighbors
之前就预先计算了
solve()
,代码可能足够快,不是吗?

© www.soinside.com 2019 - 2024. All rights reserved.