optaplanner不更改计划变量

xurqigkl  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(223)

我正在处理optaplanner的优化问题。我觉得我没有正确地设计我的计划实体或变量。也许有人会说他们对以下案例的看法:
实体:原则上,这是一个相当简单的问题。有许多仓库只储存一种产品,可以接收产品或在指定的运输路线上供应其他仓库。我们称之为节点。

class Node
   int upperBoundary
   int lowerBoundary
   int items
   String name

每条运输路线可以运输所有产品。你可以把问题想象成一个矩阵或一棵树。我将矩阵的单元定义为规划实体。计划变量是单元格上的整数值。我们称之为加权边。在我的解题课上 List<Edge> edges. ```
E1 E2 E3 ... En
N1 1 0 0 2
N2 3 1 3 1
N3 0 1 0 0
...
Nn 1 1 0 0

@PlanningEntity
class WeightedEdge
Node from
Node to

@PlanningVariable
Integer items (nullable)

int minCapacity
int maxCapacity

在我的例子中,我现在有大约450个加权边。它们都有最小值和最大值。这些是正确识别的。

Node a min 0 max 40
Node b min 0 max 20 uws.

如果我现在运行一个基准测试,它会精确地将各个节点的数量范围之和显示为“问题规模”。在上面的例子中是60。
但问题是,规划变量具有依赖性。因此,我是否为a输入39,为b输入20是有区别的。或者a是38,b是20。这给了我800个可能性。有人知道这种结构的设计错误在哪里吗?
评分功能的目的是平衡节点,使计划期过后节点的项目数量介于上下限之间。为此,我正在使用constraintprovider。
softscore=通过整个网络在每个站点上对多个或对少个项目的总和
---编辑---
按照建议,我将环境模式更改为full\ u assert。使用此配置,解算器将抛出一个错误:
在这种模式下,它会抛出一个错误。我的移动已损坏:

Caused by: java.lang.IllegalStateException: UndoMove corruption (1soft): the beforeMoveScore (-65init/0hard/0medium/-2412soft) is not the undoScore (-65init/0hard/0medium/-2411soft) which is the uncorruptedScore (-65init/0hard/0medium/-2411soft) of the workingSolution.

  1. Enable EnvironmentMode FULL_ASSERT (if you haven't already) to fail-faster in case there's a score corruption or variable listener corruption.
  2. Check the Move.createUndoMove(...) method of the moveClass (class org.optaplanner.core.impl.heuristic.selector.move.generic.ChangeMove). The move (0 items -> 3 items) might have a corrupted undoMove (Undo(0 items -> 3 items)).
  3. Check your custom VariableListeners (if you have any) for shadow variables that are used by score constraints that could cause the scoreDifference (1soft).
    at org.optaplanner.core.impl.score.director.AbstractScoreDirector.assertExpectedUndoMoveScore(AbstractScoreDirector.java:670)
    at org.optaplanner.core.impl.heuristic.thread.MoveThreadRunner.run(MoveThreadRunner.java:149)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    ... 4 more
---编辑2:得分随时间变化图---
![](https://i.stack.imgur.com/3F9lG.png)
---编辑3:内存消耗图---
![](https://i.stack.imgur.com/y5ggc.png)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题