文章目录

  • 前言
  • 一、解决的函数
  • 二、遗传和变异算子
    • 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)简单例子相关推荐

  1. java实现死锁简单例子,Java死锁的简单例子

    Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁. 代码如下: Program.java /** * 程序类 * @author michael * */ public c ...

  2. go能否直接调用java_Go调用Java的一个简单例子

    由于Java世界里有非常丰富的开源应用模型和轮子,而这些正是Go世界里面最缺乏的东西,所以我首先考虑的就是如何在Go里面调用现有的Java代码.早上写了个简单的Go调用Java的例子,在winxp环境 ...

  3. java线程的简单例子(Thread and runnable)

    http://interper56-sohu-com.iteye.com/blog/172303 其实要了解java多线程只需要理解以下几个事情: 1) java.lang.Thraed类 2) ja ...

  4. java封装的简单例子_Java封装的简单例子

    先来个例子看看: public class Man { //对属性的封装,一个人的姓名,年龄,妻子都是这个对象(人)的私有属性 private String name; private int age ...

  5. java多态的简单例子_要JAVA的简单例子,继承\多态的,详细讲解运行的每一步

    java中的多态是动态绑定的,也就是说在编译期不能确定一个方法的执行体是哪个方法(在继承中重写的方法).执行果支委会根据在堆上分配的的引用去寻找方法体,所以产生你你所不想要的结果是正常的也是正确的.改 ...

  6. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

  7. GcExcel for java 6.0 简单例子 -jar has been cracked

    GrapeCity Documents for Excel (简称:GcExcel)是葡萄城推出的一款基于 Java 平台的服务端高性能表格组件,可与 纯前端表格控件 SpreadJS 前后端兼容,无 ...

  8. python遗传算法计算实例_遗传算法python简单例子(详解)

    # -*-coding:utf-8 -*- #目标求解sin(x)最大值 import random import math import matplotlib.pyplot as plt #初始化种 ...

  9. java hashtable import,Hashtable的一个简单例子

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下是关于Hashtable的简单例子,谁知道别的遍历Hashtable的方法,请回复! package no1; import java.util.En ...

最新文章

  1. 吴恩达《Machine Learning》Jupyter Notebook 版笔记发布!图解、公式、习题都有了
  2. 大咖开讲:一小时学会.NET MVC开发的那些事儿
  3. kmp2-HDU1358 HUST1010 POJ2406 POJ2752
  4. bootstrap 导航菜单 折叠位置_python测试开发django44.xadmin自定义菜单项
  5. python一个函数调用另一个函数的返回值_python-调用另一个函数后立即从函数返回...
  6. Odoo12中删除无效项目
  7. erlang 读取confg文件异常 could not start kernel pid error in config file
  8. zw版【转发·台湾nvp系列例程】HALCON MirrorRegion (Delphi)
  9. 隆重推荐:公民税权手册
  10. 战旗html5播放器为什么卡顿,视频站启用html5播放器
  11. Java1.8开始为什么用元空间替换永久代
  12. Fedora13装nividia驱动
  13. html 消息滚动,以HTML实现消息滚动
  14. java咖啡是研磨的吗_咖啡的研磨程度,真的很重要吗?
  15. Linux系统搭建gitit wiki
  16. 十进制12345在32位计算机中的十六进制表示方法
  17. python turtle绘制圣诞树,就一棵破松树
  18. 5G商用元年车联网鏖战升级 谁能掌握最后的话语权?
  19. 华为云与计算机,华为云电脑和达龙云电脑
  20. illustrator插件-常用功能开发-打开多页PDF-js脚本开发-AI插件

热门文章

  1. uniapp和小程序面试题一
  2. js 中数字小数点末尾的0显示与否
  3. 传智播客 安卓 视频 教程
  4. 第9周 指针练习:MyMax
  5. 三坐标检测之元素的测针半径补偿
  6. [Jenkins]Gauge测试UI+Jenkins流水线+Mattermost消息订阅(Jenkins篇)
  7. android之Fresco框架(一)--Fresco基本使用
  8. Vue中使用腾讯滑块验证码
  9. 多媒体系统的部署架构图
  10. shell脚本实现对网卡流量监控