当前位置:首页 » 操作系统 » 日期排课算法

日期排课算法

发布时间: 2022-04-28 02:04:00

‘壹’ 论文“计算机自动排课系统的设计与实现”的开题报告怎么写

方案名称:智能排课系统。

方案目的:利用计算机替代传统的繁琐的手工排课方法。

方案阐述:本系统受游戏设计中A星算法中的广度搜索法启发,结合手中的文献,总结出来的一种排课方式。本方案先采用采用信息收集的方式,收集信息。然后利用回逆算法进行智能排课。最后,再进行适当的人为调整,即可生成符合要求的课表。

方案详解:当需要生成课表时,用户需先设定排课条件。基本条件有:周课时设置,课程信息,班级信息,教师信息,场地信息,教学计划(即那些老师教那些班级、可以选择的空教室、是否有合班课等信息)。将所有信息存入数据库。自动排课,即系统自动调用数据库收集的信息然后利用设定的算法进行排课。最后,将系统生成的课表进行差错检查,分别在班级信息,教师信息,场地信息表中检测其有无冲突。然后进行查看和手工调课。最后生成所需求的课表。

算法详解:

回溯是一种优先搜索法。它按优先条件向前搜索,以达到目标,但当搜索到某一步时,发现原先的选择并不优或达不到目标,就退回一步重新选择。这种走不通就退回的技术为回溯法,而满足回溯条件的某个状态点称之为回溯点。

具体到计算机智能排课系统中,选优条件即为排课数学模型中的约束条件群(需求集中的元素特征与资源集中的元素特征相互作用形成的数学关系)。换言之,若不满足约束条件群,该选择即为不优或达不到目标。当遍历该步骤的所有可能仍未满足约束条件群,则该状态满足了回溯条件,该状态点即为回溯点。下图即为回溯算法排课流程。

值得指出的是,当得到第一次满足选优条件的排课结果后,可以将课表输出到屏幕上,由系统管理员直接审视排课结果,若感觉不满意,则可回到第一次得出的排课结果,将该状态设为回溯点,继续运行该算法,可以得到另一种排课结果,直至程序管理员满意为止。

当然,也有可能使用该法遍历了所有的可能,仍无满足选优条件之排课结果,此时,计算机就根据反馈的结果,自动放宽约束条件,重新进行排课。

该排课系统已在实际应用,排课结果较为理想,并且充分发挥了运算速度快的特点。

计算机自动排课也需要进行人工干预,以便可以使得各个高校能够根据自己的具体要求对排课算法中的一些参数进行设置和调整,并对计算机排出的课表进行调整.本算法所设计的人工干预过程有:等价类划分中参数的设置,教室类型的设置,时间模式库的设置,优先级函数中参数的设置.用户可以根据自己的具体要求对这些参数和库进行设置.另外,对于计算机排出的课程表,用户也可以通过人机交互进行适当调整,从而得到用户满意的课程表.

参考文献:《高校智能排课系统文献综述》

作者,日期不详。

《以代理人为基础的中学排课系统研究》

台湾高雄师大学 杨锦潭 欧文性

PS: 本人经过几天了解和获得老师的指点,觉得该系统如何能使用数据结构图和离散数学中的图论解决会能具有可操作性和智能性。另外,本人认为可以设计一个信息采集的接口,用于采集一些教师的需求信息(例如:不想上某个时段的课程。)这样可以使整个信息更加人性化,但实现起来也比较有难度。知识水平有限,只能在我所能想到的范围进行思考。

‘贰’ 如何用C语言实现大学排课

#include <stdio.h>
#include <stdlib.h>
#define M 100

struct Student
{
int StudentID;
char name[50];
float PeacetimeScore;
float TestScore;
float TotalScore;
};

