本篇并非介绍如何从0开始开发遗传算法框架,反而推荐各位使用已有的GA库jenetics来做遗传算法。
GA算法的逻辑还是贴下:
好了,下面介绍的是基于jenetics开发的更贴近业务侧的框架,以及使用方法。
pom依赖,毕竟java的嘛,就不要用matlab、R、python这些了
io.jenetics
jenetics
5.1.0
io.jenetics
jenetics.ext
5.1.0
先看看我们提供的这个框架,能怎样简化业务侧代码吧:
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5); //需要指定一个线程池,因为GA算法需要很多运算
Demo1SolutionConverter demo1SolutionConverter = new Demo1SolutionConverter(); //这个class中定义了GA算法所需的底层基因序列的定义、以及业务解决方案class与基因的互相转换逻辑
Demo1FitnessBuilder fitnessBuilder = new Demo1FitnessBuilder(); //这个class定义了适应度函数的指向(遗传算法非常依赖适应度函数,非常非常依赖,重中之重)
EngineInvokeOptions options = new EngineInvokeOptions(); //引擎调用默认参数,如需改写默认参数单独修改即可
options.setFitnessBuilder(fitnessBuilder);
options.setEnableMaxLimits(true); //设置为停止条件为最大种群次数限制
options.setMaxLimits(20); //设置为最大次数限制为20次,既:20次种群迭代
for(int idx=0;idx<20;idx++) { //连续执行20次看效果
MinMaxScaler minMaxScaler = new MinMaxScaler(100, false);
GAEngine gaEngine = new GAEngine(50, executorService);
Demo1SolutionConverter.Demo1Solution solution = (Demo1SolutionConverter.Demo1Solution) gaEngine.generate(demo1SolutionConverter, minMaxScaler, options);
System.out.println(solution.toString());
}
executorService.shutdown();
}
我们先看看核心class:Demo1SolutionConverter,这个是每个业务都不同的地方,需要单独业务单独编码
public class Demo1SolutionConverter extends DefaultSolutionConverter { //DefaultSolutionConverter是框架里的默认实现,已经实现了很多默认方法
@Override
public AbstractSolution convert2Solution(EvolvingSolutionInfo solutionInfo) {
Demo1Solution solution=new Demo1Solution();
solution.setFitnessValues(solutionInfo.getFitnessValues());
Genotype geneMap=solutionInfo.getMap(); //这个是获取基因架
Chromosome chromosome=geneMap.getChromosome(); //获取默认的也就是第一个基因条
for(int idx=0;idx
{
IntegerGene integerGene=chromosome.getGene(idx);
if(integerGene.intValue()==1)
{
solution.getSelectedIds().add(idx); //这里实现的解码逻辑:共10个数字,有2种可能0和1,0代表不选中,1代表选中,选中了就会加入selectedIds这个List里
}