【问题标题】:How to represent a schedule for Timetabler Problem in Genetic Algorithms?如何在遗传算法中表示时间表问题的时间表?
【发布时间】:2011-06-01 12:53:11
【问题描述】:

对于遗传算法,基因通常用这样的符号表示:

PARENT1: 101101010101001001001001110011100110101011101101
PARENT2: 010100111011010101110101001001101011001010010110

所以交叉,突变可以用这种表示来完成,如下所示:

选择一个交叉点:

PARENT1: 1011010101010010 01001001110011100110101011101101
PARENT2: 0101001110110101 01110101001001101011001010010110

执行交叉产生一个孩子:

CHILD: 1011010101010010 01110101001001101011001010010110

然后变成一个全新的染色体:

CHILD: 101101010101001001110101001001101011001010010110

我的问题是如何用 Java 表示每周的日程安排基因?

示例摘自这篇文章:http://secretgeek.net/content/bambrilg.pdf

我正在用 Java 解决这个时间表问题,并想代表

FIGURE 10: An Entire University Timetable

在 Java 中。

【问题讨论】:

  • 与您的问题无关,但如果您可以使用 Matlab 并且您有
  • 与您的问题无关,但如果您可以使用 Matlab 并且您没有限制使用 Java。我建议去Matlab。以我个人的经验,Matlab 有很棒的 GA 和软计算工具箱。值得探索。
  • @Nishant 我必须在 Java 中使用 impelement。

标签: java algorithm genetic-algorithm


【解决方案1】:

下面的代码可能会让您了解如何解决该问题。一个解决方案(将是大学时间表)由一系列单人房间组成。这些单人房间每个都有一个二维数组,其中列是天数,行是小时数。我将 HOURS 设置为 16,因为我认为晚上不会有课。所以 Hour Row 1 将是一天中的第一个小时……可能是早上 7 点到 8 点。数组的值显示预订了哪个班级。

public class SingleRoom {
    static final int DAYS  = 7;
    static final int HOURS = 16;
    . . .
    private int[][] timetable = new int[DAYS][HOURS];   //0 would say room is not booked, >0 indicates the booked class (english advanced (12), object oriented programming (139), etc..)
}

public class Solution {
    static final int AVAILABLE_ROOMS = 26;
    . . .
    private SingleRoom[] university_timetable = new SingleRoom[AVAILABLE_ROOMS];    
}

变异:

更改班级突变 - 将班级更改为另一个随机班级或零 = 不预订

打开/关闭课程 - 如果预订了特定房间的一天一个小时,请将其关闭 如果没有预订,请使用随机班级打开它 这是为了让算法有可能不预订小时数,因为在更改类突变中,0 被选择的概率很低

约束: 创建解决方案后,检查所有约束并保持有效的解决方案 如果新的有效解决方案比您的群体中已有的其他解决方案更好,或者它们增强了您的群体的多样性,则必须将新的有效解决方案插入您的群体(解决方案)中

但是在您提到的文档中,它很好地描述了如何针对此问题实施 GA(从第 16 页开始)。

我为多目标优化算法 mPOEMS(Multiobjective Prototype optimization with Developed Improvement Steps)编写了一个通用的 Java 框架,这是一个使用进化概念的 GA。

您可以找到代码here,它可能会让您知道如何解决您的问题:

您可以使用该算法找到的解决方案已在一项科学工作中与最先进的算法 SPEA-2 和 NSGA 进行了比较,并已证明: 该算法的性能相当甚至更好,具体取决于您用来衡量性能的指标。

你可以找到它here

更多资源: 我的论文将这个框架应用于项目选择问题: http://www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf

框架的文档: http://thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf

mPOEMS 演示文稿: http://portal.acm.org/citation.cfm?id=1792634.1792653

实际上,只要有一点热情,您就可以轻松地使通用框架的代码适应您的需求。

您是在工作中还是在学生期间编写此 GA?

【讨论】:

  • 我没有时间回复这条评论。我会根据您的建议尝试找到解决方案。我正在为学校而不是为工作实施它。
  • 您建议使用二维数组作为时间表(行、列)。将其更改为数组是否合乎逻辑。我的意思是,例如将不同的索引定义为星期一 7 到 8 点,星期一 8 到 9 点,....,星期二 7 到 8 点,星期二 8 到 9 点,....等等?
  • 你的突变报价很安静,但是交叉呢?
  • 有不同的交叉方法可用:optiwater.com/optiga/crossover.html 我使用了这个算法:创建两个孩子,用 50/50 的概率填充第一个孩子,从第一个/第二个父母中选择基因,创建第二个孩子第一个孩子没有选择基因。你可以在这里找到我的代码:pastebin.com/9Z2PERw9,但由于 mPOEMS 在实际解决方案层之上使用了一个动作概念,这可能有点令人困惑。但它让您了解如何进行交叉。
  • 您的一维数组方法听起来很合理,并且可能更容易处理。不过我会选择二维的 ;-)
猜你喜欢
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多