int main()
{
int InputInformation (struct Student student[]);
void TotalScoreStatistics (struct Student student[], int n);
void TotalScoreSort (struct Student student[], int n);
void ScoreRevise (struct Student student[], int n);
void display (struct Student student[], int n);
int menu ();

int n = 1, count;
struct Student student[M];

while (n)
{
n = menu ();
switch (n)
{
case 1:
count = InputInformation (student);
break;
case 2:
TotalScoreStatistics (student, count);
break;
case 3:
TotalScoreSort (student, count);
break;
case 4:
ScoreRevise (student, count);
break;
case 5:
display (student, count);
break;
case 0:
printf ("您选择了退出!\n");
break;
default :
printf ("输入有误,重新输入!\n");
break;
}
}

return 0;
}

int menu ()
{
int n, i;

char * menu[]={"* * * * * * * * * * * * * * *MENU* * * * * * * * * * * * * * *",
" 1.学生信息录入",
" 2.总成绩统计",
" 3.总成绩排序",
" 4.成绩更改",
" 5.显示所有学生信息",
" 0.退出",
"* * * * * * * * * * * * * * *MENU* * * * * * * * * * * * * * *"};
for (i=0; i<8; i++)
printf ("%s\n", menu[i]);
printf ("请选择(输入序号):");
scanf ("%d", &n);

return n;
}

int InputInformation (struct Student student[])
{
int i;
FILE *fp;

for (i=0; ; i++)
{
printf ("输入第 %d 个学生的如下信息:\n", i+1);
printf ("学号:");
scanf ("%d", &student[i].StudentID);
if (student[i].StudentID == 0) //如果学号输入是0则结束输入
break;
getchar ();
printf ("姓名:");
gets (student[i].name);
printf ("平时成绩:");
scanf ("%f", &student[i].PeacetimeScore);
printf ("考试成绩:");
scanf ("%f", &student[i].TestScore);
fp = fopen ("myfile.txt", "a");
if (fp == NULL)
{
printf ("文件打开失败!\n");
exit (-1);
}
fprintf (fp, "%d %s %.2f %.2f\n", student[i].StudentID, student[i].name,
student[i].PeacetimeScore, student[i].TestScore);
}
fclose (fp); //关闭文件
return i;
}

void TotalScoreStatistics (struct Student student[], int n)
{
int i;

printf ("\n 学号 姓名 总成绩\n\n");
for (i=0; i<n; i++)
{
student[i].TotalScore = student[i].PeacetimeScore * 0.2 + student[i].TestScore * 0.8;
printf (" %d %s %.2f\n", student[i].StudentID, student[i].name, student[i].TotalScore);
}
}

void TotalScoreSort (struct Student student[], int n)
{
int i, j;
float temp;

for (i=0; i<n; i++)
for (j=i+1; j<n; j++)
if (student[i].TotalScore > student[j].TotalScore)
{
temp = student[i].TotalScore;
student[i].TotalScore = student[j].TotalScore;
student[j].TotalScore =temp;
}
for (i=0; i<n; i++)
printf ("%.2f ", student[i].TotalScore);
printf ("\n");
}

