optaplanner学习笔记(十)约束配置:动态调整约束权重
概要
为每个约束确定正确的权重和级别并不容易。因为各个约束之间存在优先级平衡的情况。此外,量化软约束的影响对我们来说通常是一种全新的体验,因此他们需要多次调整才能找到一个适合的权重和级别。
提供一个 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学习笔记(十)约束配置:动态调整约束权重相关推荐
- mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务
逆天十三少 发表于:2020-11-12 08:12 阅读: 90次 这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一 ...
- kvm虚拟化学习笔记(十)之kvm虚拟机快照备份
KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装 http://koumm.blog ...
- Apache Nutch 1.3 学习笔记十(插件机制分析)
1. 一些对象说明 PluginRepository:这是一个用于存储所有插件描述对象(PluginDescriptor),插件扩展点(ExtensionPoint)和被激活的插件. PluginDe ...
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现
之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置...
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置 Download JetBrains Python IDE :: PyCharm http://ww ...
- ROS学习笔记(十)——ROS试用练习(一)
ROS学习笔记(十)--ROS试用练习 在此说明:之前使用的ROS是indigo,前两天电脑"炸"了,所以换了kinetic. 一.ROS文件系统导览 1.1如果你想找到turtl ...
- 【现代机器人学】学习笔记十二:轮式移动机器人
目录 轮式机器人类型 全向轮式机器人 建模 单个全向轮是怎么运动的 多个全向轮是如何带动底盘运动的 运动规划和反馈控制 非完整约束轮式移动机器人 建模 独轮车 差速驱动机器人 车型机器人 非完整移动机 ...
- OpenCV学习笔记(十二)——图像分割与提取
在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...
最新文章
- 室内+室外激光SLAM关键算法、代码和实战剖析正式开课(cartographer+LOAM+ LIO-SAM)
- 35+ Top Apache Tomcat Interview Questions And Answers【转】
- 安装spark集群,并成功运行
- binlog日志_MySQL三大日志binlog、redo log和undo log
- 月赛 SX_ACM 惨痛教训
- Win10笔记本可以搜索到邻居WiFi却搜不到自家的??
- Hive利用正则Serde导入文件
- 北森职业测试软件包括的取向,北森人才测评介绍(上).doc
- 关于SEL的一些总结
- mysql访问错误:1682
- excel函数提取计算机登录名,Excel查找函数FIND,帮你从复杂的地址中提取城市、区和街道名!-提取文件名...
- python如何转换图形_python绘图 转
- Frida-Dexdump 脱壳工具下载使用以及相关技术介绍
- android动画知乎,GitHub - ryanhoo/Zhihu-Parallax-Animation: 知乎 Android 客户端启动页的视差动画效果实现...
- 基于激光视觉传感器的工业机器人焊缝跟踪系统的优缺点
- 【AAAI 2021】全部接受论文列表(五)
- 五、Lua 变量的学习
- 【Python】unicode编码和bytes编码不能混用
- wep 与 wpa 的区别
- 按照日期排序相册库(支持自定义选中图片,视频数量,支持预览,支持拍摄仿小米原生相册)
热门文章
- 上研动力小课堂丨柴油机启动困难原因大揭秘(上篇)
- B. Restore Modulo
- Gartner发布2021年新兴技术成熟度曲线
- num find matlab,matlab中find函数的使用说明
- 满减折扣促销功能代码优化实战
- Java内存模型(JMM)学习总结
- 多线程练习(龟兔赛跑)
- 【Android Gradle 插件】Splits 配置 ③ ( Splits#density{} 脚本块配置 | 根据屏幕像素密度进行分包 | DensitySplitOptions 配置简介 )
- 初中生用计算机作弊,初中生,总是偷偷用手机作弊,好想哭怎么办?
- 微信内打开链接,跳转到公众号关注页面