基因相关性Java_遗传算法框架-基于java jenetics库实现

本文介绍了如何使用Java遗传算法库jenetics来实现遗传算法,并提供了一个简化业务代码的框架。通过调整参数如种群大小、最大迭代次数,以及启用稳定适应度函数,展示了如何解决不稳定问题并找到最佳解决方案。遗传算法虽然计算密集,但在无法穷举、数据量小或非线性评估场景下具有优势。
摘要由CSDN通过智能技术生成

本篇并非介绍如何从0开始开发遗传算法框架,反而推荐各位使用已有的GA库jenetics来做遗传算法。

GA算法的逻辑还是贴下:

f10a0ccf00e312027efb7f9cc351fccb.png

好了,下面介绍的是基于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里

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值