void ScoreRevise (struct Student student[], int n)
{
int m, k, i = 0;
FILE *fp;

printf ("输入要修改的学生的学号:");
scanf ("%d", &k);
printf ("您是要修改平时成绩还是考试成绩呢?\n");
printf ("1.修改平时成绩\n");
printf ("2.修改考试成绩\n");
printf ("输入您的选择:");
scanf ("%d", &m);
for (i=0; i<n; i++)
if (student[i].StudentID == k)
if (m == 1)

‘叁’ c++排课系统的算法

这个不是排列组合题目吧?如果不是,那就很简单。大致说下思路,自己实现吧。
把学校机房的课时按每小时或者按几个小时为单位编成一个数据结构。这个具体看学校怎么安排上机课,如果最小单位为2小时,当然以2小时为单位,如果有班级只上半小时的上机课当然以半小时为单位。比如一周5天每天10小时我们可以把它编成50个单位的一个数据结构。可以为数组,可以为链表,当然也可以为更复杂的结构,看你的需要。简单的机房上机课时结构基本子元素为:起止时间、已安排班级(若未安排则为空)、已安排老师
把班级和老师也储存在一个数据结构里。然后确定班级排上机课的原则。比如是平均分配机时,那么将每个班级增加一个计数器。那么班级的数据结构每个元素至少要有这么几个子元素:班级标识、班级计数器、班级空闲时间表。排上机课的时候,首先取出机房上机课时的数据结构,取出第一个元素,然后遍历存储班级信息的数据结构,优先取出班级计数器最小的班级,查看这个班级这时是否有课,无课则插入到上机课时的数据结构中,同时将班级计数器加一,有课则选择下一个计数器数字最小的元素。(计数器只是表示班级安排了多少上机课,也可以用一个数字代替,仅仅表示权重,比如计算机系的班级权重就可以调高。建议将整个链表中计数器数字的最小值保存在这个链表的某处,使得访问者一开始就能得到而不用访问所有元素)。重复上述过程,直到所有上机课时都被分配。
老师的分配过程和上述班级分配类似。

看来是新手,加油!

‘肆’ excel根据开课日期及总课时数,自动计算最后一次排课日期

这是公式,你验证一下

‘伍’ c++如何实现排课系统的算法

我的想法是……
1.首先把最难弄的老师排上,就是说她教的班多,限制多。(这步的实际操作就是把排课顺序按照班数排序)
2.随机安排课(当然要根据人类习惯,您总不能让他一天上七节课),安排方式为先满足部分人需求(当然不太公平),然后剩下的补空
3.这剩下的部分人可能因为班级的关系出现重课的问题,没有关系,先把他安排上去,用repeat循环逐层更改被冲突对象的课节(最后可以选把美术音乐等老师,他们安排到下午的话上午比较好换)

具体跟据实际来定。。……我乱讲讲。这是我的想法模型。

‘陆’ 排课的算法

排课算法是一个复杂程度相当高的算法,穷举是行不通的。不同的班级,不同的教师的课程纵横交错,不可能对每一种组合一一穷举。一间不到三十个班的学校,其课程组合的数量级常常超过整个宇宙质子数的总和。
但在这么多的课程组合中,找出“相对合理”的课程组合,满足学校、教师、学生的要求是可行的。

‘柒’ 求排课算法源码

排课算法:有N个老师,每个老师每星期有若干节课。其中每节课都固定安排在某星期段上。每个星期有固定节课。我们要求排课并且不冲突。

‘捌’ 排课逻辑的算法

这是一个难题,目前还在研究中,您可以查查排课算法

‘玖’ 自动排课系统的一些算法思想, 写出一些关于自动排课的算法思想,讲述明白一点.

排课算法的重点就是课程合理安排的问题,这里面最要的部分应该是正确的使用算法实现数学中排列组合.
比如写规定好某某课不能放在第几节,某某课一天不能超过几节,某某课属于某个老师,同一个老师的课同一时间只能安排一节,然后根据这些先决条件进行排列组合就可以了.
good luck.

‘拾’ 排课专家算法是用来做什么的

1课题背景与研究意义
排课问题早在70年代就证明是一个NP完全问题,即算法的计算时间是呈指数增长的,这一论断确立了排课问题的理论深度。对于NP问题完全问题目前在数学上是没有一个通用的算法能够很好地解决。然而很多NP完全问题目具有很重要的实际意义,例如。大家熟悉地路由算法就是很典型的一个NP完全问题,路由要在从多的节点中找出最短路径完成信息的传递。既然都是NP完全问题,那么很多路由算法就可以运用到解决排课问题上,如Dijkstra算法、节点子树剪枝构造网络最短路径法等等。
目前大家对NP 完全问题研究的主要思想是如何降低其计算复杂度。即利用一个近似算法来代替,力争使得解决问题的时间从指数增长化简到多项式增长。结合到课表问题就是建立一个合适的现实简约模型,利用该简约模型能够大大降低算法的复杂度,便于程序实现,这是解决排课问题一个很多的思路。
在高等院校中,培养学生的主要途径是教学。在教学活动中,有一系列管理工作,其中,教学计划的实施是一个重要的教学环节。每学期管理人员都要整理教学计划,根据教学计划下达教学任务书,然后根据教学任务书编排课程表。在这些教学调度工作中,既有大量繁琐的数据整理工作,更有严谨思维的脑力劳动,还要填写大量的表格。因此工作非常繁重。
加之,随着教学改革的进行及“211”工程的实施,新的教育体制对课表的编排提出了更高的要求。手工排课时,信息的上通下达是极其麻烦的,而采用计算机排课,教学中的信息可以一目了然,对于优化学生的学习进程,评估每位教师对教学的贡献,领导合理决策等都具有重要的意义,必将会大大推进教学的良性循环。
2课题的应用领域
本课题的研究对开发高校排课系统有指导作用。
排课问题的核心为多维资源的冲突与抢占,对其研究对类似的问题(特别是与时间表有关的问题:如考试排考场问题、电影院排座问题、航空航线问题)也是个参考。
3 课题的现状
年代末,国外就有人开始研究课表编排问题。1962年,Gotlieb曾提出了一个课表问题的数学模型,并利用匈牙利算法解决了三维线性运输问题。次后,人们对课表问题的算法、解的存在性等问题做了很多深入探讨。但是大多数文献所用的数学模型都是Gotlieb的数学模型的简化或补充,而至今还没有一个可行的算法来解决课表问题。
近40年来,人们对课表问题的计算机解法做了许多尝试。其中,课表编排的整数规划模型将问题归结为求一组0-1变量的解,但是其计算量非常大。解决0-1线性优化问题的分支一定界技术却只适用也规模较小的课表编排,Mihoc和Balas(1965)将课表公式化为一个优化问题,Krawczk则提出一种线性编程的方法。Junginger将课表问题简化为三维运输问题,而Tripathy则把课表问题视作整数线性编程问题并提出了大学课表的数学模型。
此外,有些文献试图从图论的角度来求解排课表的问题,但是图的染色问题也是NP完全问题,只有在极为简单的情况下才可以将课表编排转化为二部图匹配问题,这样的数学模型与实际相差太远,所以对于大多数学校的课表编排问题来说没有实用价值。
进入九十年代以后,国外对课表问题的研究仍然十分活跃。比较有代表的有印度的Vastapur大学管理学院的ArabindaTripathy、加拿大Montreal大学的Jean Aubin和Jacques Ferland等。目前,解决课表方法的问题有:模拟手工排课法,图论方法,拉格朗日法,二次分配型法等多种方法。由于课表约束复杂,用数学方法进行描述时往往导致问题规模剧烈增大,这已经成为应用数学编程解决课表问题的巨大障碍。国外的研究表明,解决大规模课表编排问题单纯靠数学方法是行不通的,而利用运筹学中分层规划的思想将问题分解,将是一个有希望得到成功的办法。
在国内,对课表问题的研究开始于80年代初期、具有代表性的有:南京工学院的UTSS(A University Timetable Scheling System)系统,清华大学的TISER(Timetable SchelER)系统,大连理工大学的智能教学组织管理与课程调度等,这些系统大多数都是模拟手工排课过程,以“班”为单位,运用启发式函数来进行编排的。但是这些系统课表编排系统往往比较依赖于各个学校的教学体制,不宜进行大量推广。
从实际使用的情况来看,国内外研制开发的这些软件系统在实用性上仍不尽如人意。一方面原因是作为一个很复杂的系统,排课要想面面俱到是一件很困难的事;另一方面每个学校由于其各自的特殊性,自动排课软件很难普遍实用,特别是在调度的过程中一个很小的变动,要引起全部课程的大调整,这意味着全校课程大变动,在实际的应用中这是很难实现的事。
4解决NP问题的几种算法及其比较
解决NP完全问题只能依靠近似算法,所以下面介绍几种常用算法的设计思想,包括动态规划、贪心算法、回溯法等。
动态规划法是将求解的问题一层一层地分解成一级一级、规模逐步缩小的子问题,直到可以直接求出其解的子问题为止。分解成的所有子问题按层次关系构成一颗子问题树。树根是原问题。原问题的解依赖于子问题树中所有子问题的解。动态规划算法通常用于求一个问题在某种意义下的最优解。设计一个动态规划算法,通常可按以下几个步骤进行:
1. 分析最优解的性质,并刻划其结构特征。
2. 递归的定义最优解。
3. 以自底向上的方式计算出最优解。
4. 根据计算最优解时得到的信息,构造一个最优解。
步骤1~3是动态规划算法的基本步骤。在只需要求出最优解的情形,步骤4可以省去。若需要求出问题的一个最优解,则必须执行步骤4。此时,在步骤3中计算最优解时,通常需记录更多的信息,以便在步骤4中,根据所记录的信息,快速地构造出一个最优解。
(二)贪心算法
当一个问题具有最优子结构性质时,我们会想到用动态规划法去解它,但有时会有更简单、更有效的算法,即贪心算法。顾名思义,贪心算法总是做出在当前看来最好的选择。也就是说贪心算法并不是整体最优上加以考虑,他所作出的选择只是在某种意义上的局部最优的选择。虽然贪心算法不是对所有问题都能得到整体最优解,但对范围相当广的许多问题它能产生整体最优解,如图的算法中单源最短路径问题,最小支撑树问题等。在一些情况下,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解。
在贪心算法中较为有名的算法是Dijkstra算法。它作为路由算法用来寻求两个节点间的最短路径。Dijkstra算法的思想是:假若G有n个顶点,于是我们总共需要求出n-1条最短路径,求解的方法是:初试,写出V0(始顶点)到各顶点(终顶点)的路径长度,或有路径,则令路径的长度为边上的权值;或无路经,则令为∞。再按长度的递增顺序生成每条最短路径。事实上生成最短路径的过程就是不断地在始顶点V何终顶点W间加入中间点的过程,因为在每生成了一条最短路径后,就有一个该路径的终顶点U,那么那些还未生成最短路径的路径就会由于经过U而比原来的路径短,于是就让它经过U。
(三)回溯法
回溯法有“通用的解题法”之称。用它可以求出问题的所有解或任一解。概括地说,回溯法是一个既带有系统性又带有跳跃性的搜索法。它在包含问题所有解的一颗状态空间树上,按照深度优先的策略,从根出发进行搜索。搜索每到达状态空间树的一个节点,总是先判断以该节点为根的子树是否肯定不包含问题的解。如果肯定不包含,则跳过对该子树的系统搜索,一层一层地向它的祖先节点继续搜索,直到遇到一个还有未被搜索过的儿子的节点,才转向该节点的一个未曾搜索过的儿子节点继续搜索;否则,进入子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根的所有儿子都已被搜索过才结束;而在用来求问题的任一解时,只要搜索到问题的一个解就可结束。 本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/hanpoyangtitan/archive/2009/04/03/4046709.aspx

热点内容
java运维工程师 发布:2024-11-19 14:21:25 浏览:770
linuxgmt 发布:2024-11-19 14:21:16 浏览:56
政治算法学吗 发布:2024-11-19 14:21:09 浏览:332
二维码生成python 发布:2024-11-19 14:19:00 浏览:555
压缩衣排名 发布:2024-11-19 14:18:49 浏览:453
安卓手机商务型哪个牌子好 发布:2024-11-19 13:43:04 浏览:584
云主机哪个配置好 发布:2024-11-19 13:34:43 浏览:968
c语言数字u 发布:2024-11-19 13:34:02 浏览:961
九游游戏安卓手机下载慢怎么回事 发布:2024-11-19 13:29:03 浏览:433
无线存储共享器怎么样 发布:2024-11-19 13:29:02 浏览:112