有一个关于局部优化的问题,如何用SpringBoot编写Move或Accpetor来搜索更大的空间

iszxjhcz  于 2023-02-22  发布在  Spring
关注(0)|答案(1)|浏览(91)

我有一个航空公司的问题,我有一个座位,它被分配一个乘客基于偏好和重量(基本上是出价)。我希望最高出价的顶级乘客被分配到他们的座位奖励。查看日志,它看起来像求解程序正在执行“接受/选择移动”的类似乘客与类似的出价,我希望它选择乘客与不同的出价。
我想接受一个移动对不同的出价不同的席位和探索更广阔的空间。
我找不到任何关于如何编写Move或Acceptor以及如何让SpringBoot使用这个新类的示例。但也许我只是缺少了一个设置。谢谢

k5ifujac

k5ifujac1#

添加一个特定的移动选择器可以帮助解决这个问题。这可以是一个通用移动(如柱子交换)或自定义移动。没有必要更改Acceptor
我假设你有一个硬约束来保持家庭在一起(=坐在彼此旁边),特别是一个蹒跚学步的孩子和他们的父母。如果你打开TRACE日志记录(不仅仅是DEBUG),你会看到它确实评估改变蹒跚学步的孩子座位的动作,但它从来没有选择他们作为胜利的一步,因为这个硬约束(父母没有在同一个动作中改变座位)。
所以诀窍就是要有一个动作,让蹒跚学步的孩子和它的父母一起移动。
添加一个src/main/resources/solverConfig.xml文件(位置可以用application.properties中的optaplanner.solver-config-xml自定义。让它包含如下内容:

<?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>

总是保持一个变化和交换移动选择器在混合太。保持你的分数计算速度(最后信息日志消息)在这些变化之前和之后的眼睛。阅读JUST_IN_TIME选择。

相关问题