遗传算法(Genetic Algorithm,GA)实例详解

article/2025/11/6 23:35:15

遗传算法是模拟生物在自然环境中的遗传和进化的过程而形成的自适应全局优化搜索算法,他能有效求解NP问题以及非线性、多峰函数优化和多目标优化问题。


1.理论基础

1.1生物学基础

遗传算法的生物学基础是借鉴了达尔文的进化论和孟德尔的遗传学说,一个种群通过不断地繁衍和淘汰,一方面父代不断把优秀的基因遗传给子代,另一方面差的子代会逐渐被环境所淘汰,最终子代逐渐增强得到进化。

1.2理论依据

遗传算法有效性的理论依据为模式定理和积木块假设。

1.2.1模式定理

在遗传算子选择、交叉和变异的作用下,具有低阶、短定义距、平均适应度高于群体平均适应度的模式在子代中将以指数级增长。

统计学的研究表明:在随机搜索中,要获得最优的可行解,则必须保证较优解的样本呈指数级增长,而模式定理保证了较优的模式的样本呈指数级增长,从而给出了遗传算法的理论基础。另外,由于遗传算法总能以一定的概率遍历到解空间的每一个部分,因此在选择算子的条件下总能得到问题的全局最优解。

1.2.2积木块假设

积木块定义:具有低阶、短定义距、高平均适应度的模式称作积木块。

积木块假设:个体的积木块通过选择、交叉、变异等遗传算子的作用,能够相互结合在一起,形成高阶、长距、高平均适应度的个体编码串。

2.基本概念

群体和个体

可行解集和可行解 

染色体和基因

可行解编码和可行解编码的分量

遗传编码

二进制编码、实数编码

适应度

目标函数映射成适应度函数、基于序的适应度函数

遗传操作

选择算子、交叉算子、变异算子

3.主要特点

以决策变量的编码作为运算对象;

直接以目标函数值作为搜索信息;

同时使用多个搜索点的搜索信息;

是一种基于概率的搜索技术;

具有自组织性、自适应和自学习等特性。 

4.算法流程

初始化参数

适应度计算

选择运算

交叉运算

变异运算

终止条件判断

5.实例展示

5.1问题描述

对于函数f(x) = x + 10 * sin(5x) + 7 * cos(4x),求x=[0, 10]处的最大值 

5.2代码实现

画图

x = 0:0.01:10;
y = x + 10 * sin(5 * x) + 7 * cos(4 * x);
plot(x,y,'-');
xlabel('x');
ylabel('f(x)');
title('f(x) = x + 10sin(5x) + 7cos(4x)');

结果

问题代码

初始化参数

%%%%%初始化参数
NP=50;
L=20;
G=100;
Pc=0.8;
Pm=0.1;
xs=10;
xx=0;
f=randi([0 1],NP,L);%randint不可用时,可用randi

 适应度计算

%%%%%循环算法
for k=1:G%%%%%计算每个个体的适应度for i=1:NPU=f(i,:);m=0;%第i个个体的二进制值for j=1:Lm=U(j)*2^(j-1)+m;endx(i)=xx+m*(xs-xx)/(2^L-1);FIT(i)=x(i) + 10 * sin(5 * x(i)) + 7 * cos(4 * x(i));endmaxfit=max(FIT);minfit=min(FIT);rr=find(FIT==maxfit);fbest=f(rr(1,1),:);xbest=x(rr(1,1));FIT=(FIT-minfit)./(maxfit-minfit);%归一化

 选择操作

    %%%%%选择sum_fit=sum(FIT);fitvalue=FIT./sum_fit;fitvalue=cumsum(fitvalue);ms=sort(rand(NP,1));fiti=1;newi=1;while newi <= NPif ms(newi) < fitvalue(fiti)nf(newi,:)=f(fiti,:);newi = newi + 1;elsefiti = fiti + 1;endend%选择出来的新种群存在重复的个体

 交叉操作

    %%%%%交叉for i=1:2:NPp=rand;if p < Pcq=randi([0 1],1,L);for j=1:Lif q(j)==1temp=nf(i+1,j);nf(i+1,j)=nf(i,j);nf(i,j)=temp;endendendend

 变异操作

    %%%%%变异for i=1:round(NP*Pm)h=randi(NP);for j=1:round(L*Pm)g=randi(L);nf(h,g)=~nf(h,g);endendf=nf;f(1,:)=fbest;trace(k)=maxfit;
