关于排课系统算法,急啊

pop0082 2004-04-01 09:45:29
小弟要做个学校的教学排课系统,因小弟学校校区众多,人数不少,所以比较麻烦,特请高人指教一下在算法上给点建议,不胜感激
qq46793263
...全文
534 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
demo001 2004-04-03
  • 打赏
  • 举报
回复
mark la ~~~~~~~~~
Kingxinyu 2004-04-03
  • 打赏
  • 举报
回复
学习
f123 2004-04-03
  • 打赏
  • 举报
回复
线形代数里面有一个基本型的东西。
专门用来作线性规划的,如果学过线代的话可以去看看。

如果不行,可以看看lingo软件,专门解线性规划的。
pop0082 2004-04-03
  • 打赏
  • 举报
回复
呵呵,哦,多谢 ZhangYv(Deadlock大哥提醒,小弟不知行情啊:)
ZhangYv 2004-04-03
  • 打赏
  • 举报
回复
代码你就别想了,通常排课系统都是商业软件,而且“排课”是教务管理系统的核心,成熟的一套至少要卖20W...
pop0082 2004-04-03
  • 打赏
  • 举报
回复
呵呵,多谢大家这样关心zhouqingyuan(浪帆) 代码似乎很难找的到,可以给点建议吗?
goodluckyxl(Yaz!|X)谢谢哦,希望大家能以这样形式参与讨论,也让我有个学习机会,
无 以为报只有到时散分:)当然最重要的是让我学到很多
谢谢楼上的各位
goodluckyxl 2004-04-03
  • 打赏
  • 举报
回复
大家可以帮他提点思路什么的
通俗点我觉得可以
虽然我们时间不多,一人提一点
兴许可以帮到他

1.对象:教师 教室(地点) 班级 时间 课程
讲所有内容都列表存储,每次分配必须查询
教室资源是独占的,每次分配出去后不能再做分配
例如每次分配完可以加标志位1或0

因为每个系的课程是确定的
首先确定时间-课程-教室
然后确定班级
确定老师
hlj201 2004-04-03
  • 打赏
  • 举报
回复
期待中.....
xspspring 2004-04-03
  • 打赏
  • 举报
回复
mark
zhouqingyuan 2004-04-03
  • 打赏
  • 举报
回复
千万不要参考什么硕士论文,为了发表,很多硕士都是把一个简单的问题复杂化,
然后模糊化,然后再写出来,硕士的论文只能由写论文的人抄袭用的,可不能给
你什么思想或者什么知道作用的。还是直接找别人的源代码参考比较好的。

这是实话,别以为是开玩笑哦!
hqlsy 2004-04-02
  • 打赏
  • 举报
回复
排课算法是一个很大的算法哦。
要是有人能够实现一个高效的算法,那就发达了。
psbeond 2004-04-02
  • 打赏
  • 举报
回复
可能要用过全排列算法吧?把所有可能的组合实现出来,任选一种就可以了,给你一个STL全排列算法:
next_purmutation
自己写的话:
template < typename T >
bool _next_permutation( T *first, T *last );
#define N 8
int main(int argc, char* argv[])
{
int i;
int y = 1;//序号
char a[N];
for ( i=0; i<N; i++ )
{
a[i] = i + 1 + 64 + 32;
}

/* a[0] = 'd';
a[1] = 'c';
a[2] = 'h';
a[3] = 'g';
a[4] = 'f';
a[5] = 'e';
a[6] = 'b';
a[7] = 'a';
_next_permutation( &a[0], &a[N] );*/
long t0 = time( NULL );
do
{
cout << y << " ---> ";
for ( i = 0; i<N; i++ ) cout << a[i];
cout << endl;

y++;
}while( _next_permutation( &a[0], &a[N] ) );
long t1 = time( NULL ) - t0;
cout << t1 << endl;//当N为8时耗时130秒,与泛型算法next_permutation用时一样

return 0;
}

template < typename T >
bool _next_permutation( T *first, T *last )
{
int i;
int j;
int x = -1;
int rang = last - first;
//从左向右找最后一个左边数小于右边数的位置,记为x
for ( i=0; i<rang-1; i++ )
{
if ( *( first+i ) <= *( first+i+1 ) )
{
x = i;
}
}

if ( x != -1 )
{
//从上面的x位置到最后,找最后一个比a[x]大的数的位置,记为j,如果没有,j等于x
for ( i=x; i<rang; i++ )
{
if ( *( first+x ) <= *( first+i ) )
{
j = i;
}
}

//找到后交换a[x], a[j]
_swap( *( first+x ), *( first+j ) );

//把上面x后一个位置到最后的数列逆置
for ( i=x+1; i<rang; i++ )
{
if ( i != rang + x - i )
{
int nSwap = rang + x - i;
_swap( *( first+i ), *( first+ ( rang+x-i ) ) );
}
if ( ( i + 1 ) * 2 > rang + x )
{
break;
}
}
}

if ( -1 == x ) return false;
else return true;
}

template < typename T >
void _swap( T &a, T &b )
{
a = a + b;
b = a - b;
a = a - b;
}
pop0082 2004-04-02
  • 打赏
  • 举报
回复
呵呵
看论文和做代码工人就是不一样啊
头疼
ZhangYv 2004-04-02
  • 打赏
  • 举报
回复
呵呵,这个问题是很有挑战性!使用AI的一些搜索技术可以得到基本的解决,比如遗传算法,人工蚂蚁之类....论文?我也看不懂!~
pop0082 2004-04-02
  • 打赏
  • 举报
回复
谢谢各位大哥的建议,的确挺复杂的,小弟也是毕业设计的要求这个比较有挑战性所以选的这个,参考了些硕士论文,也是迷茫与理解中挣扎,呵呵,希望各位可以在这多留言,给我也开阔思路,弄懂这个问题做好设计,至于散分,小弟可以不惜血本:)主要也是想有所理解,在此谢谢了
playmud 2004-04-02
  • 打赏
  • 举报
回复
嗯,曾经考虑过,由于排课的很多规则无法转换成程序的规则,要么很多东西属于模糊算法的东西。老师,课程,教室,等等,不过也有一些可以形成规则的东西,比如体育课一般安排在下午,英语尽量安排在上午等等。
ZhangYv 2004-04-02
  • 打赏
  • 举报
回复
这个问题非常复杂的,这个问题国内没有一个软件做的好的。因为组合方案太多会面临“组合爆炸”的情况,一般使用解决NP类问题的搜索方法。用二部图的匹配确实可以,但是效率很低。我大一的时候也做过一个,可以实现排课的功能。使用Las Vegas算法,效率一般般,可惜那时是用VB写的,大二时再重看时觉得代码写的非常恶心,就直接被我删除了没留源代码。
hyifeng 2004-04-02
  • 打赏
  • 举报
回复
以前考虑过,可是因为太复杂没有做下去。
RookieStar 2004-04-02
  • 打赏
  • 举报
回复
关注……
ccmouse 2004-04-02
  • 打赏
  • 举报
回复
建议你参考一下二部图匹配的算法。
很复杂。
加载更多回复(1)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