基于回答集程序的排课系统

本文介绍了如何使用AnswerSet Programming(ASP)技术设计一个排课系统,通过分解约束和原子,展示了基本硬约束、硬约束实例和软约束的处理方法。详细步骤涉及课程、班级、教师和时间的集合定义,以及规则和约束的编写。适合ASP初学者了解排课问题的ASP解决方案。
摘要由CSDN通过智能技术生成

基于回答集程序的排课系统

写了许久的人工智能大作业,要求写一个基于回答集的排课系统,在CSDN上都能搜寻到回答集的其他的题目,如n皇后问题或者装配机问题,但是排课系统确实没有人写,而且写起来折磨了我许久,最后还是决定记录一下。

首先介绍一下排课问题,TTP(Time Tabling Problem)是学校管理工作中重要且有难度的组合优化问题。TTP算法以时间、空间、课程、人力资源为输入,生成可满足相应约束的有弹性的排课方案。

使用问答集编程(Answer Set Programming,简称ASP),使解决方案具有声明性。如一个基于ASP的方法允许我们把问题分成两个阶段来解决:对问题的描述以及使用回答集解决工具来寻找答案。声明式方法最突出的优点是它允许用户只去关注一个解决方案应该满足的条件而不是去关注找到解决方案的细节。

问题定义之类的就不写了,下面说说详细的设计,一个ASP程序应该包括许多东西,比如常量,变量,原子、规则、事实、约束。这些东西在网上其他地方查一查就能搜到,我就不多赘述了。

而ASP对于我们初学者来说我认为最困难的就是要理解他在干什么,他的语法是怎么样的,他最后出来的结果是怎么样的,以及他是在什么地方调试的。

你可以用dlv来跑,去详细阅读他的说明或者下一个专门的软件,这里我就挂一个网站,使用的clingo语言。可以在线跑,并且该网站还自带一些其他的更容易理解的小型程序可以跑,我就是看着这些程序慢慢学习的。
https://potassco.org/clingo/run/

回到TTP
我把它分成3种约束,基本硬约束,硬约束,软约束,基本硬约束是实现了就能跑出一个最基本的排课系统,硬约束和软约束是根据现实情况去加的,我做的TTP就仅仅实现了基本硬约束和三个硬约束,并没有实现软约束。

约束目录如下:
 基本硬约束(Base—hard Constraints)
 B1——— 同一时间同一教师不能给两门不同课程上课;
 B2——— 同一时间同一班级不能安排两门不同课程;
 硬约束(Hard Constraints)
 H1——— 某些班级的某些课程可以先行手工安排时间点;
 H2——— 某些教师或班级在某个时间上可能不能够利用;
 H3——— 某一时间段不安排课程;

**

排课系统中应该有如下集合:

**
课程course{C}。每门课是一个元素C,其中应包含课程名称、课程代号等

班级class{L}。每个班级是一个元素L

教师teacher{G}。每个老师是一个元素G

时间time{T}。每个时间单元是一个元素T,在次问题中我们优化了时间单元,如一天就4节课,早上2节下午一节晚上一节(根据大学中的实际情况所模拟产生),并且一周5天,则时间单元有二十个。

排课系统应有如下原子:
班级编号:Class(L),老师teacher(G),课程course( C ),课程教师(某一课程所对应的老师)

course_teacher(C,G)(注:即使课程名字一样,不同的老师和教学班所对应的C的课程编号也是不一样的,如同我们学校的大物,计科一班上的为GPH001-1 但是计科二班的为GPH001-2) ,时间time(T)。

最后需要得到的结论谓词为timetable(C,L,G,T)其中C L G T 分别表示课程,班级,老师,时间。按照以上谓词和原子以及约束,经过编译,我们就可以简单的求得用户所需要的课表。

由于我们需要求得的属于四元谓词timetable(C,L,G,T),如果将四元谓词直接去定义自动排课的约束条件的话是非常困难的,因为四元的谓词不用想都知道是一个非常庞大的变量集。

需要将四维的问题降维,可以降维成为三元加二元的组合。其中每个班级应当上什么课已经是固定了的,无需推理或者其他就可以得出,所以我们就可以得出一个二元谓词的事实,即course_class(C,L)。

那么我们只需要将G T与C或L和course_class(C,L)组合就可以得到四元谓词timetable。在上述的排课系统的基本要素中,已经出现了另一组事实:course_teacher(C,G),每个老师所教的课都是固定的,所以我们将G与T组合在与course_teacher 组合即可得到另一个三元谓词:timetables(C,G,T)。

至此,我们就将timetable(C,L,G,T)拆分为timetables(C,G,T)+course_class(C,L),以上即为排课系统的首要规则

接下来将介绍所实现的几个事实

该测试有三个班

class(jk1).class(jk2).class(jk3).

共有5个课,每个班都要上,那么课程C就有十五个值:

course(l11).course(l21).course(l31).course(l41).course(l51).
course(l12).course(l22).course(l32).course(l42).course(l52).
course(l13).course(l23).course(l33).course(l43).course(l53).

同时对应的course_class()也有十五个值:

course_class(l11,jk1).course_class(l21,jk1).course_class(l31,jk1).
course_class(l41,jk1).course_class(l51,jk1).
course_class(l12,jk2).course_class(l22,jk2).course_class(l32,jk2).
course_class(l42,jk2).course_class(l52,jk2).
course_class(l13,jk3).course_class(l23,jk3).course_class(l33,jk3).
course_class(l43,jk3).course_class(l53,jk3).

共有四位老师:

teacher(te1).teacher(te2).teacher(te3).teacher(te4).

共有6个时间点

time(t1).time(t2).time(t3).time(t4). time(t5).time(t6).

四位老师分布对于五节课,老师一上1和5两门课,其余老师一人一门:

course_teacher(l11,te1).course_teacher(l51,te1).
course_teacher(l12,te1).course_teacher(l52,te1).
course_teacher(l13,te1).course_teacher(l53,te1).

course_teacher(l31,te2).
course_teacher(l32,te2).
course_teacher(l33,te2).

course_teacher(l21,te4).
course_teacher(l22,te4).
course_teacher(l23,te4).

**

接下来是规则和约束

**

首要规则timetable(C,L,G,T)拆分为timetables(C,G,T)+course_class(C,L)

1{timetables(C,G,T):time(T)}1:-course_teacher(C,G).
timetable(C,L,G,T):-timetables(C,G,T),course(C),teacher(G),time(T),course_class(C,L).

基本硬约束
B1:同一时间同一教师不能给两门不同课程上课

:-timetables(C1,G,T),timetables(C2,G,T),course_teacher(C1,G),
course_teacher(C2,G),time(T),C1!=C2.

基本B2:同一时间同一班级不能安排两门不同课程

:-timetable(C1,L,G1,T),timetable(C2,L,G2,T),
course_teacher(C1,G1),course_teacher(C2,G2),time(T),class(L),C1!=C2.

硬约束
H1: 某些班级的某些课程可以先行手工安排时间点

H2: 某些教师或班级在某个时间上可能不能够利用
:timetables(C1…C2,G,T1,…T2).
H3: 某一时间段不安排课程

:-not timetables(l21,te4,t2).
:-timetables(l12,te1,t5).
:-timetable(C,jk3,G,t1)

是不是非常简单呢?

初学者肯定有不严谨的地方,仅供参考。

参考网站
https://www.docin.com/p-471230513.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值