java - 使用遗传算法(JAVA)的大学时间表计划项目

标签 java scheduling genetic-algorithm timetable

个人信息:
大家好,
我是计算机科学专业的学生;谁(很不幸)必须为我的“最后一年”项目解决这个NP-Complete问题。除了在大学里完成的任务和学到的东西之外,我在编程方面没有经验。因此,对于可能会提出的任何无知问题,我深表歉意。



使用遗传算法的大学时间表计划项目:

这是我的大学期末项目的主题。我已经收集了所需的信息,并撰写了我的提案和进度报告,因此我充分意识到这个主题是NP-Complete。但是,我的项目的目标不是创建黄金时间表,完全优化且没有问题,而是我只需要确保它可以接受并且不会违反我的某些规则。

关于我的方法论和创建此应用程序的方式,我决定使用两种主要的人工智能技术来解决该问题。遗传算法和约束满意度。我想出了一些规则,将它们分为两个主要组。软约束和硬约束。因此该算法应以这种方式工作:

假设我们有输入(教室及其功能,主题名称,讲师和注册的学生人数)。该应用程序从生成随机时间表开始。但是,我决定实施我的硬约束,这是不容忽视的约束(例如,同一位讲师在同一时间同时教授多个课程,或者在任何给定时间教室都被多个科目占用)。因此,基本上,我们在生成随机时间表,但在创建随机时间表时,我们对其应用了严格的约束。我想称它为随机生成的时间表。下一步是找到最佳时间表。使用我之前谈到的技术;我们已经知道生成的时间表在硬约束方面是可以接受的,现在使用遗传算法,我将找到最佳的(最优化的)时间表并将其作为结果。因此,在我的GA适应度函数中将使用软性约束(例如,在上课之间休息,避免同一科目每天上一堂课以上)。



在我开始编程之前,所有这些都是解决问题的好方法。他们在纸上看起来不错,但是我的编程技能使我无法完成项目。

我对编码部分有一些疑问,如果你们能帮助我,我将不胜感激。

问题:
1.关于Java遗传算法库的任何良好的教程和指南,手册吗?我决定使用Jgap,是从人们对其他线程的建议中得出的,但是我在Internet上找不到任何很好的教程,但是不幸的是,在我们查看了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);


}

}




请记住,上面显示的代码只是一个原型(我试图创建时间表)。

如果有人愿意帮助我,我可以提供到目前为止我在该项目中所做的工作的完整文档。



感谢任何帮助我并希望这也能帮助其他人的人
希拉德

最佳答案

我已经使用遗传算法解决了生产应用中的大学时间表计划问题。

不用太担心要使用的库,那里有很多很棒的Java GA库。

您应该关注的重点是对候选时间表进行编码的方式。通常,您将使用数字表示形式,例如['数学','化学',物理学] = [1、4、6]
每个数字代表一个唯一的类别,而该数字的索引代表提供该类别的时间。然后,适应度函数将采用表示一组候选时间表的值的多维数组,然后将该种群与学生列表进行比较,并应用约束(例如冲突)并计算可能的适应度。

您可能还想考虑fitness normalization

最重要的是,不要使用对象来存储时间表信息,而要使用简单的整数数组,这将大大提高泛型算法的速度。

关于java - 使用遗传算法(JAVA)的大学时间表计划项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31586199/

相关文章:

c - 具有实时任务的多核 Linux 软锁定

java - 使用定时服务每 n 个月安排一次任务

java - 配置基本路径下的 Spring Data REST Controller

java - EJB 抽象实体导致 java.lang.NoClassDefFoundError?

java - volatile 关键字对于 Java 中的非原始值来说是无关的吗?

c# - ASP.NET-如何定期监控数据库表?

python - DEAP 框架 - 使用每个基因统计数据的 mutGaussian

multithreading - 优化计算中使用的 # 个线程的算法

algorithm - 在 GA 中执行依赖项交叉的好方法是什么?

java - oracle ordim 为图像添加水印