遗传算法实例解析

article/2025/11/6 21:54:11

遗传算法实例及MATLAB程序解析

       遗传算法Genetic Algorithms,GA)是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目标的优化。遗传算法的实质是通过群体搜索技术,根据适者生存的原则逐代进化,最终得到最优解或准最优解。它必须做以下操作∶初始群体的产生、求每一个体的适应度、根据适者生存的原则选择优良个体、被选出的优良个体两两配对,通过随机交叉其染色体的基因并随机变异某些染色体的基因生 成下一代群体,按此方法使群体逐代进化,直到满足进化终止条件。其实现方法如下∶

(1)根据具体问题确定可行解域,确定一种编码方法,能用数值串或字符串表示可行解域的每一解。
(2)对每一解应有一个度量好坏的依据,它用一函数表示,叫做适应度函数,一般由目标函数构成。
(3)确定进化参数群体规模M、交叉概率 Pc、变异概率Pm、进化终止条件。为便于计算,一般来说,每一代群体的个体数目都取相等。群体规模越大,越容易找到最优解,但由于受到计算机的运算能力的限制,群体规模越大,计算所需要的时间也相应地增加。进化终止条件指的是当进化到什么时候结束,它可以设定到某一代进化结束,也可以根据找出近似最优解是否满足精度要求来确定。

实例解析

已知100个目标的经纬度信息如下(第一列为经度,第二例为纬度,以此类推):

  经度      纬度        经度      纬度      经度      纬度      经度      纬度
53.7121   15.3046	51.1758    0.0322	46.3253   28.2753	30.3313    6.9348
56.5432   21.4188	10.8198   16.2529	22.7891   23.1045	10.1584   12.4819
20.1050   15.4562	1.9451    0.2057	26.4951   22.1221	31.4847    8.9640
26.2418   18.1760	44.0356   13.5401	28.9836   25.9879	38.4722   20.1731
28.2694   29.0011	32.1910    5.8699	36.4863   29.7284	0.9718   28.1477
8.9586   24.6635	16.5618   23.6143	10.5597   15.1178	50.2111   10.2944
8.1519    9.5325	22.1075   18.5569	0.1215   18.8726	48.2077   16.8889
31.9499   17.6309	0.7732    0.4656	47.4134   23.7783	41.8671    3.5667
43.5474    3.9061	53.3524   26.7256	30.8165   13.4595	27.7133    5.0706
23.9222    7.6306	51.9612   22.8511	12.7938   15.7307	4.9568    8.3669
21.5051   24.0909	15.2548   27.2111	6.2070    5.1442	49.2430   16.7044
17.1168   20.0354	34.1688   22.7571	9.4402    3.9200	11.5812   14.5677
52.1181    0.4088	9.5559   11.4219	24.4509    6.5634	26.7213   28.5667
37.5848   16.8474	35.6619    9.9333	24.4654    3.1644	0.7775    6.9576
14.4703   13.6368	19.8660   15.1224	3.1616    4.2428	18.5245   14.3598
58.6849   27.1485	39.5168   16.9371	56.5089   13.7090	52.5211   15.7957
38.4300    8.4648	51.8181   23.0159	8.9983   23.6440	50.1156   23.7816
13.7909    1.9510	34.0574   23.3960	23.0624    8.4319	19.9857    5.7902
40.8801   14.2978	58.8289   14.5229	18.6635    6.7436	52.8423   27.2880
39.9494   29.5114	47.5099   24.0664	10.1121   27.2662	28.7812   27.6659
8.0831   27.6705	9.1556   14.1304	53.7989    0.2199	33.6490    0.3980
1.3496   16.8359	49.9816    6.0828	19.3635   17.6622	36.9545   23.0265
15.7320   19.5697	11.5118   17.3884	44.0398   16.2635	39.7139   28.4203
6.9909   23.1804	38.3392   19.9950	24.6543   19.6057	36.9980   24.3992
4.1591    3.1853	40.1400   20.3030	23.9876    9.4030	41.1084   27.7149

       我方有一个基地,经度和纬度为(70,40)。假设我方飞机的速度为1000km/h。我方派一架飞机从基地出发,侦察完所有目标,再返回原来的基地。在每一目标点的侦察时间不计,求该架飞机所花费的时间(假设我方飞机巡航时间可以充分长)。
        这是一个旅行商问题。给我方基地编号为1,目标依次编号为2,,…,101,最后我方基地再重复编号为102(这样便于程序中计算)。距离矩阵 D = ( d i j ) 102 × 102 D=(d_{ij})_{102\times102} D=(dij)102×102,其中 d i j d_{ij} dij表示i,j两点的距离,i、j=1,2,…,102,这里 D D D为实对称矩阵。则问题是求一个从点1出发,走遍所有中间点,到达点102的一个最短路径。
       上面问题中给定的是地理坐标(经度和纬度),必须求两点间的实际距离。设A,B两点的地理坐标分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_{1},y_{1}),(x_{2},y_{2}) x1y1x2y2过A,B两点的大圆的劣弧长即为两点的实际距离。以地心为坐标原点 O O O,以赤道平面为 X O Y XOY XOY平面,以0度经线圈所在的平面为 X O Z XOZ XOZ平面建立三维直角坐标系。则A,B两点的直角坐标分别为:

