局部最优有问题如何用SpringBoot编写Move或Accpetor来搜索更广阔的空间

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

我有一个航空公司问题,我有一个座位,并且根据偏好和重量(基本上是出价)为它分配了一个乘客。我希望为分配给他们分配的座位奖励具有最高出价的顶级乘客。查看日志,看起来求解器正在对具有相似出价的相似乘客执行“接受/选择的移动”,我希望它选择具有不同出价的乘客。

我想在不同的座位上接受不同的投标,探索更广阔的空间。

我找不到任何关于如何编写 Move 或 Acceptor 以及如何让 SpringBoot 使用这个新类的示例。但也许我只是缺少一个设置。谢谢

java spring-boot optaplanner
1个回答
0
投票

添加特定的move selector可以帮助解决这个问题。这可以是通用移动(例如 pillar swaps)或 custom move。没有必要改变

Acceptor
.

我认为您很难将家人聚在一起(=坐在一起),尤其是和父母在一起的幼儿。如果您打开 TRACE 日志记录(不仅仅是 DEBUG),您会看到它确实评估了改变幼儿座位的动作,但它永远不会选择它们作为获胜步骤,因为那个硬约束(父母没有改变座位在同一个动作)。

所以诀窍是让幼儿和它的父母一起移动。

添加一个

src/main/resources/solverConfig.xml
文件(位置可以在
optaplanner.solver-config-xml
中使用
application.properties
自定义。让它包含如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<solver xmlns="https://www.optaplanner.org/xsd/solver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="https://www.optaplanner.org/xsd/solver https://www.optaplanner.org/xsd/solver/solver.xsd">
  <constructionHeuristic/>
  <localSearch>
    <unionMoveSelector>
      <changeMoveSelector/>
      <swapMoveSelector/>
      ... <!-- Add your custom move factory/iterator here -->
    </unionMoveSelector>
  </localSearch>
</solver>

总是在混音中保持变化和交换移动选择器。在这些更改前后密切关注您的分数计算速度(最后一条 INFO 日志消息)。阅读有关 JUST_IN_TIME 的选择。

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