概要

为每个约束确定正确的权重和级别并不容易。因为各个约束之间存在优先级平衡的情况。此外,量化软约束的影响对我们来说通常是一种全新的体验,因此他们需要多次调整才能找到一个适合的权重和级别。

提供一个 UI 来调整约束权重,并将求解的结果可视化,以便可以自己调整约束条件的权重:

5.1。创建约束配置

首先,创建一个新的类来保存约束权重和其他约束参数。用@ConstraintConfiguration注解。

@ConstraintConfiguration
public class ConferenceConstraintConfiguration {...
}

每个PlanningSolution规划解决方案将有一个这个类的实例。规划解决方案和约束配置具有一对一的关系,但它们有不同的目的,因此它们不会合并到一个类中。一个@ConstraintConfiguration类可以扩展一个父@ConstraintConfiguration类,这在许多例子中是很有用。

在PlanningSolution规划解决方案上添加ConstraintConfig约束配置,并用@ConstraintConfigurationProvider在该字段或属性上添加注释,

@PlanningSolution
public class ConferenceSolution {@ConstraintConfigurationProviderprivate ConferenceConstraintConfiguration constraintConfiguration;...
}

@ConstraintConfigurationProvider注解自动将constraintConfiguration作为一个ProblemFact,所以不需要添加@ProblemFactProperty注解。

ConstraintConfiguration类持有Constraint的权重,但它也可以持有Constraint的参数。例如,在会议安排中,最小会议间隔时间约束有一个约束权重(像其他约束一样),但它也有一个约束参数,定义了同一发言人的两个演讲之间的最小间隔时间。这个间隔时间长度取决于会议:在一些大型会议中,20分钟还不够从一个房间走到另一个房间。这个间隔时间长度是约束配置中的一个field字段,没有@ConstraintWeight注解。

5.2. 为每个约束添加一个约束权重

在ConstraintConfiguration类中,为每个约束添加一个@ConstraintWeight字段或属性。

@ConstraintConfiguration(constraintPackage = "...conferencescheduling.score")
public class ConferenceConstraintConfiguration {@ConstraintWeight("Speaker conflict")private HardMediumSoftScore speakerConflict = HardMediumSoftScore.ofHard(10);@ConstraintWeight("Theme track conflict")private HardMediumSoftScore themeTrackConflict = HardMediumSoftScore.ofSoft(10);@ConstraintWeight("Content conflict")private HardMediumSoftScore contentConflict = HardMediumSoftScore.ofSoft(100);...
}

ConstraintConfiguration的类型必须与PlanningSolution的Score相同的分数类。例如在会议安排例子中,ConferenceSolution.getScore()和ConferenceConstraintConfiguration.getSpeakerConflict()都返回HardMediumSoftScore。

一个ConstraintWeight不能为null。给每个ConstraintWeight一个默认值,但在界面中可以修改,以便对它们进行调整。上面的例子使用ofHard()·、ofMedium()和ofSoft()方法来实现。
每个约束都有一个ConstraintPackage约束包和一个ConstraintName约束名称,它们共同构成了ConstraintID约束的ID。它们将约束的Weight与约束的实现联系起来。对于每个ConstraintWeight,必须有一个具有相同包和相同名称的约束实现。

  • @ConstraintConfiguration注解有一个constraintPackage属性,默认为约束配置类的包。大多数使用Drools 分数计算的情况需要覆盖它,因为 DRL 使用另一个包。比如下面的 DRL 使用了 package …​conferencescheduling.score,所以上面的约束配置指定了一个constraintPackage. 具有约束流的情况,通常不需要指定它。

  • @ConstraintWeight注释有一个这值,是约束名称(例如“扬声器冲突”)。它从 @ConstraintConfiguration继承约束包,但它可以覆盖它,例如@ConstraintWeight(constraintPackage = “…​region.france”, …​) 来使用与其他一些权重不同的约束包。

所以每个ConstraintWeight约束权重最后都有一个ConstraintPackage约束包和一个ConstraintName约束名称结束。每个ConstraintWeight约束权重都与一个约束实现相关联,例如在Drools 分数计算中:

package ...conferencescheduling.solver;rule "Speaker conflict"when...thenscoreHolder.penalize(kcontext);
endrule "Theme track conflict"when...thenscoreHolder.penalize(kcontext, ...);
endrule "Content conflict"when...thenscoreHolder.penalize(kcontext, ...);
end

每个ConstraintWeight都定义了其约束的ScoreLevel和ScoreWeight。约束的实现调用reward()或policize(),约束的权重就会自动匹配。