A ( R c o s x 1 c o s y 1 , R s i n x 1 c o s y 1 , R s i n y 1 ) , A(Rcosx_{1}cosy_{1},Rsinx_{1}cosy_{1},Rsiny_{1}), A(Rcosx1cosy1,Rsinx1cosy1,Rsiny1), B ( R c o s x 2 c o s y 2 , R s i n x 2 c o s y 2 , R s i n y 2 ) , B(Rcosx_{2}cosy_{2},Rsinx_{2}cosy_{2},Rsiny_{2}), B(Rcosx2cosy2,Rsinx2cosy2,Rsiny2),

式中∶R=6370为地球半径。

A,B两点的实际距离:
d = R a r c c o s ( O A ⋅ O B ∣ O A ∣ ⋅ ∣ O B ∣ ) , d=Rarccos(\frac{OA \cdot OB}{|OA| \cdot |OB|}), d=Rarccos(OAOBOAOB),

用MATLAB求解程序如下:

%遗传算法
clc,clear
sj0=load('sj.txt');       %加载100个目标的数据
x=sj0(:,1:2:8); x=x(:);   %取经度
y=sj0(:,2:2:8); y=y(:);   %取纬度
sj=[x y]; d1=[70,40];     %基地经纬度(70,40)
sj=[d1;sj;d1]; sj=sj*pi/180;  %单位化成弧度
d=zeros(102); %距离矩阵d的初始值 100个目标+两次经过起点for i=1:101    %计算相邻两点间距离,注意飞机飞行轨迹为弧for j=i+1:102d(i,j)=6370*acos(cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2))); end
endd=d+d';                    %d为一个实对称矩阵,表示两点间的双向距离
w=50; g=100;               %w为种群的个数,g为进化的代数
rand('state',sum(clock));  %初始化随机数发生器for k=1:w                  %通过改良圈算法选取初始种群c=randperm(100);       %产生1...100的一个随机排列  c1=[1,c+1,102];        %生成初始解for t=1:102            %该层循环是修改圈 flag=0;            %修改圈退出标志for m=1:100for n=m+2:101if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))+d(c1(n),c1(n+1))c1(m+1:n)=c1(n:-1:m+1);  flag=1; %修改圈endendendif flag==0J(k,c1)=1:102; break %记录下较好的解并退出当前层循环endend
endJ(:,1)=0; J=J/102;   %把整数序列转换成[0,1]区间上的实数,即转换成染色体编码
for k=1:g            %该层循环进行遗传算法的操作 A=J;             %交配产生子代B的初始染色体c=randperm(w);   %产生下面交叉操作的染色体对 for i=1:2:w  F=2+floor(100*rand(1));   %产生交叉操作的地址temp=A(c(i),[F:102]);     %中间变量的保存值A(c(i),[F:102])=A(c(i+1),[F:102]); %交叉操作A(c(i+1),F:102)=temp;  endby=[];                  %为了防止下面产生空地址,这里先初始化
while ~length(by)by=find(rand(1,w)<0.1); %产生变异操作的地址
end
B=A(by,:);                 %产生变异操作的初始染色体
for j=1:length(by)bw=sort(2+floor(100*rand(1,3)));  %产生变异操作的3个地址B(j,:)=B(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]); %交换位置
endG=[J;A;B];           %父代和子代种群合在一起[SG,ind1]=sort(G,2); %把染色体翻译成1...,102的序列ind1num=size(G,1); long=zeros(1,num); %路径长度的初始值for j=1:numfor i=1:101long(j)=long(j)+d(ind1(j,i),ind1(j,i+1)); %计算每条路径长度endend[slong,ind2]=sort(long); %对路径长度按照从小到大排序J=G(ind2(1:w),:);       %精选前w个较短的路径对应的染色体
end
path=ind1(ind2(1),:), flong=slong(1)  %解的路径及路径长度
xx=sj(path,1);yy=sj(path,2);
plot(xx,yy,'-V')                       %画出路径

