简单遗传算法的小例子

简单遗传算法优化简单一元函数(python) 本文待优化函数选取自《MATLAB智能算法30个案例分析(第2版)》中的第一个案例利用遗传算法计算以下函数的最小值:f(x)=sin⁡(10πx)x,x∈[1,2]f(x) = \frac{\sin(10 \pi x)}{x},x\in[1,2]f(x)=xsin(10πx)​,x∈[1,2]关于遗传算法的原理,书籍和文章均比较多,这里就不再赘述,这里给出简单遗传算法的流程这里着重说明一下编码方式,本文算法采用二进制编码。假设某一参数的取值范围是 [Umin,Umax][U_{min},U_{max}][U 阅读详情

我对别人写的遗传算法java代码进行了一点修改。(大家可以在原文的文档中找到代码的出处)。它也实现了简单遗传算法的基本功能。这份代码的注释比较多。我认为这份代码条理较为清晰。请多多指教。这份代码主要取材自这两篇文章:主体来自于:http://www.cnblogs.com/macula7/archive/2009/04/04/1960673.html轮盘赌算法来自于:http://www.cnblogs.com/heaad/archive/2010/12/23/1914725.html这份代码的程序流程图如下:(这是简单遗传算法的框图)


/*A given function is as follows:
Use genetic algorithm to find a near-maximal value in f=xsin(10*pi*x)+2 
x的定义域为[-1,2]. 
In addition, the required precision is six places after the decimal point.
 */
import java.util.Random;

public class GA {
	public static final double A = -1;                 // 定义域下界
	public static final double B = 2;                  // 定义域上界
	public static Best best;                           // 记录最佳答案的对象
	public static final int POP_SIZE = 30;             // 种群大小(本题的种群由30个个体(即x)组成)
	public static String[] pop = new String[POP_SIZE];    // String型数组,存放种群中每个个体(即x)的编码
	public static double[] result = new double[POP_SIZE]; // double型数组,经过进化后的种群中的每个个体(即x)
	public static double[] fitness = new double[POP_SIZE];//double型,存放种群中每个个体(即x)的适应值
	public static final int LENGTH = 22; // x的编码长度,因为要精确到小数点后六位,所以十进制的整数部分(1位)与小数部分(6位)共有7位。这需要用22位的二进制数表示。
	public static final int conversionFactor = 4194303;//转换因子,22位二进制数所能表示最大的十进制数为2^22-1
	public static Random random = new Random();     // 用于产生随机数的工具
	public static final double PM = 0.05;           // 变异率
	public static double[] p = new double[POP_SIZE];// 轮盘赌方法个体适应度概率
	public static double[] q = new double[POP_SIZE];// q[i]是前n项p之和
	int k1,k2;	//被选出来杂交的两个个体	


	/*
	 * 构造方法,初始化种群
	 */
	public GA(double d[]) {
		for (int i = 0; i < d.length; i++) {
			result[i] = d[i];
		}
	}
	
	/*
	 * 适应度函数,在本例中,使函数值f(x)越大,x的适应值越高。
	 */
	public void fitness() {
		for (int i = 0; i < result.length; i++) {
			fitness[i] = result[i] * (Math.sin(10 * Math.PI * result[i])) + 2;
			// System.out.println(fitness[i]);
		}
	}
	
	/*
	 * 编码方法,将解值表示为二进制字节码形式
	 */
	public void encoding()
	{
		for (int i = 0; i < result.length; i++) {
			//放大result[i]以利于编码。
			//d1的值:(|result[i]与A点的距离|/(定义域的长度))*转换因子
			double d1 = ((result[i] - A) / (B - A)) * (conversionFactor);
			//将d1强制类型转换成int型,并将其转换成二进制的字符串,并放入pop数组中。
			pop[i] = Integer.toBinaryString((int) d1);
		}
		//依次检验pop数组的每一项,如果它的长度!=22,则在前面补“0”使其达到22位
		for (int i = 0; i < pop.length; i++) {
			if (pop[i].length() < LENGTH) {
				int k = LENGTH - pop[i].length();
				for (int j = 0; j < k; j++) {
					pop[i] = "0" + pop[i];
				}
			}
		}
	}
	
	/*
	 * 选择操作,依据轮盘赌算法从种群中选出两个个体进行杂交。
	 */
	public void selection()
	{
		int k1;
		int k2;
		do {
			k1 = roulettewheel();
			k2 = roulettewheel();
		} while (k1 != k2);
	}
	
	/*
	 * 轮盘赌算法,适应值大的个体被选中的机率更大些。
	 */
	int roulettewheel()
	{
	    double m = 0;
	    double r =random.nextDouble(); //r为0至1的随机数
	    int i = 0;
	    for(i=0;i<=LENGTH; i++)
	    {
	            /* 产生的随机数在m~m+P[i]间则认为选中了i
	             *  因此i被选中的概率是P[i]
	             */
	             m = m + fitness[i];
	             if(r<=m)
	            	 break;
	    }
	    return i;
	}
	
	/*
	 * 解码方法,将二进制字节码还原
	 */
	public void decoding() {
		for (int i = 0; i < pop.length; i++) {
			int k = Integer.parseInt(pop[i], 2);
			result[i] = A + k * (B - A) / (conversionFactor);
		}
	}

	/*
	 * 交叉操作
	 */
	public void crossover() {
		//随机产生是染色体发生交叉操作的位置
		int position = random.nextInt(LENGTH);
		//s1字符串被切成s11和s12,s2字符串被切成s21,s22
		String s11 = null, s12 = null, s21 = null, s22 = null;
		s11 = pop[k1].substring(0, position);
		s12 = pop[k1].substring(position, LENGTH);
		s21 = pop[k2].substring(0, position);
		s22 = pop[k2].substring(position, LENGTH);
		//重新拼接字符串,并放入种群
		pop[k1] = s11 + s22;
		pop[k2] = s21 + s12;
	}

	/*
	 * 变异操作,变异在染色体上的每个基因都可能发生
	 */
	public void mutation() {
		//第i个个体(即染色体)
		for (int i = 0; i < pop.length; i++) {
			//第i个个体第j号基因
			for (int j = 0; j < LENGTH; j++) {
				double k = random.nextDouble();
				//如果产生的随机数k小于变异率,则进行变异操作。
				if (PM > k) {
					mutation(i, j);
				}
			}
		}
	}
	//如果基因的位置是“1”则换为“0”。如果基因的位置是“0”则换为“1”。
	public void mutation(int i, int j) {
		String s = pop[i];
		StringBuffer sb = new StringBuffer(s);
		if (sb.charAt(j) == '0')
			sb.setCharAt(j, '1');
		else
			sb.setCharAt(j, '0');
		pop[i] = sb.toString();

	}
	
	/*
	 * 一次进化
	 */
	public void evolution() {
		fitness();          //计算适应度
		encoding();         //编码
		selection();        //选择
		crossover();        //交叉
		mutation();         //变异
		decoding();         //解码
	}

	/*
	 * 整个进化过程,n 表示进化多少代
	 */
	public void dispose(int n) {
		for (int i = 0; i < n; i++) {
			evolution();
		}
	}

	/*
	 * 取得结果
	 */
	public double findBestOne() {
		if (best == null)
			best = new Best();
		double max = 0;
		for (int i=0;i<fitness.length; i++) {
			if (fitness[i] > max) {
				max = fitness[i];
				best.fitness = max;
				best.x = result[i];
				best.str = pop[i];
			}
		}
		return max;
	}
	
	/*
	 * 保存最佳个体的对象
	 */
	class Best { 
		public int generations;
		public String str;
		public double fitness;
		public double x;
	}

	public static void main(String[] args) {
		// d为初始数据
		double d[] = { -0.953181, -0.851234, -0.749723, -0.645386, -0.551234,
				-0.451644, -0.351534, -0.239566, -0.151234, 0.145445, 0.245445,
				0.285174, 0.345445, 0.445445, 0.542445, 0.645445, 0.786445,
				0.845445, 0.923238, 1.245445, 1.383453, 1.454245, 1.584566,
				1.644345, 1.741545, 1.845445, 1.981254, -0.012853, 0.083413,
				1.801231 };
		// 初始化初始种群及其他数据
		GA ga = new GA(d);
		System.out.println("种群进化中....");
		// 进化,这里进化10000次
		ga.dispose(10000);
		ga.findBestOne();       //取得结果
		System.out.println("+++++++++++++++++++++++++++结果为:");
		System.out.println("x=" + best.x);
		System.out.println("f=" + best.fitness);
		//for(double i :result)
		//{
		//	System.out.println(i);
		//}
	}
}

【人工智能】遗传算法(GA)入门—以求解一元函数最大值的优化问题为例 前言遗传算法有很多优化和变形,本文将从最基本的遗传算法出发,以一个简单的优化问题作为例子来说明遗传算法的代码实现,比较适合已经学了相关理论知识的初学者进行实践学习。一、问题描述用GA求解一元函数的最大值:f(x) = x sin(10πx) + 2.0, x∈[-1,2] 二、编码变量x可以视为遗传算法的表现型形式,我们采用二进制编码形式。如果设定求解精度要精确到6位小数,由于区间长度为3,故将区间 阅读详情

相关推荐

遗传算法最简单的例子

众所周知,遗传算法主要框框如下: 网上各种版本都太高端了,我感到很困惑,所以我想写个傻瓜遗传算法 具体要求如下: 具体代码如下: import numpy as np def main(): """ f(x) = max{x1 + x2} x1 in range(1023) x2 in range(1023) """ # 定义变量,基因,组成染色体 # 把变量用二进制表示,每个变量用4位二进制表示 NUM_DNA = ...

三梦行者 3044

遗传算法学习

1.什么是遗传算法? 1.1.遗传算法的定义 遗传算法(Genetic Algorithm, GA)是受达尔文进化论的启示,模拟自然进化和遗传过程的计算模型。 遗传算法的主要特点是通过种群的遗传和变异,采用概率化的寻优方法,不需要有确定的规则就能自动获取和指导优化搜索空间,自适应的调整搜索方向。 1.2.遗传算法的相关术语 基因型(genotype):性状染色体的内部表现; 表现型(phenotype):染色体决定的性状的外部表现,或者说,根据基因型形成的个体的外部表现; 进化(evolut

qq_41252520的博客 1285

通过一个简单例子看懂遗传算法,附MATLAB代码

基本思想        遗传算法首先将问题解转换成一组编码,并通过对编码进行选择、遗传和交叉变异的操作来找到最优解。

WYuan的博客 8672

二进制遗传算法与MATLAB

二进制遗传算法与MATLAB (一)简单示例: 程序:x=-1:0.001:2; y=x.*sin(10*pi*x)+2; plot(x,y) (二)MATLAB的实现 1)主函数 dim=22;%维度 N=50;%50个 Pc=0.75; pm=0.03; Po=round(rand(N,dim));%随机产生N行dim列 for it=1:100 %%解码 for i=1:...

qq_43202087的博客 1477

matlab调用实现简单遗传算法例子

题目 最小化f(x),其满足g1,g2两个约束 对两个约束条件,设置不同的惩罚系数 采用matlab实现 1. 构造F(x)表达式 新建simple_fitness.m函数 matlab代码如下 function y = simple_fitness(x) f = (x(1)-2)*(x(1)-2) + (x(2)-1)*(x(2)-1); g1 = x(1) - 2*x(2) +1; g2 = -0.25*x(1)*x(1) - x(2)*x(2) + 1; %判断r1 if g1 ==

lllzzzhhh2589的记录 2333

每天学点算法->进化策略->遗传算法简单例子解读

假设草原上有一群斑马,这群斑马里面,有些斑马跑的比较快,有的跑的慢,而狮子每次捕猎能抓到跑的慢的斑马,那么经过一代代的繁衍,根据达尔文进化论,留下的大部分斑马都是跑的比较快的。进化策略也是基于这优胜略汰,适者生存的套路,通过模拟一个种群的进化过程,逐步优化参数,最终使得目标函数达到最优. 在这个例子中 目标函数:max=sin(10*x)*x + cos(2*x)*x ; x属于[0,5]...

Fitz_p的博客 890

c语言遗传算法求函数最大值,【人工智能】遗传算法(GA)入门—以求解一元函数最大值的优化问题为例...

前言遗传算法有很多优化和变形,本文将从最基本的遗传算法出发,以一个简单的优化问题作为例子来说明遗传算法的代码实现,比较适合已经学了相关理论知识的初学者进行实践学习。一、问题描述用GA求解一元函数的最大值:f(x) = x sin(10πx) + 2.0, x∈[-1,2]二、编码变量x可以视为遗传算法的表现型形式,我们采用二进制编码形式。如果设定求解精度要精确到6位小数,由于区间长度为3,故将区间...

weixin_32902659的博客 2022

遗传算法在游戏中的应用——y=x^2

通过上一篇文章的讲解,应该大概了解遗传算法的大概。这一篇我们来讲解简单遗传算法SGA中的一个例子:Y=x^2。通过这个例子,我们就可以清楚的知道,遗传算法是怎么操作的。 编译环境:VS2012,c++11 主函数: #include "stdafx.h" #include"math.h" #include"SGA.h" int _tmain(int argc, _TCHAR* argv[]

jin_syuct的专栏 2915

一个关于遗传算法优化的简单例子

在课程上学了一些关于遗传算法的思想的,想用这个思想来写一个简单的小例子。 先来说遗传算法的思想:遗传算法是模拟生物的遗传、变异、选择、进化来对问题的解进行优化,可以理解为将一组初始解看成是“基因”,在求解的开始设置一个过滤器,对“基因”进行筛选,通过如果目前生成的“基因”暂不满足上述条件,那么“基因”就要开始“变异”,在迭代过程中通过产生的随机数,对“基因”进行更改,达到“变异”的目的,也就是”...

weixin_30770495的博客 977

手把手教你解决CentOS sshd启动报错:从权限问题到目录缺失的全套解决方案

本文提供了一套完整的CentOS SSH服务启动故障排查与修复方案。针对sshd启动报错,从systemd日志分析、sshd -t配置测试入手,详细解决了私钥文件权限过宽(如0644错误)和权限分离目录缺失等典型问题,并附带了扩展排查清单,帮助运维人员系统性地定位和解决连接故障。

weixin_29248611的博客 152

C# ArcGIS Engine二次开发——实现“加载shp文件”

private void AddShpDataToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog OpFileDialog=new OpenFileDialog();//OpenFileDialog:打开文件对话框 OpFileDialog.Title="添加矢量数据"; OpFileDialog.Filter="(*.shp)|*.shp";//filter:过滤器;"(*.shp)|*.shp"

weixin_42191203的博客 5254

简单遗传算法,例子讲解

遗传算法的手工模拟计算示例 为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各     个主要执行步骤。         例:求下述二元函数的最大值:     (1) 个体编码            遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种        符号串。本题中,用无符号二进制整数来表示。      

旭峰的博客 1178

华为OD机试双机位C卷-水库溃坝填补(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【水库溃坝填补】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。水库溃坝填补。

qq_45776114的博客 2109

java遗传算法的简单列子_遗传算法入门例子和总结

目录:一.写在前面二.遗传算法概述三.一个简单问题描述四.C语言实现---------------------------------------------------------------------一.写在前面下面的列子是摘自《遗传算法原理与应用》一书,具体PDF下载:http://download.csdn.net/source/1615358我看了一遍,通俗易懂,很适合入门,有需要的朋...

weixin_42509766的博客 359

建模simulink - 手把手教你搭建xpc平台

概述xpc半实物仿真目标是个基于RTW对低端实时仿真和开发平台,可将计算机或者工控机转变为一个实时系统,不需要第三方操作系统对支持,在计算机上配置输入输入出设备就能和外部交换信息,进行硬件...

不只会拍照的程序猿 7087

python如何给声音增加回声效果

创建任何声音对象的回声效果。使用sndarray和numpy来创建原始声音的偏移和衰减副本。目前它只是使用硬编码的值来设置回声的数量和延迟。你可以根据自己的需要轻松地重新创建。这段注释说明了make_echo函数的用途和实现方式,即通过pygame的sndarray模块和numpy库来处理声音数据,生成具有回声效果的声音。函数中使用了固定的回声数量和延迟时间,但这些值可以根据用户的需求进行调整。

zhangzhechun的专栏 976

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 += indi

FenRir0的博客 3030

【人工智能】AI 智能体驾驭工程(Harness Engineering)全解析

OpenAI将Harness定义为让Agent能完成有用工作的系统工程,Harness Engineering则是持续设计、实现、迭代这套系统的方法论;Anthropic将其概括为「让模型真正成为可靠Agent的基础设施」;Martin Fowler/Thoughtworks则将其定义为「控制Agent各层循环的规格、质量检查与工作流指导体系」。强大的AI模型是一匹爆发力极强的烈马;Prompt Engineering是「对马喊话的技巧」,Context Engineering是「给马看的地图」;

奶爸的编程之路,也就一周冷个三天 5243

一个简单遗传算法的例子(C#)

为了给别人说明白遗传算法的程序而编写的一个小例子 转载请注明出处 Code usingSystem; usingSystem.Collections.Generic; usingSystem.Text; //writebyfeathersky //tocomputey=3*sin(x*x)+5*x;butwedon'tkn...

weixin_30773135的博客 734

解决Office 365 SMTP问题:C#邮件发送详解

本文介绍了如何在C#中使用Office 365 SMTP服务发送邮件。重点讲解了正确配置SMTP客户端的关键参数:必须使用587端口并启用TLS加密(EnableSsl=true),同时通过NetworkCredential进行身份验证。虽然SmtpClient已不推荐用于新项目,但本文提供的代码示例仍适用于临时项目或系统维护,并建议未来可考虑使用MailKit等现代邮件库。文章还包含了错误处理机制,确保程序健壮性。

2501_90323865的博客 141

100 道大数据开发技术原理与实战面试宝典(必过答案详细解析)I

在数字化浪潮席卷全球的今天,大数据开发工程师已成为企业数字化转型的核心力量。无论是互联网巨头的用户行为分析,还是金融机构的风险控制,亦或是智慧城市的数据中枢,都离不开大数据技术的支撑。然而,面对BAT等头部企业严格的面试要求,候选人不仅需要掌握扎实的理论基础,更需具备将技术落地的实战能力。本文基于历年高频面试题与企业真实场景需求,梳理100道必考题目,涵盖基础概念、框架原理、算法设计、性能优化等核心领域,助你构建完整的知识体系,从容应对面试挑战。

AI天才研究院 1385

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

# -*-coding:utf-8 -*- #目标求解sin(x)最大值 import random import math import matplotlib.pyplot as plt #初始化种群 生成chromosome_length大小的population_size个个体的种群 def species_origin(population_size,chromosome_length)...

weixin_39942451的博客 641

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

遗传算法求解TSP问题

文章目录遗传算法求解TSP问题问题描述遗传算法参数编码初始群体的设定适应度函数的设计遗传操作设计交叉变异选择控制参数设定完整代码 遗传算法求解TSP问题 问题描述 使用遗传算法求下图中从北京出发经过其他四个城市之后回到北京的最短路径,两个城市之间的距离如图所示: 遗传算法 遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码

melanchoe的博客 3772

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

遗传算法在游戏中的应用——概述

遗传算法,乍一听很高端,好像和生物学结合的很紧密,挺难得样子。其实,遗传算法只是借鉴了生物进化的一些思想和概念,然后将它用到我们软件开发中,在这里就是我们游戏开发中。 这一系列的博客,我打算分这么几篇和大家来分享遗传算法在游戏中的应用。首先,介绍一下什么是遗传算法和它的一些基本概念。然后和大家讲一讲一个遗传算法入门级别的例子:y=x^2的例子,让大家来熟悉一下遗传算法的一个操作流程。然后分享一下

jin_syuct的专栏 2122

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

常见算法思想——遗传算法

这篇文章介绍了常见算法思想——遗传算法。

qq_45902301的博客 689
上一篇: UITableView笔记
下一篇: iOS Delegate学习(送花ABC,一个悲伤的故事)
ilikeprograming
博客等级 码龄14年 46粉丝 18原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值