Java遗传算法(GA)简单例子
文章目录
- 前言
- 一、解决的函数
- 二、遗传和变异算子
- 1.交叉
- 2.变异
- 源代码
前言
Java遗传算法(GA)简单例子
采用的是实数编码
一、解决的函数
f(x) = x1²+x2²+x3²
//计算适应度,函数式的解public static double fitness(double[] individual, int N) {double f = 0;for (int i = 0; i < N; i++) {f += individual[i] * individual[i];}return f;}
想要解决别的函数只需要改变适应度函数
列如求
只需要把函数改为
//计算适应度,函数式的解public static double fitness(double[] individual, int N) {double f = 0, f1 = 0, f2 = 0;for (int i = 0; i < N - 1; i++) {f1 = (individual[i + 1] - individual[i] * individual[i]) * (individual[i + 1] - individual[i] * individual[i]) * 100;f2 = (individual[i] - 1) * (individual[i] - 1);f += f1 + f2;}return f;}
二、遗传和变异算子
1.交叉
随机交换父类和母类的基因组成子类
//3.交叉for (int i = 0; i < NP; i++) {double cr = Math.random();if (cr < CR) {//交叉//与哪个个体交叉,随机生成一个个体int indiv = random.nextInt(10);//从那个位置交叉,随机生成一个位置int index = random.nextInt(SIZE);for (int j = 0; j < SIZE; j++) {if (j == index) {//发生交叉的片段cr_population[i][j] = select_population[indiv][j];} else { //不发生交叉的片段cr_population[i][j] = select_population[i][j];}}} else {//不交叉for (int j = 0; j < SIZE; j++) {cr_population[i][j] = select_population[i][j];}}}
2.变异
变异通过在父类的基础上随机减去一个random.nextDouble()
//4.变异for (int i = 0; i < NP; i++) {double mu = Math.random();if (mu < MU) {//变异//在那个位置变异int index = random.nextInt(SIZE);for (int j = 0; j < SIZE; j++) {if (j == index) {mu_population[i][j] = mu_population[i][j] - random.nextDouble();} else {mu_population[i][j] = cr_population[i][j];}}} else {//不变异for (int j = 0; j < SIZE; j++) {mu_population[i][j] = select_population[i][j];}}}
源代码
package GA;import java.util.Random;class GA1 {public static void main(String[] args) {//开始时间long startTime = System.currentTimeMillis();int N = 3;//维度int NP = 500;//种群规模int SIZE = 3; //因为找三个所以数基因数为3int maxGen = 100;//迭代次数double CR = 0.8;//交叉概率double MU = 0.02;//变异概率double MAX = 10;//上限double MIN = -10;//下限double[][] init_population = new double[NP][SIZE];//初始化种群double[][] select_population = new double[NP][SIZE];//选择后的优质种群double[][] cr_population = new double[NP][SIZE];//交叉后种群double[][] mu_population = new double[NP][SIZE];//变异后种群double best_Y = Integer.MAX_VALUE;double[] best = new double[maxGen];//最优解double[] Y = new double[NP]; //对应种群中每个个体的适应度double[] addSumP = new double[NP];//每个个体被选中的概率累加和Random random = new Random();//1.初始化种群for (int i = 0; i < NP; i++) {for (int j = 0; j < SIZE; j++) {init_population[i][j] = MIN + random.nextDouble() * (MAX - MIN);//随机生成解}}//迭代for (int G = 0; G < maxGen; G++) {//2.选择优质个体,根据轮盘赌的形式挑选个体double sumY = 0;for (int i = 0; i < NP; i++) {//计算每个个体的适应度及全部适应度和Y[i] = fitness(init_population[i], N);sumY += Y[i];}double addSum = 0;for (int i = 0; i < NP; i++) {//记录每个个体别选中的累加和addSum += Y[i] / sumY;//当前个体概率addSumP[i] = addSum;//累加和}//根据累加和概率,判断轮盘指针是向那个个体for (int i = 0; i < NP; i++) {double r = Math.random();int index = 0;for (int k = 0; k < NP; k++) {if (r < addSumP[k]) {index = k;break;//选择了一个个体下标是index}}select_population[i] = init_population[index];//选择之后的种群}//3.交叉for (int i = 0; i < NP; i++) {double cr = Math.random();if (cr < CR) {//交叉//与哪个个体交叉,随机生成一个个体int indiv = random.nextInt(10);//从那个位置交叉,随机生成一个位置int index = random.nextInt(SIZE);for (int j = 0; j < SIZE; j++) {if (j == index) {//发生交叉的片段cr_population[i][j] = select_population[indiv][j];} else { //不发生交叉的片段cr_population[i][j] = select_population[i][j];}}} else {//不交叉for (int j = 0; j < SIZE; j++) {cr_population[i][j] = select_population[i][j];}}}//4.变异for (int i = 0; i < NP; i++) {double mu = Math.random();if (mu < MU) {//变异//在那个位置变异int index = random.nextInt(SIZE);for (int j = 0; j < SIZE; j++) {if (j == index) {mu_population[i][j] = mu_population[i][j] - random.nextDouble();} else {mu_population[i][j] = cr_population[i][j];}}} else {//不变异for (int j = 0; j < SIZE; j++) {mu_population[i][j] = select_population[i][j];}}}//5.当前最优解for (int i = 0; i < NP; i++) {best_Y = fitness(mu_population[i], N);if (best_Y > fitness(mu_population[i], N)) {best_Y = fitness(mu_population[i], N);}}best[G] = best_Y;System.out.println("第" + (G + 1) + "代,最大适应度为:" + best_Y);//6.保留优质个体for (int i = 0; i < NP; i++) {if (fitness(init_population[i], N) > fitness(mu_population[i], N)) {for (int j = 0; j < SIZE; j++) {init_population[i][j] = mu_population[i][j];}}}}//迭代结束//7.打印结果System.out.println("最优解为:");Best(best);//结束时间long endTime = System.currentTimeMillis();System.out.println("程序运行时间: " + (endTime - startTime) + "ms");}//打印最优解public static void Best(double[] best) {double a = 65535;int temp = 0;for (int i = 0; i < best.length; i++) {if (best[i] < a) {a = best[i];temp = i;}}System.out.println("最优解:" + a + "第一次出现代数: " + (temp + 1));}//计算适应度,函数式的解public static double fitness(double[] individual, int N) {double f = 0;for (int i = 0; i < N; i++) {f += individual[i] * individual[i];}return f;}}
Java遗传算法(GA)简单例子相关推荐
- java实现死锁简单例子,Java死锁的简单例子
Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁. 代码如下: Program.java /** * 程序类 * @author michael * */ public c ...
- go能否直接调用java_Go调用Java的一个简单例子
由于Java世界里有非常丰富的开源应用模型和轮子,而这些正是Go世界里面最缺乏的东西,所以我首先考虑的就是如何在Go里面调用现有的Java代码.早上写了个简单的Go调用Java的例子,在winxp环境 ...
- java线程的简单例子(Thread and runnable)
http://interper56-sohu-com.iteye.com/blog/172303 其实要了解java多线程只需要理解以下几个事情: 1) java.lang.Thraed类 2) ja ...
- java封装的简单例子_Java封装的简单例子
先来个例子看看: public class Man { //对属性的封装,一个人的姓名,年龄,妻子都是这个对象(人)的私有属性 private String name; private int age ...
- java多态的简单例子_要JAVA的简单例子,继承\多态的,详细讲解运行的每一步
java中的多态是动态绑定的,也就是说在编译期不能确定一个方法的执行体是哪个方法(在继承中重写的方法).执行果支委会根据在堆上分配的的引用去寻找方法体,所以产生你你所不想要的结果是正常的也是正确的.改 ...
- java 线程死锁简单例子_java 多线程死锁详解及简单实例
java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...
- GcExcel for java 6.0 简单例子 -jar has been cracked
GrapeCity Documents for Excel (简称:GcExcel)是葡萄城推出的一款基于 Java 平台的服务端高性能表格组件,可与 纯前端表格控件 SpreadJS 前后端兼容,无 ...
- python遗传算法计算实例_遗传算法python简单例子(详解)
# -*-coding:utf-8 -*- #目标求解sin(x)最大值 import random import math import matplotlib.pyplot as plt #初始化种 ...
- java hashtable import,Hashtable的一个简单例子
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下是关于Hashtable的简单例子,谁知道别的遍历Hashtable的方法,请回复! package no1; import java.util.En ...
最新文章
- 吴恩达《Machine Learning》Jupyter Notebook 版笔记发布!图解、公式、习题都有了
- 大咖开讲:一小时学会.NET MVC开发的那些事儿
- kmp2-HDU1358 HUST1010 POJ2406 POJ2752
- bootstrap 导航菜单 折叠位置_python测试开发django44.xadmin自定义菜单项
- python一个函数调用另一个函数的返回值_python-调用另一个函数后立即从函数返回...
- Odoo12中删除无效项目
- erlang 读取confg文件异常 could not start kernel pid error in config file
- zw版【转发·台湾nvp系列例程】HALCON MirrorRegion (Delphi)
- 隆重推荐:公民税权手册
- 战旗html5播放器为什么卡顿,视频站启用html5播放器
- Java1.8开始为什么用元空间替换永久代
- Fedora13装nividia驱动
- html 消息滚动,以HTML实现消息滚动
- java咖啡是研磨的吗_咖啡的研磨程度,真的很重要吗?
- Linux系统搭建gitit wiki
- 十进制12345在32位计算机中的十六进制表示方法
- python turtle绘制圣诞树,就一棵破松树
- 5G商用元年车联网鏖战升级 谁能掌握最后的话语权?
- 华为云与计算机,华为云电脑和达龙云电脑
- illustrator插件-常用功能开发-打开多页PDF-js脚本开发-AI插件