首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OptaPlanner基准测试不会运行

OptaPlanner基准测试不会运行
EN

Stack Overflow用户
提问于 2021-12-16 23:24:15
回答 1查看 157关注 0票数 1

我试图使用以下配置运行OptaPlanner基准测试:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<plannerBenchmark xmlns="https://www.optaplanner.org/xsd/benchmark" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="https://www.optaplanner.org/xsd/benchmark https://www.optaplanner.org/xsd/benchmark/benchmark.xsd">
    <benchmarkDirectory>data/acme</benchmarkDirectory>

    <inheritedSolverBenchmark>
        <solver>
            <solutionClass>org.acme.domain.Main</solutionClass>
            <entityClass>org.acme.domain.Standstill</entityClass>
            <entityClass>org.acme.domain.Visit</entityClass>
            <scoreDirectorFactory>
                <constraintProviderClass>org.acme.solver.MainConstraintProvider</constraintProviderClass>
                <initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
            </scoreDirectorFactory>
            <termination>
                <secondsSpentLimit>30</secondsSpentLimit>
            </termination>
        </solver>
        <problemBenchmarks>
            <solutionFileIOClass>org.acme.bootstrap.AcmeSolutionIO</solutionFileIOClass>
            <inputSolutionFile>data/latest.xml</inputSolutionFile>
        </problemBenchmarks>
    </inheritedSolverBenchmark>
    <solverBenchmark>
        <solver>
            <constructionHeuristic>
                <constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
            </constructionHeuristic>
            <localSearch>
                <localSearchType>LATE_ACCEPTANCE</localSearchType>
            </localSearch>
        </solver>
    </solverBenchmark>
</plannerBenchmark>

但是,我收到以下错误消息:

代码语言:javascript
复制
Exception in thread "main" org.optaplanner.benchmark.api.PlannerBenchmarkException: Benchmarking failed: failureCount (1). The exception of the firstFailureSingleBenchmarkRunner (blankData_Config_0_0) is chained.
    at org.optaplanner.benchmark.impl.DefaultPlannerBenchmark.benchmarkingEnded(DefaultPlannerBenchmark.java:326)
    at org.optaplanner.benchmark.impl.DefaultPlannerBenchmark.benchmark(DefaultPlannerBenchmark.java:100)
    at org.optaplanner.benchmark.impl.DefaultPlannerBenchmark.benchmarkAndShowReportInBrowser(DefaultPlannerBenchmark.java:424)
    at org.acme.bootstrap.BenchmarkApp.main(BenchmarkApp.kt:29)
Caused by: java.lang.IllegalStateException: The class (class java.lang.Long) should have a no-arg constructor to create a planning clone.
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner.lambda$retrieveCachedConstructor$0(FieldAccessingSolutionCloner.java:90)
    at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
    at org.optaplanner.core.impl.domain.common.ConcurrentMemoization.computeIfAbsent(ConcurrentMemoization.java:44)
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner.retrieveCachedConstructor(FieldAccessingSolutionCloner.java:85)
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner$FieldAccessingSolutionClonerRun.constructClone(FieldAccessingSolutionCloner.java:158)
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner$FieldAccessingSolutionClonerRun.clone(FieldAccessingSolutionCloner.java:150)
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner$FieldAccessingSolutionClonerRun.process(FieldAccessingSolutionCloner.java:207)
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner$FieldAccessingSolutionClonerRun.processQueue(FieldAccessingSolutionCloner.java:194)
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner$FieldAccessingSolutionClonerRun.cloneSolution(FieldAccessingSolutionCloner.java:136)
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner.cloneSolution(FieldAccessingSolutionCloner.java:73)
    at org.optaplanner.core.impl.score.director.AbstractScoreDirector.cloneSolution(AbstractScoreDirector.java:257)
    at org.optaplanner.core.impl.score.director.AbstractScoreDirector.cloneWorkingSolution(AbstractScoreDirector.java:250)
    at org.optaplanner.core.impl.solver.recaller.BestSolutionRecaller.updateBestSolutionAndFire(BestSolutionRecaller.java:129)
    at org.optaplanner.core.impl.constructionheuristic.DefaultConstructionHeuristicPhase.phaseEnded(DefaultConstructionHeuristicPhase.java:146)
    at org.optaplanner.core.impl.constructionheuristic.DefaultConstructionHeuristicPhase.solve(DefaultConstructionHeuristicPhase.java:98)
    at org.optaplanner.core.impl.solver.AbstractSolver.runPhases(AbstractSolver.java:99)
    at org.optaplanner.core.impl.solver.DefaultSolver.solve(DefaultSolver.java:192)
    at org.optaplanner.benchmark.impl.SubSingleBenchmarkRunner.call(SubSingleBenchmarkRunner.java:122)
    at org.optaplanner.benchmark.impl.SubSingleBenchmarkRunner.call(SubSingleBenchmarkRunner.java:42)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NoSuchMethodException: java.lang.Long.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3585)
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754)
    at org.optaplanner.core.impl.domain.solution.cloner.FieldAccessingSolutionCloner.lambda$retrieveCachedConstructor$0(FieldAccessingSolutionCloner.java:88)
    ... 22 more

我尝试过许多其他的基准测试,包括<solverBenchmarkBluePrintType>CONSTRUCTION_HEURISTIC_WITH_AND_WITHOUT_LOCAL_SEARCH</solverBenchmarkBluePrintType>,但它们也都不起作用。

我以前曾让它工作过,但经过多次修改后,我又回到了它,它不再起作用了。

我现在使用的是SimpleLongScore而不是SimpleScore,我想知道这是否与错误有关,因为它之前没有抛出这个异常。

有什么想法吗?

编辑#1:

我希望我能提供更多的代码,但我真的不知道应该包括哪些代码。

奇怪的是,OptaPlanner在mvn compile quarkus:dev中运行得很好,但是当我运行我的基准应用程序时,从主条目开始,它会给出前面提到的错误java.lang.IllegalStateException: The class (class java.lang.Long) should have a no-arg constructor to create a planning clone.

这是我的主要:

代码语言:javascript
复制
    fun main(args: Array<String>) {
        val plannerBenchmarkFactory:PlannerBenchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource("benchmarkBluePrintConfig.xml")
        val plannerBenchmark: PlannerBenchmark = plannerBenchmarkFactory.buildPlannerBenchmark()
        plannerBenchmark.benchmarkAndShowReportInBrowser()
    }

solverConfig.xml也可以是相同的,但只有基准应用程序抛出错误。对我来说很奇怪。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-27 18:14:56

,我想出来了,

在我的Visit类中,我使用了一个@CustomShadowVariable

代码语言:javascript
复制
    @DeepPlanningClone
    @CustomShadowVariable(
        variableListenerClass = ArrivalTimeUpdatingVariableListener::class,
        sources = [PlanningVariableReference(variableName = "previousStandstill")]
    )
    var arrivalTime: Long? = null

删除@DeepPlanningClone 解决了这个问题。

我不知道当SolverManager@Injectd时,它为什么运行得很好,而不是在通过API创建SolverConfig/SolverManager时抛出错误(就像在我的基准应用程序中那样)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70386764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档