如果约束实现提供了一个匹配权重,那么该MatchWeight匹配权重将与ConstraintWeight约束权重相乘。例如, content conflict 约束权重默认为100soft,约束实现根据共享内容标签的数量来惩罚每个匹配的结果:

@ConstraintWeight(“Content conflict”)
private HardMediumSoftScore contentConflict = HardMediumSoftScore.ofSoft(100);

rule "Content conflict"when$talk1 : Talk(...)$talk2 : Talk(...)thenscoreHolder.penalize(kcontext,$talk2.overlappingContentCount($talk1));
end

因此,当2个冲突内容只共享1个内容标签时,得分会受到-100soft的影响。但是,当2个冲突内容共享3个内容标签时,匹配权重为3,所以分数会受到-300soft的影响。

optaplanner学习笔记(十)约束配置:动态调整约束权重相关推荐

  1. mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务

    逆天十三少 发表于:2020-11-12 08:12 阅读: 90次 这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一 ...

  2. kvm虚拟化学习笔记(十)之kvm虚拟机快照备份

    KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装 http://koumm.blog ...

  3. Apache Nutch 1.3 学习笔记十(插件机制分析)

    1. 一些对象说明 PluginRepository:这是一个用于存储所有插件描述对象(PluginDescriptor),插件扩展点(ExtensionPoint)和被激活的插件. PluginDe ...

  4. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  5. Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现

    之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...

  6. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置...

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置 Download JetBrains Python IDE :: PyCharm http://ww ...

  7. ROS学习笔记(十)——ROS试用练习(一)

    ROS学习笔记(十)--ROS试用练习 在此说明:之前使用的ROS是indigo,前两天电脑"炸"了,所以换了kinetic. 一.ROS文件系统导览 1.1如果你想找到turtl ...

  8. 【现代机器人学】学习笔记十二:轮式移动机器人

    目录 轮式机器人类型 全向轮式机器人 建模 单个全向轮是怎么运动的 多个全向轮是如何带动底盘运动的 运动规划和反馈控制 非完整约束轮式移动机器人 建模 独轮车 差速驱动机器人 车型机器人 非完整移动机 ...

  9. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

最新文章

  1. 室内+室外激光SLAM关键算法、代码和实战剖析正式开课(cartographer+LOAM+ LIO-SAM)
  2. 35+ Top Apache Tomcat Interview Questions And Answers【转】
  3. 安装spark集群,并成功运行
  4. binlog日志_MySQL三大日志binlog、redo log和undo log
  5. 月赛 SX_ACM 惨痛教训
  6. Win10笔记本可以搜索到邻居WiFi却搜不到自家的??
  7. Hive利用正则Serde导入文件
  8. 北森职业测试软件包括的取向,北森人才测评介绍(上).doc
  9. 关于SEL的一些总结
  10. mysql访问错误:1682
  11. excel函数提取计算机登录名,Excel查找函数FIND,帮你从复杂的地址中提取城市、区和街道名!-提取文件名...
  12. python如何转换图形_python绘图 转
  13. Frida-Dexdump 脱壳工具下载使用以及相关技术介绍
  14. android动画知乎,GitHub - ryanhoo/Zhihu-Parallax-Animation: 知乎 Android 客户端启动页的视差动画效果实现...
  15. 基于激光视觉传感器的工业机器人焊缝跟踪系统的优缺点
  16. 【AAAI 2021】全部接受论文列表(五)
  17. 五、Lua 变量的学习
  18. 【Python】unicode编码和bytes编码不能混用
  19. wep 与 wpa 的区别
  20. 按照日期排序相册库(支持自定义选中图片,视频数量,支持预览,支持拍摄仿小米原生相册)

热门文章

  1. 上研动力小课堂丨柴油机启动困难原因大揭秘(上篇)
  2. B. Restore Modulo
  3. Gartner发布2021年新兴技术成熟度曲线
  4. num find matlab,matlab中find函数的使用说明
  5. 满减折扣促销功能代码优化实战
  6. Java内存模型(JMM)学习总结
  7. 多线程练习(龟兔赛跑)
  8. 【Android Gradle 插件】Splits 配置 ③ ( Splits#density{} 脚本块配置 | 根据屏幕像素密度进行分包 | DensitySplitOptions 配置简介 )
  9. 初中生用计算机作弊,初中生,总是偷偷用手机作弊,好想哭怎么办?
  10. 微信内打开链接,跳转到公众号关注页面