个人信息: 大家好,我是计算机专业的学生;谁(不幸的是)必须为我的最后一年项目解决这个 NP-Complete 问题。除了我的作业和我在大学学到的东西之外,我在编程方面没有那么丰富的经验。因此,对于我可能提出的任何无知问题,我深表歉意。
使用遗传算法的大学时间表计划项目:
这是我大学最后一年项目的主题。我已经收集了所需的信息并写了我的提案和进度报告,所以我完全意识到这个主题是 NP-Complete 的。然而,我的项目的目标不是创建黄金时间表,完全优化并且没有问题,而是我只需要确保它是可以接受的并且不会违反我的一些规则。
关于我的方法和我想要创建这个应用程序的方式,我决定使用两种主要的人工智能技术来解决这个问题;遗传算法和约束满意度。我想出了一些规则,并将它们分为两大类;软约束和硬约束。所以算法应该这样工作:
假设我们有我们的输入(教室及其容量、学科名称、讲师和注册的学生数量)。该应用程序从生成随机时间表开始。然而,我决定在这个阶段实施我的硬约束,一个不容忽视的约束(例如,同一位讲师同时教授多个课程或教室在任何给定时间占用多个科目)。所以基本上我们正在生成随机时间表,但在创建它们时,我们对它们应用硬约束。我想称之为引导式随机生成的时间表。下一阶段是找到最佳的时间表。使用我之前谈到的技术;我们已经知道生成的时间表在硬约束方面是可以接受的,现在使用遗传算法我会找到最好的(最佳)时间表并得到结果。因此,我的 GA 的健身功能将使用软约束(例如在课间休息、避免同一科目每天上不止一节课等)。
在我开始编程之前,所有这些都是解决问题的好方法。好吧,它们在纸上看起来不错,但我的编程技能阻碍了我完成项目。
我有一些关于编码部分的问题,如果你们能帮助我,我将不胜感激。
问题: 1. java 中遗传算法库的任何好的教程和指南,手册?我决定使用 Jgap,来自人们对其他线程的建议,但我在互联网上找不到任何关于它的好的教程,不幸的是,在我们查看了 Jgap 库中提供的一些示例之后,我仍然无法弄清楚那里发生了什么。
- 对于我想要应用的约束编程部分,我是否必须使用 Java 上的任何特定库,或者我可以使用 If/Else 或 switch 语句来做到这一点?如果是这样,请告诉我名称和详细信息。
最重要的问题: 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