end

作图

xbest;
figure;
plot(trace);
xlabel('迭代次数');
ylabel('目标函数值');
title('适应度进化曲线');

结果

xbest = 7.8584,trace(end) =  24.8549


http://chatgpt.dhexx.cn/article/LBaNHGjD.shtml

相关文章

遗传算法设计实例

1.遗传算法实例程序设计 随机初始化种群P(t){x1,x2…xn),计算P(t)中个体的适应值。其MATLAB程序的基本格式如下: Begin t0 初始化P(t) 计算P(t)的适应值; while (不满足停止准则)dobegintt1从P(t1)中选择P(t)重组P(t)计算P(t)的适应值 end例1 求函数 f(x) 9*sin(5x) cos(4x)…

遗传算法GA原理详解及实例应用 附Python代码

遗传算法GA 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型&#xff0c;是一种通过模拟自然进化过程搜索最优解的方法。 生物在自然界中的生存繁衍&#xff0c;显示了其对自然环境的优异的自适…

vue实现点击下载exe,运行报错shellexecuteex失败 代码2

页面效果 exe插件放在vue项目的public文件夹里&#xff0c;然后用a标签实现点击下载 <a href"/VideoWebPlugin.exe">下载插件</a> 成功下载后运行报错 解决方法&#xff1a;选择在文件夹中显示&#xff0c;右击属性&#xff0c;在兼容性设置里的以管理员…

VC++分别使用WinExec、CreateProcess、ShellExecute和ShellExecuteEx来启动程序(附源码)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)

API函数ShellExecute与ShellExecuteEx用法

ShellExecute: 1.函数功能:你可以给它任何文件的名字,它都能识别出来并打开它。2.函数原型: HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ); 3.参数说明:hwnd:用于指定父窗口句…

C/C++ 使用 API 函数 ShellExecuteEx 实现文件打印

本文章主要介绍使用ShellExecuteEx实现打印文件的功能。 函数原型&#xff1a;BOOL ShellExecuteExA(__inout SHELLEXECUTEINFOA *pExecInfo) 输入输出参数都是 SHELLEXECUTEINFO 结构体。 SHELLEXECUTEINFO定义&#xff1a; typedef struct _SHELLEXECUTEINFO { DWORD c…

Windows函数 ShellExecuteEx

点击进入视频教程 代码&#xff1a; #include<windows.h> #include<tchar.h> #pragma comment(lib, "Urlmon.lib") int WINAPI _tWinMain(HINSTANCE hinstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, int nShowCmd) {// 下载图片&#xff0c;并保…

UpdatePanel终于可以上传文件了!

我们要做的&#xff0c;只是在页面上添加一个控件而已。 不过&#xff0c;其实这只是个半成品&#xff0c;或者说是一个原型&#xff0c;但是很明显&#xff0c;我们做对了。:) 在实现上&#xff0c;我曾经在两个做法上斟酌了许久&#xff0c;第一种是继承ScriptManager&#x…

updatepanel 排版问题

使用 ASP.NET AJAX 開發人員&#xff0c;一定不會錯過 UpdatePanel 這個超級控制項&#xff0c;它可以讓輕易的讓原有設計的頁面很輕易的具有 AJAX 的效果。可是在設計階段使用 UpdatePanel 去排版常造成我們的困擾&#xff0c;放置在 UpdatePanel 中的控制項無法正確呈現實際的…

学习UpdatePanel控件-

