此实现参考了遗传算法Java实现源代码,我自己实现了scala版本的遗传算法,scala还在学习阶段,有误的地方请多指教
0. 说明
GA应用于数值函数优化计算
用于评价遗传算法性能:
例如:
De Jong函数F1:
f1(x1,x2,x3)=x1^2+x2^2+x3^2
-5.12<=xi<=5.12 (i=1,2,3)
编码方式:
二进制:取值范围是-5.12到5.12,用长度为10位的二进制编码串来分别表示三个决策变量
10为二进制编码可以表示0-1023之间的1024个不同数,因此将x1,x2,x3的定义域离散化
为1023个均等的区域,包括两个端点在内公有1024个不同的离散点。
用于评价遗传算法性能:
例如:
De Jong函数F1:
f1(x1,x2,x3)=x1^2+x2^2+x3^2
-5.12<=xi<=5.12 (i=1,2,3)
编码方式:
二进制:取值范围是-5.12到5.12,用长度为10位的二进制编码串来分别表示三个决策变量
10为二进制编码可以表示0-1023之间的1024个不同数,因此将x1,x2,x3的定义域离散化
为1023个均等的区域,包括两个端点在内公有1024个不同的离散点。
1.染色体
package com.ga
import scala.collection.mutable.ArrayBuffer
/**
* 染色体
*/
class Chrome(val length:Int) extends Cloneable {
var chrome=new Array[Char](length);
var chromeLength=length;
//设置基因
def setGene(begin:Int,end:Int,ge:String):Boolean={
if(ge.length>end-begin+1) return false;
for(i<-begin to end){
chrome(i)=ge.charAt(i-begin)
}
true;
}
//获取基因
def getGene(begin:Int,end:Int):String={
chrome.subSequence(begin, end+1).toString()
}
override def toString():String={
chrome.mkString
}
override def clone={
val c = super.clone.asInstanceOf[Chrome]
c.chrome=chrome.clone
c
}
}
2. 抽象个体
package com.ga
/**
* 抽象个体
*/
trait Agent extends Cloneable{
protected var chrome:Chrome=_;//染色体编码
protected var geneLength:Int=_;//基因长度
protected var fitness:Double=_;//适应度
protected var targetValue:Double=_;//目标函数
def coding//编码
def decode//解码
def calFitness//计算个体适应度
def generateAgent//随机生成个体
def calTargetValue//获取目标函数
def getfitness=fitness
def getTargetValue=targetValue
def getChromLen=chrome.chromeLength
de