个人信息: 大家好, 我是一名计算机科学专业的学生;谁(不幸的是)必须在我的最后一年项目中处理这个NP-Complete问题。我在编程和我在大学学到的东西之外的编程经验并不是很有经验。所以我对我可能会提出的任何无知问题表示歉意。
使用遗传算法的大学时间表调度项目
这是我的大学最后一年项目的主题。我已经收集了所需的信息并写了我的提案和进度报告,所以我完全清楚这个主题是NP-Complete。然而,我的项目的目标不是创建黄金时间表,完全最优,没有问题,而是我必须确保它是可接受的,并没有打破我的一些规则。
关于我的方法和我想要创建这个应用程序的方式,我决定使用两种主要的人工智能技术来解决问题;遗传算法和约束满足。我提出了一些规则并将它们划分为两个主要群体;软约束和硬约束。所以算法应该这样工作:
假设我们有输入(课堂及其能力,科目名称,讲师和学生注册的数量)。应用程序从生成随机时间表开始。然而,我决定实施我的硬约束,一个不容忽视的约束(例如,在同一时间让同一个讲师同时教授多个课程或在任何特定时间教授多个课程)。所以基本上我们正在生成随机时间表,但是当我们创建它们时,我们将硬约束应用于它们。我想称之为随机生成的时间表。下一阶段是找到最佳时间表。使用我之前谈过的技术;我们已经知道生成的时间表在硬约束方面是可以接受的,现在使用遗传算法我会找到最好的(最优的)时间表并将其作为结果。因此,在我的GA健身功能中将使用如此柔和的约束(例如在课堂之间中断,避免同一主题每天有多个课程等)。
所有这些都是解决问题的好方法,直到我开始编程。好吧,他们在纸上看起来不错,但我的编程技巧让我回到完成这个项目。
我对编码部分有一些疑问,如果你们能帮助我,我将不胜感激。
问题: 1.任何好的教程和指南,java中遗传算法库的手册?我决定使用Jgap,来自人们对其他线程的建议,但我无法在互联网上找到任何关于它的好教程,不幸的是在我们查看Jgap库中提供的一些示例后,我还是无法弄清楚那里发生了什么。
最重要的问题: 1.如何制定时间表?好吧,正如我所说,我不是一个优秀的程序员。因此,您可以假设我在项目的第一步停留,创建时间表。我必须把它当作一个对象吗?你们通常用什么样的数据结构来创建时间表?数组,链表,队列?
以下是我创建时间表的尝试:
**UPDATED**
有时在这个项目上工作。我设法创建了时间表。这是我之前分享的类的更新。
public class Subject {
public String name;
public int Students;
public String NameOfLecturer;
public ClassVenu addVenues;
public Subject(String argName, String argNameofLecturer, int argStudents)
{ name = argName; NameOfLecturer=argNameofLecturer; Students=argStudents;
}
public String toString() { return name;}}
public class ClassVenu {
public String ClassName;
public int ClassCapacity;
public ClassVenu(int argClassCapacity, String argClassName)
{ ClassName = argClassName; ClassCapacity = argClassCapacity; }
}
public class Days extends Hours{
public Days(Subject a, Subject b,Subject c, Subject d,Subject e, Subject f,Subject g,Subject h, Subject j)
{int i=0;
TimeSlot[i]=a;
TimeSlot[i+1]=b;
TimeSlot[i+2]=c;
TimeSlot[i+3]=d;
TimeSlot[i+4]=e;
TimeSlot[i+5]=f;
TimeSlot[i+6]=g;
TimeSlot[i+7]=h;
TimeSlot[i+8]=j;
}
package fyp_small_timetable;
public class Hours {
public Subject [] TimeSlot = new Subject[9];
}
package fyp_small_timetable;
public static void main(String[] args) {
//creating Subjects
Subject A = new Subject("Human Computer Interaction", "Batman" , 49);
Subject B = new Subject("Artificial Intelligence", "Batman" , 95);
Subject C = new Subject("Human Computer Interaction", "Batman" ,180);
Subject D = new Subject("Human Computer Interaction", "Batman" , 20);
Subject E = new Subject("Empty", "No-One", 0);
//Creating Class Venue
ClassVenu Class1 = new ClassVenu(100,"LecturerTheater1");
ClassVenu Class2 = new ClassVenu(50,"LecturerTheater2");
ClassVenu Class3 = new ClassVenu(200,"LecturerTheater3");
//Creating Days
Days Day1 =new Days(A, A, E, B, B, E, E, A, A);
Days Day2 =new Days(C, C, E, D, D, E, E, A, A);
Days Day3 =new Days(E, E, E, B, B, E, E, A, A);
Days Day4 =new Days(C, C, E, C, C, E, E, A, A);
Days Day5 =new Days(A, A, E, B, B, E, E, A, A);
//creating Timetable
TimeTable T1 = new TimeTable(Day1, Day2, Day3, Day4, Day5);
List<Subject> answer = T1.ShowTimetable(T1);
System.out.println(answer);
}
}
请记住,上面显示的代码只是一个原型(我尝试创建时间表)。
如果有人愿意帮助我,我可以提供我迄今为止在这个项目中所做的完整文档。
感谢所有帮助我的人,并希望这也可以帮助他人 HiRAD能
答案 0 :(得分:0)
我使用遗传算法来解决生产应用程序中的大学时间表调度问题。
不要过分担心要使用的库,那里有许多优秀的Java GA库。
您应该关注的是您对候选时间表进行编码的方式。通常你会使用数字表示法,例如['math','chemistry',physics] = [1,4,6] 每个数字代表一个唯一的类,而该数字的索引代表提供类的时间。然后,适应度函数将采用表示候选计划群体的多维值数组,然后将该群体与学生列表和应用的约束进行比较,例如碰撞和计算的可能适合度。
您可能还想要fitness normalization。
最重要的是,不要使用对象来存储时间表信息,而是使用简单的整数数组,这将大大提高Generic算法的速度。