运行结果如下:

path =1281    17     3    45    67     2    92    87    83    82    48    72    14    27    10    84    18    40    20    30    74    42    15     9     5    60    79    77295631    97    85    65    64    11    76    69    94    70    19    63    62    26    29    34    66    90    86     8    39    78    47    23    58    81    25    6857847    22    71    37    32    13    24    61    49    28    57    88    16    91    41     4    73    33    75    54    53    12    89     6    96    55    44    388510250    80    51    98   100    56    21    99   101    52    46    59    93    43    36    35    95   102flong =4.0096e+04

在这里插入图片描述注:这是我用Markdown写的第一篇文章,之中难免有所纰漏,还望指出.


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

相关文章

遗传算法详解及代码实现

遗传算法 定义相关术语交叉变异产生子代完整过程 遗传算法应用问题的提出与解决方案“袋鼠跳”问题爬山法&#xff08;最速上升爬山法&#xff09;模拟退火遗传算法 遗传算法实现过程遗传算法的一般步骤遗传算法图解进化细节种群和个体编码方法二进制编码浮点编码法符号编码法 …

遗传算法详解

转载&#xff1a;https://blog.csdn.net/u010451580/article/details/51178225 三&#xff1a;遗传算法 照例先给出科学定义&#xff1a; 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起…

遗传算法(Genetic Algorithm)详解与实现

遗传算法&#xff08;Genetic Algorithm&#xff09;详解与实现 遗传算法简介类比达尔文进化论达尔文进化理论遗传算法对应概念 遗传算法理论图式定理&#xff08;schema theorem&#xff09; 遗传算法与传统算法的差异遗传算法的优缺点优点局限性 遗传算法应用场景遗传算法的组…

经典遗传算法及MATLAB实例

经典遗传算法及简单实例&#xff08;MATLAB&#xff09; 1. 遗传算法简单介绍1.1 理论基础1.2 算法要点1.1 编码1.2 适应度函数 1.3 基本流程 2. 代码实例&#xff08;MATLAB&#xff09;2.1 代码汇总2.1 初始化种群2.2 计算适应度2.3 迭代终止判断2.4 自然选择&#xff08;轮盘…

遗传算法及实例

遗传算法是模拟生物在自然环境下遗传的过程而形成的自适应全局优化搜索算法。如果把某个问题的可行域看作是一个族群&#xff0c;目标函数看作是自然选择的条件&#xff0c;那么&#xff0c;这个族群通过一代又一代的繁衍和进化最终变成最接近筛选条件的样子。遗传算法就是利用…

遗传算法原理及算法实例

遗传算法原理解析 遗传算法&#xff08;GA&#xff09;是一种元启发式自然选择的过程&#xff0c;属于进化算法&#xff08;EA&#xff09;大类。遗传算法通常是利用生物启发算子&#xff0c;如变异、交叉和选择来生成高质量的优化和搜索问题的解决方案。 借鉴生物进化理论&…

遗传算法小结及算法实例(附Matlab代码)

目录 1、遗传算法流程 2、关键参数说明 &#xff08;1&#xff09;群体规模 \(NP\) &#xff08;2&#xff09;交叉概率 \(P_c\) &#xff08;3&#xff09;变异概率 \(P_m\) &#xff08;4&#xff09;进化代数 \(G\) 3、MATLAB仿真实例 3.1 遗传算法求解一元函数的极…

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

遗传算法是模拟生物在自然环境中的遗传和进化的过程而形成的自适应全局优化搜索算法&#xff0c;他能有效求解NP问题以及非线性、多峰函数优化和多目标优化问题。 1.理论基础 1.1生物学基础 遗传算法的生物学基础是借鉴了达尔文的进化论和孟德尔的遗传学说&#xff0c;一个种…

遗传算法设计实例

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属性&…