matlab+遗传算法+求最大值

article/2025/3/6 3:06:22

%matlab—https://www.codeleading.com/article/17724584338/
python—https://blog.csdn.net/ha_ha_ha233/article/details/91364937
例:计算下列函数的全局最大值
max f(x)=x+10sin5x+7cos4x
s.t. 0<=x<=9

分析与建模:
1.确定决策变量与约束条件
决策变量即为目标函数max f(x)=x+10sin5x+7cos4x
约束条件为s.t. 0<=x<=9

2.确定编码方法
公式如下:a=(max-min)/(2^b-1)
其中a为编码精度,b为二进制编码长度,本题中b=22

3.确定解码方法
x=max*(y/2^b)
其中y为b位长的二进制编码对应的十进制数

4.确定个体评价方法。
可选用每次迭代的最小值的绝对值加上目标函数

5.设置遗传算子

6.确定遗传算法的运行参数

%https://www.codeleading.com/article/17724584338/
function ga_main()
% 遗传算法
% GA main program% Edited by Tan % Revision: 1.1 
% n-- 种群规模% ger-- 迭代次数% pc--- 交叉概率% pm-- 变异概率
% v-- 初始种群(规模为n)% f-- 目标函数值% fit-- 适应度向量
% vx-- 最优适应度值向量% vmfit-- 平均适应度值向量
clear all;
close all;
clc;%清屏
tic;%计时器开始计时
n=20;ger=100;pc=0.65;pm=0.05;%初始化参数
%以上为经验值,可以更改。
% 生成初始种群
v=init_population(n,22); %得到初始种群,22串长,生成20*220-1矩阵
[N,L]=size(v);           %得到初始规模行,列
disp(sprintf('Number of generations:%d',ger)); % ger-- 迭代次数
disp(sprintf('Population size:%d',N));         %种群规模n
disp(sprintf('Crossover probability:%.3f',pc));%交叉pc
disp(sprintf('Mutation probability:%.3f',pm)); % pm-- 变异概率 %sprintf可以控制输出格式
% 待优化问题
xmin=0;xmax=18;  %变量X范围
f='x+10*sin(x.*5)+7*cos(x.*4)';
% 0.*(x>17.9)+2/55.9*(17.9-x).*exp(-(17.9-x).^2/55.9).*(x<=17.9)
% 计算适应度,并画出初始种群图形
x=decode(v(:,1:22),xmin,xmax);%22位二进制换成十进制,%冒号表示对所有行进行操作。
fit=eval(f);%eval转化成数值型的  %计算适应度
figure(1);%打开第一个窗口
fplot(f,[xmin,xmax]);%隐函数画图
grid on;hold on;
plot(x,fit,'k*');%作图
title('(a)染色体的初始位置');%标题
xlabel('x');ylabel('f(x)');%标记轴
% 迭代前的初始化
vmfit=[];%平均适应度
vx=[]; %最优适应度
it=1; % 迭代计数器
% 开始进化
while it<=ger %迭代次数 %100%Reproduction(Bi-classist Selection)vtemp=roulette(v,fit);%复制  %Crossover    v=crossover(vtemp,pc);%交叉 %MutationM=rand(N,L)<=pm;%这里的作用找到比0.05小的分量%M(1,:)=zeros(1,L);v=v-2.*(v.*M)+M;%两个0-1矩阵相乘后M是1的地方V就不变,再乘以2. %这里是点乘 %变异  %Results x=decode(v(:,1:22),xmin,xmax);%解码,求目标函数值fit=eval(f);        %计算数值[sol,indb]=max(fit);% 每次迭代中最优目标函数值,包括位置v(1,:)=v(indb,:);   %用最大值代替fit_mean=mean(fit); % 每次迭代中目标函数值的平均值。mean求均值vx=[vx sol];        %最优适应度值vmfit=[vmfit fit_mean];%适应度均值it=it+1;            %迭代次数计数器增加
end
%%%% 最后结果
disp(sprintf('\n'));  %空一行% 显示最优解及最优值
disp(sprintf('Maximum found[x,f(x)]:[%.4f,%.4f]',x(indb),sol));
% 图形显示最优结果
figure(2);
fplot(f,[xmin,xmax]);
grid on;hold on;
plot(x,fit,'r*');
title('染色体的最终位置');
xlabel('x');ylabel('f(x)');
% 图形显示最优及平均函数值变化趋势
figure(3);
plot(vx);
%title('最优,平均函数值变化趋势');
xlabel('Generations');ylabel('f(x)');hold on;
plot(vmfit,'r');hold off;
runtime=toc%记时结束
end
%%
%Decodify bitstrings
function x=decode(v,xymin,xymax)
% x    ----real value(precision:6)
% v    ----binary string(length:22)
v=fliplr(v); %实现左右翻转颠倒
[s,c]=size(v); %c代表串长。求行,列
aux=0:1:c-1;   %21维向量
aux=ones(s,1)*aux;%权值向量矩阵
x1=sum((v.*2.^aux)');%权值   %注意转置   %sum是求列和
x=xymin+(xymax-xymin)*x1./(2^c-1);    %最大值4194303;
end
%%
%Crossover
function v=crossover(vtemp,pc)
[N,L]=size(vtemp);
C(:,1)=rand(N,1)<=pc;%选择被杂交的。<=pc就是1否则是0构成0-1向量
I=find(C(:,1)==1);%找分量等于1的元素,其下标构成向量。
I';%变成行向量
j=1;
for i=1:2:size(I)%两两配对所以以2为步长if i>=size(I)%奇数个处理break;endsite=fix(1+L*rand(1));%fix向零取整,L=22.%site属于1-22.temp=vtemp(I(i,1),:);%交换的暂存变量。Tvtemp(I(i,1),site:end)=vtemp(I(i+1,1),site:end);%交换后面的数值vtemp(I(i+1,1),site:end)=temp(:,site:end);%交换
end
v=vtemp;%复制返回
end        
%%
%Function init_population
function v=init_population(n1,s1)
v=round(rand(n1,s1));%rand产生随机数,%round四舍五入取整
end
%%
function vtemp=roulette(v,fit)
N=size(v);  %N向量
fitmin=abs(min(fit));%最小值和绝对值
fit=fitmin+fit; %最小值加上步长,保证fit>=0.
%fit
S=sum(fit);%求向量的和
for i=1:NSI=S*rand(1);%rand随机数。0-s之间的一个随机数for j=1:Nif SI<=sum(fit(1:j))  %累加列值vtemp(i,:)=v(j,:);%选中此样本breakendend
end
end

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


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

相关文章

【重新定义matlab强大系列八】利用matlab求局部值(函数islocalmax求局部最大值+函数islocalmin求局部最小值)

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

matlab求函数在区间内最大值与最小值

matlab求函数在区间内最大值与最小值 我用了fminbnd这个函数使用方法如下 详细信息官方文档 方法一 fun sin; x1 0; x2 2*pi; x fminbnd(fun,x1,x2) 结果 x 4.7124 %返回的是当极小值点 方法二 求 sin(x) 的最小值的位置以及在 0<x<2π 区间内的最小值。 fun sin;…

5.1matlab数据统计分析(最大值、最小值、平均值、中值、和、积、累加和、累加积、标准差、相关系数、排序)

1、求最大元素和最小元素 max():求向量或矩阵的最大元素。 min( ):求向量或矩阵的最小元素。 &#xff08;1&#xff09;当参数为向量时&#xff0c;函数有两种调用格式: ①ymax(X):返回向量X的最大值存入y&#xff0c;如果X中包含复数元素&#xff0c;则按模取最大值。 ②[y…

MATLAB 求一个矩阵的最大值极其所在位置

已知矩阵a ; max(): max(a)求矩阵每一列的最大值&#xff1b; find(): find (a Elem)查找Elem在矩阵中a中的行数和列数 eg&#xff1a; 矩阵a [4,5,6,9,4;8,5,21,2,65;36,78,59,3,5;7,8,9,6,5] 4✖5 查找出最大值是78&#xff1b; 用find函数找到最大值的位置 总代码 >…

Matlab之min()、max()函数(求最小、最大值)

以下以min()函数为例&#xff0c;max()函数同理 求矩阵A的最小值的函数有3种调用格式&#xff0c;分别是&#xff1a; (1) min(A)&#xff1a;返回一个行向量&#xff0c;向量的第i个元素是矩阵A的第i列上的最小值。 (2) [X,Y]min(A)&#xff1a;返回行向量X和Y&#xff0c;X向…

Matlab求解数组中的最大值以及它所在的位置

在使用Matlab肯定会碰到Matlab求解数组中的最大值以及它所在的位置的问题。博主开始用循环的方法找&#xff0c;既浪费时间又消耗资源&#xff0c;后面查找后才发现有简单快速的方法。下面就简单介绍一下这种方法。 1、电脑环境 电脑环境&#xff1a;Windows 10 教育版 MATL…

通过举例彻底搞懂Matlab中max函数和min函数的用法(求最大值和最小值)

今天做Matlab作业要求让找出最大值和最小值&#xff0c;查了一些资料&#xff0c;进行总结一下&#xff0c;话不多说&#xff0c;直接进入主题。max和min函数主要有以下几种用法。 max&#xff08;A&#xff09;&#xff1a; 如果A是一个行向量&#xff0c;即1 x M维的向量&a…

MATLAB-最大值与最小值

在MATLAB中&#xff0c;用于计算最大值的函数是max函数&#xff0c;用于计算最小值的函数是min函数&#xff0c;其调用格式如下。 Bmax(A) %计算最大值 &#xff0c;若A为向量&#xff0c;则计算并返回向量中的最大值;若A为矩阵&#xff0c;则计算并返回 %一个含有各列最大值的…

解决文件不显示后缀名的问题

工具 》 文件夹选项 》去掉隐藏已知文件类型的扩展名 前面的钩

电脑如何显示文件后缀名

原因 电脑为了大多数用户着想&#xff0c;自动隐藏了文件后缀名&#xff0c;但是对于“码农”却并不友好。在某些时候&#xff0c;直接更改文件后缀名反而更加方便。因此我们需要将电脑隐藏的文件后缀名显示出来。 步骤 点开我的电脑&#xff0c;点击左上角“文件”&#xf…

Windows10文件后缀名不显示·解决方法

Windows10文件后缀名不显示解决方法 第一步&#xff1a;WindowsE组合键&#xff08;即打开此电脑&#xff09;第二步:勾选文件扩展名 第一步&#xff1a;WindowsE组合键&#xff08;即打开此电脑&#xff09; WindowsE组合键&#xff08;即打开此电脑&#xff09;&#xff0c…

Windows显示文件名后缀的方法

文章目录 前言解决方法总结 前言 最近天天配环境&#xff0c;所以很多小细节和小问题层出不穷&#xff0c;虽然最后都百度解决了&#xff0c;但是肯定过后不久都会忘记&#xff0c;所以干脆自己记记&#xff0c;方便自己回头看看。 今天的问题可以说是win7的或者之前版本的一个…

解决IDEA不识别Java文件:文件变橙色显示后缀名.java

打开idea项目后部分目录下出现橙色的时钟标志&#xff08;如下&#xff09;&#xff1a; 可以看到所有的java文件都显示了后缀名.java&#xff0c;文件的图标都变成了橙色的 原因&#xff1a; 项目根目录出现问题。 解决方案&#xff1a; 打开项目结构&#xff0c;选择Modu…

电脑文件的后缀名不见了,如何显示隐藏扩展名?

第一步&#xff1a;左键双击电脑的计算机。 第二步&#xff1a;找到电脑左上角的文件&#xff0c;右移&#xff0c;进入查看选项界面 第三步&#xff1a;常规右边查看&#xff0c;找到隐藏扩展名&#xff0c;取消勾选确定保存则展示。

windows中显示文件后缀名

1、打开资源管理器。 2、菜单“工具”&#xff0c;“文件夹选项”。 3、查看tab中&#xff0c;去掉勾选“”隐藏已知文件类型的扩展名。“”

计算机win7的后缀名怎么显示,win7显示文件后缀名怎么显示?win7显示文件后缀

很多用户电脑重装系统之后&#xff0c;都出现一个相同的问题&#xff0c;常用文件没有后缀名。虽然这不影响我们文件的使用&#xff0c;但是出于习惯会看起来比较别扭。那么&#xff0c;有什么方法可以设置呢?win7显示文件后缀名怎么显示?下面&#xff0c;我们就一起来看看wi…

怎么显示隐藏的文件类型的后缀名

很多电脑默认的时候,是隐藏了文件的后缀名,有时候往往给我们带来一些不必要的烦恼,比如txt文件和word文件的相互转换,ppt excel格式的转换等,今天来分享一下怎么显示隐藏的文件类型的后缀名 主要的 三步 : 第一步首先双击我的“计算机”, 第二步点击左上方的组织,选…

电脑文件怎么显示后缀名

1、首先打开此电脑—找到查看–点击文件扩展名

怎么显示文件后缀名?查看文件后缀名可以这样做!

案例&#xff1a;在我的电脑上&#xff0c;看不到文件的后缀名&#xff0c;这会导致命名时出现重复文件后缀的情况&#xff0c;给我带来了不好的体验。怎么才能看到文件的后缀名呢&#xff1f;如何操作&#xff1f; 在日常使用电脑的过程中&#xff0c;我们经常需要查看文件的…

如何开启显示文件后缀名(扩展名)

一、进入计算机的存储目录&#xff0c;如下&#xff08;在桌面双击我的电脑图标可进入&#xff09; 2、找到左上角的查看按钮&#xff0c;然后勾选文件扩展名 3、返回待查看的文件处就可以看到文件后缀名