在介绍GAwizard和GASequence在模型上的应用时,先推荐几篇博客,有助于接下去的理解
遗传算法的简单介绍:点击打开链接
遗传算法交叉过程的理解:点击打开链接
笔者在调试该模型中,认为下面两个概念比较重要
交叉率:判断父代两两个体是否需要交叉的概率
变异率:判断该染色体(序列)是否需要变异的概率
关于仿真模型与遗传算法的总体关系,在软件帮助中已经给出,如下图所示:
具体设置中,GAwizard的对象其实是GA控件GASequence,指采用了GA序列的方式来使用遗传算法,GAwizard类似总部,对于本模型采用了GA序列方式。
在GASequence的Attributes选项中,只需修改数据类型,因为序列表示方式均为整型数字。其它参数设置大多与Position Constraints位置约束有关,如若以后分析需要,在以后博客更新。另外,在初始化过程中,方法Init中有以下代码
for var i := 1 to Number_OF_Machine
GASequence[1, i] := i
next
执行过后,将在GASequence的Define Set生成初始集
在GAwizard中,首先声明了对象是GASequence,另外设置好了迭代次数,以及每一代产生的个体数,设置适应度为HandlingCost,与模型保持一致。最重要的,是GA-tables参数化模型,该方法将计算每一代每一种情况(每一个新序列对应的适应度),并将对应的结果反馈到MachineSequence表格当中
代码和解析如下
/* The global variable 'individual' is an individual consisting of chromosomes.
The order of chromosomes is defined by the wizard object.
called by: evaluate (in case of the first_individual of a generation)
and endSim
result: A simulation can be started with the settings of the_individual.
*/
-> boolean --方法返回布尔值
--配置方法,该方法执行的评估不重复的染色体序列下的HandlingCost(适应度)
var obj: object
var chrom: table
chrom := individual[1,1] --定义初始序列到表chrom,individual理解为染色体序列
result := true --个人认为,当染色体序列为新序列时,返回True,执行该方法
obj := .Models.A.MachineSequence --优化结果转录对象MachineSequence机器序列
obj.sort(2, "up") --按原来次序排序
for var i := 1 to obj.YDim
obj[3, chrom[1, i]] := i --将优化个体排序输出到MachineSequence列表
next
obj.sort(3, "up") --按优化次序排序
/*for var q := 1 to chrom.YDim --用于观察新产生得的染色体序列
print chrom[1, q]
next
print "------------"*/
优化结果如下,可以看到跟教材上面比较接近了:
此外,关于HandlingCost加权设置为1的理解,当目标函数(适应度)为多个,也就是俗称的多目标函数,加权需要分配权重,和值为1。
最后,是一点小改,用于快速修改MachineSequence序列排序方式,按照初始或者优化排序。见下图和程序
MachineSequence.sort(2,"up")
MachineSequence.sort(3,"up")
提示:sort函数是按对应列修改排序方式,值得注意表格的行具有相关性,修改某列的排序会影响到与之对应的行,详情可以参考软件帮助。下一篇将会研究软件自带的关于遗传算法Demo。如下: