当前位置: 首页 > news >正文

OptaPlanner笔记2

1.5.3 使用maven

修改pom.xml

导入optaplanner-bom以避免为每一个依赖项重复添加版本号

<project>...<dependencyManagement><dependencies><dependency><groupId>org.optaplanner</groupId><artifactId>optaplanner-bom</artifactId><type>pom</type><version>...</version><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.optaplanner</groupId><artifactId>optaplanner-core</artifactId></dependency><dependency><groupId>org.optaplanner</groupId><artifactId>optaplanner-persistence-jpa</artifactId></dependency>...</dependencies>
</project>

2.2.5 领域对象建模

在这里插入图片描述

2.2.5.1 Timeslot

Timeslot类表示教授课程的时间段,例如:星期一上午10:30-11:30或星期二13:30-14:30。为简单起见,所有时间段的持续时间相同,午餐或其他休息时间没有时间段。
时间段没有日期,因为高中的课程表每周都是一样的。 因此,无需进行连续规划(18.4)

因为在求解过程中Timeslot实例不会改变,所以称Timeslot为problem fact(问题事实)。 这种类不需要使用任何OptaPlanner注解。

注意:保证toString()方法的输出简短,这样OptaPlanner的DEBUG/TRACE日志会更易读。

2.2.5.2 Room

Room 类表示教授课程的地点,例如,Room A或 Room B。为简单起见,所有房间都没有容量限制,他们可以容纳所有课程。
Room实例在求解过程中不会改变,这也是一个问题事实。

2.2.5.3. Lesson

Lesson类表示一节课程(一名教师给一组学生教授一个主题),例如,A.Turing给9年纪学生教授的数学课 或 M.Curie为10年纪学生教授的化学课 。如果同一名教师每周向同一学生组多次教授相同一门科目,那么这样几个Lesson实例只能通过id来区分。 例如,9年级每周有六节数学课。

在求解过程中,OptaPlanner会更改Lesson类的timeslot和room字段,来为每节课分配到一个时间段和一个房间。因为OptaPlanner更改了这些字段,所以Lesson 是一个planning entity(计划实体)
在这里插入图片描述
上图中除了橙色字段的大多数字段都包含输入数据:在输入数据中,lesson的timeslot和room字段没有赋值,而是在输出数据中被赋值了。OptaPlanner在求解过程中会更改这些字段。此类字段称为planning variables(规划变量)。 为了让OptaPlanner识别规划变量, timeslot和room字段都需要添加**@PlanningVariable注解。包含规划变量的类Lesson,需要使用@PlanningEntity**注解。

import org.optaplanner.core.api.domain.entity.PlanningEntity;
import org.optaplanner.core.api.domain.lookup.PlanningId;
import org.optaplanner.core.api.domain.variable.PlanningVariable;// 标识这个类在求解过程中需要变更,因为他会包含至少一个规划变量。
@PlanningEntity
public class Lesson {@PlanningIdprivate Long id;...// 标识这个值可以变更@PlanningVariableprivate Timeslot timeslot;@PlanningVariableprivate Room room;...
}

为了查找可以给规划变量字段赋值的潜在Timeslot实例,OptaPlanner会根据变量类型来链接一个提供List的*( value range provider)值域提供器*(4.3.5.2),并从中取值。

参考:领域建模指南

http://www.lryc.cn/news/120407.html

相关文章:

  • c++文件流详细笔记
  • CNN经典网络模型之GoogleNet论文解读
  • 【C++】开源:CGAL计算几何库配置使用
  • Redis分布式锁相关
  • Nginx环境搭建以及Docker环境部署
  • 2023牛客暑期多校训练营7(C/I/M)
  • 阿里云服务器手动搭建FTP教程(Windows操作系统)
  • idea+gradle阅读spring5.2.9源码之源码构建报错解决方案
  • 一文详解Git
  • 【单片机】DS2431英文手册,中文手册,翻译
  • centos7部署openldap开启memberof并接入jumpserver
  • Unity游戏源码分享-仿开心消消乐Match3Jewel
  • 知识图谱基本工具Neo4j使用笔记 四 :使用csv文件批量导入图谱数据
  • [bug修复]状态数据在useEffect初始化时更新无效
  • 使用 API Gateway Integrator 在 Quarkus 中实施适用于 AWS Lambda 的 OpenAPI
  • 【JVM】JVM中的分代回收
  • C# Linq源码分析之Take方法
  • 从后往前读取列表的方法
  • 数据库--数据类型
  • 小型双轮差速底盘机器人实现红外跟随功能
  • TCP协议网络编程 回显服务器,客户端实现
  • 3.4 Spring MVC注解
  • OpenCV实例(八)车牌字符识别技术(三)汉字识别
  • 运维监控学习笔记2
  • 【深度学习】遗传算法[选择、交叉、变异、初始化种群、迭代优化、几何规划排序选择、线性交叉、非均匀变异]
  • 【小吉带你学Git】讲解GitHub操作,码云操作,GitLab操作
  • nginx基础
  • 【Windows API】获取卷标、卷名
  • 通过MATLAB自动产生Hamming编译码的verilog实现,包含testbench
  • swager web服务无法显示问题