对于遗传算法,通常基因符号如下:
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中。
答案 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还是作为学生?