gpt4 book ai didi

java - OptaPlanner 中的详尽搜索不适用于非常简单的示例

转载 作者:行者123 更新时间:2023-11-30 08:03:26 24 4
gpt4 key购买 nike

我们正在尝试创建一个简单的示例来测试 OptaPlanner 的功能。在下文中,我们展示了我们的想法。我们示例的问题在于,当我们选择穷举搜索算法来解决问题时,OptaPlanner 会迅速终止并返回错误答案,该答案始终为零,即使零不是 ValueRangeProvider 可用的可能解决方案。此外,与使用本地搜索时相反,在求解期间未设置 PlanningVariable。

我们尝试更改 OptaPlanner 附带的示例中的算法(例如 TSP),但效果很好。因此我们的问题是:为什么我们的代码不起作用?

MyPlanningEntity.java:

import org.optaplanner.core.api.domain.entity.PlanningEntity;
import org.optaplanner.core.api.domain.variable.PlanningVariable;

@PlanningEntity
public class MyPlanningEntity {
@PlanningVariable(valueRangeProviderRefs = {"myListValueRangeProvider"})
private int myPlanningVariable;

public int getMyPlanningVariable() {
return myPlanningVariable;
}

public void setMyPlanningVariable(int myPlanningVariable) {
this.myPlanningVariable = myPlanningVariable;
}

}

我的解决方案.java:

import org.optaplanner.core.api.domain.solution.PlanningEntityProperty;
import org.optaplanner.core.api.domain.solution.PlanningSolution;
import org.optaplanner.core.api.domain.solution.Solution;
import org.optaplanner.core.api.domain.valuerange.CountableValueRange;
import org.optaplanner.core.api.domain.valuerange.ValueRangeFactory;
import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider;
import org.optaplanner.core.api.score.buildin.simple.SimpleScore;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@PlanningSolution
public class MySolution implements Solution<SimpleScore> {
@PlanningEntityProperty
private MyPlanningEntity myPlanningEntity;
private SimpleScore score;

public MyPlanningEntity getMyPlanningEntity() {
return myPlanningEntity;
}

public void setMyPlanningEntity(MyPlanningEntity myPlanningEntity) {
this.myPlanningEntity = myPlanningEntity;
}

@ValueRangeProvider(id = "myListValueRangeProvider")
public List<Integer> getListValueRange(){
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
return list;
}

@Override
public SimpleScore getScore() {
return score;
}

@Override
public void setScore(SimpleScore simpleScore) {
this.score = simpleScore;
}

@Override
public Collection<?> getProblemFacts() {
return null;
}
}

MyScoreCalculator.java:

import org.optaplanner.core.api.score.Score;
import org.optaplanner.core.api.score.buildin.simple.SimpleScore;
import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator;

public class MyScoreCalculator implements EasyScoreCalculator<MySolution>{
@Override
public Score calculateScore(MySolution mySolution) {
// The higher the input, the higher the output
int value = mySolution.getMyPlanningEntity().getMyPlanningVariable();
return SimpleScore.valueOf(value);
}
}

ESTest.java:

import org.optaplanner.core.api.solver.Solver;
import org.optaplanner.core.api.solver.SolverFactory;

public class ESTest {
public static void run(){
SolverFactory solverFactory = SolverFactory.createFromXmlResource("resources/myPlanningProblem.xml");
Solver solver = solverFactory.buildSolver();

MySolution mySolution = new MySolution();
MyPlanningEntity myPlanningEntity = new MyPlanningEntity();
mySolution.setMyPlanningEntity(myPlanningEntity);

solver.solve(mySolution);

MySolution bestSolution = (MySolution) solver.getBestSolution();
System.out.println("Best solution: " + bestSolution.getMyPlanningEntity().getMyPlanningVariable());
}

public static void main(String args[]){
run();
}
}

我的计划问题.xml:

<?xml version="1.0" encoding="UTF-8"?>
<solver>
<!-- Domain model configuration -->
<scanAnnotatedClasses/>
<scoreDirectorFactory>
<scoreDefinitionType>SIMPLE</scoreDefinitionType>
<easyScoreCalculatorClass>MyScoreCalculator</easyScoreCalculatorClass>
</scoreDirectorFactory>

<!-- THIS DOES NOT WORK STAND ALONE -->
<!--<constructionHeuristic>-->
<!--<constructionHeuristicType>FIRST_FIT</constructionHeuristicType>-->
<!--</constructionHeuristic>-->

<!-- THIS DOES NOT WORK STAND ALONE -->
<exhaustiveSearch>
<exhaustiveSearchType>BRUTE_FORCE</exhaustiveSearchType>
<termination>
<stepCountLimit>100</stepCountLimit>
</termination>
</exhaustiveSearch>

<!-- THIS WORKS BEAUTIFULLY -->
<!--<localSearch>-->
<!--<localSearchType>HILL_CLIMBING</localSearchType>-->
<!--<termination>-->
<!--<secondsSpentLimit>10</secondsSpentLimit>-->
<!--</termination>-->
<!--</localSearch>-->
</solver>

我们正在使用 OptaPlanner 6.3 Final。

这是使用此配置启动 OptaPlanner 时我们得到的结果:

14:58:58.742 [main] INFO  o.o.core.impl.solver.DefaultSolver - Solving started: time spent (4), best score (0), environment mode (REPRODUCIBLE), random (JDK with seed 0).
14:58:58.745 [main] INFO o.o.c.i.e.DefaultExhaustiveSearchPhase - Exhaustive Search phase (0) ended: step total (0), time spent (7), best score (0).
14:58:58.745 [main] INFO o.o.core.impl.solver.DefaultSolver - Solving ended: time spent (7), best score (0), average calculate count per second (285), environment mode (REPRODUCIBLE).
Best solution: 0

Process finished with exit code 0

最佳答案

规划变量应该是 Integer,而不是 int。它应该以 null 开头。 如果它以 0 开始,OptaPlanner 假定它已经初始化并且 - 默认情况下 - 不会在 CH 或 ES 中重新初始化该变量。

Maybe we should ban primitive types for planning variables?

关于java - OptaPlanner 中的详尽搜索不适用于非常简单的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com