当前位置: 首页 > 知识库问答 >
问题:

在OptaPlanner中访问链位置还是多实体子链?

西门飞翮
2023-03-14

我们正在使用optaplanner来生成音乐播放列表,这些音乐播放列表遵循一套健全的音乐原则和规则(关于按键更改等):

https://github.com/spotfire-io/spotfire-solver/blob/1c0fcda5256c337e214b33043a27fc25f615d0ef/src/main/resources/io/spotfire/solver/rules/rules.drl#L79-L88

rule "Should change key at least once every five songs"
    when
        $t0: RestPlaylistTrack(keyDistance == 0) // previousTrack is a chained variable
        $t1: RestPlaylistTrack(keyDistance == 0, previousTrack == $t0)
        $t2: RestPlaylistTrack(keyDistance == 0, previousTrack == $t1)
        $t3: RestPlaylistTrack(keyDistance == 0, previousTrack == $t3)
        $t4: RestPlaylistTrack(keyDistance == 0, previousTrack == $t3)
     then
        scoreHolder.addSoftConstraintMatch(kcontext, 0, new BigDecimal(-2));
end

另一个例子是执行一个规则,将同一流派的曲目批在一起(例如,连续播放4首爵士曲目,然后播放4首摇滚曲目),或者确保我们避免播放同一艺术家上次播放的5首曲目。

    null

共有1个答案

朱承载
2023-03-14

这听起来像是护士名册上的连续轮班限制。在手写DRL中,检测“不超过n个移位”是非常重要的。在护士名册中,我们使用insertLogicals来处理这些问题,但我建议不要使用insertLogicals(它会扼杀性能)。我估计方法1(它放弃了增量计算)仍然比任何插入逻辑方法都快,除非你在排队等待成千上万首歌曲。

在ConstraintStreams中,方法1也许有一天会像这样:

constraintFactory.from(Shift.class)
    .groupBy(Shift::getEmployee,
             sort(Comparable.from(Shift::getStartDateTime, Shift::getId)) // BiConstraintStream<Employee, List<Shift>)) 
    .penalize((employee, sortedShiftList) -> ...); // One match for all bad subsequences of 1 employee

方法2)很有趣。试一试,让我们知道它是否适合你。

方法3)是我在约束流中的目标。这是增量的。比如:

constraintFactory.from(Shift.class)
    .forEachSortedSubList(Shift::getEmployee,
             Comparable.from(Shift::getStartDateTime, Shift::getId,
             (employee, sortedShiftSubList) -> ...)
    .penalize(...); // One match per bad subsequence

如果你有任何建议,你希望如何使用API的方法3)或如何使用它的样子,请把他们放在我们的谷歌小组讨论论坛,这将有助于推进工作。

 类似资料:
  • 对于时间窗VRP的解决方案,我编辑了已求解的XML文件并设置了< code > 我添加了一个SectionFiler类,并按照建议进行了配置。在解决的xml数据文件的末尾,我添加了一些新的未分配客户。 我预计只有新的未分配客户才会被优化并插入现有链的末尾 - 事实并非如此 - 链条被破坏了。 问题:6.2中处理不可移动客户预约的具体内容是什么? 我认为jira问题https://issues.jb

  • 问题内容: 和CSS 和有什么不一样?那你什么时候应该使用呢? 问题答案: CSS绝对定位 绝对定位是最容易理解的。您从CSS 属性开始: 这告诉浏览器应将要定位的所有内容从文档的正常流程中删除,并将其放置在页面上的确切位置。它不会影响HTML中它之前或之后的元素在网页上的放置方式,但是除非您重写它,否则 它将 取决于其父级的位置。 如果你想一个元素从文档窗口的顶部10个像素的位置,你会使用偏移与

  • 我很好奇,在JPA/Hibernate的父实体中,是否可能有几个相同实体的@manytone关系。 示例:我有银行交易,每笔交易都有一个银行合作伙伴,分别担任债权人和债务人。关键是,我只想编辑一次数据。昵称为“情妇”的银行合作伙伴只有一个:),无论是债权人还是债务人。一旦,它将重命名为妻子,所以我不想单独更改。此外,余额是BankPartners在这两个角色中的所有交易的总和。 @实体公共类事务{

  • 我是Optaplanner的新手,我一直在考虑将VRP扩展到一个不同的问题空间。我用的是6.1.0-final。这是一个很难计算的问题,但下面是: 规划实体-装运(扩展Standstill),由运输商(即货船)锚定规划变量-终端(货物目的地),当然隐含运输商(作为VRP示例中的Vehicle这样的影子变量) 在这个路径问题中,货物直接运输到一个终端,然后再运回工厂。即一个运输机服务于一个终点站,然

  • 我想连接到服务中的Google Play服务位置API,以便我可以请求位置更新和地理Geofence。Android开发者网站上的示例使用活动生命周期方法在活动中连接和断开连接,它还通过显示对话框等来处理失败。在我的应用程序中,我想使用服务而不是活动,因为我想在活动不可见时继续接收位置更新。我计划在服务启动时连接到Google Play服务,在我不再需要位置更新或服务停止时断开连接。是否可以处理来

  • 给定文档中的术语匹配,访问匹配词的最佳方式是什么?我读过这篇文章http://searchhub.org//2009/05/26/accessing-words-around-a-position-match-in-lucene/,但问题是Lucene API自这篇文章(2009)以来完全改变了,有人能告诉我在Lucene的新版本中如何做到这一点吗,比如Lucene4.6.1? 编辑: