如何表示遗传算法中的时间表问题的时间表?

时间:2010-12-30 12:03:58

标签: java algorithm genetic-algorithm

对于遗传算法,通常基因符号如下:

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中。

1 个答案:

答案 0 :(得分:2)

下面的代码可能会让您了解如何解决问题。一个解决方案(可能是大学时间表)由一系列单人房组成。这些单人房每个都有一个2维数组,其中列是日,行是小时。我将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(具有演化改进步骤的多目标原型优化)编写了一个通用的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还是作为学生?