原文可以显示图片&#xff08;转载&#xff1a;http://blog.csdn.net/ILOVEMSDN/archive/2007/11/11/1879343.aspx&#xff09; UpdatePanel控件的使用 2008-10-07 05:46 P.M. ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是…

UpdatePanel的用法

UpdatePanel控件也是Ajax里用得最多的控件之中的一个&#xff0c;UpdatePanel控件是用来局部更新网页上的内容&#xff0c;网页上要局部更新的内容必须放在UpdatePanel控件里&#xff0c;他必须和上一次说的ScriptManager控件一起使用。如今来看UpdatePanel的属性 UpdatePanel …

浅谈UpdatePanel

这是我以前刚学习asp.net ajax的时候总结的&#xff0c;如果有什么错误的地方&#xff0c;请大家指出&#xff0c;以便我能早日改正。 1. 作用&#xff1a; UpdatePanel控件用来控制页面的局部更新&#xff0c;这些更新依赖于ScriptManager的EnablePartialRendering属性&…

UpdatePanel 控件简介

UpdatePanel 控件简介 全部折叠全部展开 代码&#xff1a;全部 代码&#xff1a;多种 代码&#xff1a;Visual Basic 代码&#xff1a;C# 代码&#xff1a;Visual C 代码&#xff1a;F# 代码&#xff1a;JScript UpdatePanel 控件简介 在本教程中&#xff0c;您将使用两…

ScriptManager updatepanel

在项目开发中&#xff0c;遇到了一个ajax更新问题&#xff0c;母版上有个通知区域&#xff08;通知区域为ajax定时更新&#xff08;updatepanel&#xff09;&#xff09;&#xff0c;上面有需要显示的几列信息&#xff0c;如最新文章数&#xff0c;批阅数&#xff0c;FTP受信状…

使用 UpdatePanel

1 概述 ASP.NET UpdatePanel 控件能让你创建丰富的、以客户为中心的 Web 应用程序。使用 UpdatePanel 控件&#xff0c;可以刷新选择的页面部分而不是使用回发来刷新整个页面&#xff0c;这就像是执行了一个局部页面更新一样。包含一个 ScriptManager 和一个或多个 UpdatePanel…

UpdatePanel控件

ASP.NET UpdatePanel控件可用于生成功能丰富、以客户端为中心的Web应用程序。通过使用UpdatePanel控件&#xff0c;可以在回发期间刷新网页的选定部分而不是刷新整个网页。这称为执行部分页更新。包含一个ScriptManager控件和一个或多个UpdatePanel控件的ASP.NET网页&#xff0…

ASP.NET AJAX入门系列(4):使用UpdatePanel控件(一)

UpdatePanel可以用来创建丰富的局部更新Web应用程序&#xff0c;它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件&#xff0c;其强大之处在于不用编写任何客户端脚本&#xff0c;只要在一个页面上添加几个UpdatePanel控件和一个ScriptManager控件就可以自动实现局部更新。通…

UpdatePanel的用法及 UpdatePanel与JS冲突的解决方法

UpdatePanel的用法 ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是设置页面中异 步局部更新区域&#xff0c;它必须依赖于ScriptManager存在&#xff0c;因为ScriptManger控件提供了客户端脚本生成与管理UpdatePanel的功 能。…

Java定时器 @Scheduled注解的使用

1.定时器Scheduled简介 Scheduled注解可以用于做定时任务&#xff0c;再方法上加上Scheduled注解&#xff0c;可以将这个方法定义为一个任务发放&#xff0c;可以搭配cron表达式进行任务的控制。 开启定时任务时在类上加注解 EnableScheduling 2.cron表达式的用法 1.按顺序…

java定时器的实现_java定时器实现总结

前言&#xff1a;Java定时器目前主要有3种实现方式&#xff1a;JDK组件&#xff0c;Spring Task&#xff0c;Quartz框架。 1. JDK组件 (1) java.util.TimerTask MyTimerTask.java&#xff1a; public class MyTimerTask extendsTimerTask { Overridepublic voidrun() { System.…