首页 > 编程语言 >MATLAB----遗传算法及Simulink延时模块实例

MATLAB----遗传算法及Simulink延时模块实例

时间:2024-03-08 16:14:29浏览次数:28  
标签:采样 Delay Simulink index ---- individuals MATLAB 模块 chrom

clc
tic
%%参数初始化
maxgen=100; %进化代数,即迭代次数,初始预定值选为100
sizepop=200; %种群规模,初始预定值选为100
pcross=0.9; %交叉概率选择,0和1之间,一般取0.9
pmutation=0.01; %变异概率选择,0和1之间,一般取0.01
individuals=struct('fitness',zeros(1,sizepop),'chrom',[]);
%种群,种群由sizepop条染色体(chrom)及每条染色体的适应度(fitness)组成
avgfitness=[];
%记录每一代种群的平均适应度,首先赋给一个空数组
bestfitness=[];
%记录每一代种群的最佳适应度,首先赋给一个空数组
bestchrom=[];
%记录适应度最好的染色体,首先赋给一个空数组
%初始化种群
for i=1:sizepop
%随机产生一个种群
individuals.chrom(i,:)=4000*rand(1,12);
%把12个0~4000的随机数赋给种群中的一条染色体,代表K=4个聚类中心
x=individuals.chrom(i,:);
%计算每条染色体的适应度
individuals.fitness(i)=fitness(x);
end
%%找最好的染色体
[bestfitness bestindex]=max(individuals.fitness);
%找出适应度最大的染色体,并记录其适应度的值(bestfitness)和染色体所在的位置(bestindex)
bestchrom=individuals.chrom(bestindex,:);
%把最好的染色体赋给变量bestchrom
avgfitness=sum(individuals.fitness)/sizepop;
%计算群体中染色体的平均适应度

trace=[avgfitness bestfitness];
%记录每一代进化中最好的适应度和平均适应度

for i=1:maxgen
i
%输出进化代数
individuals=Select(individuals,sizepop);
avgfitness=sum(individuals.fitness)/sizepop;
%对种群进行选择操作,并计算出种群的平均适应度
individuals.chrom=Cross(pcross,individuals.chrom,sizepop);
%对种群中的染色体进行交叉操作
individuals.chrom=Mutation(pmutation,individuals.chrom,sizepop);
%对种群中的染色体进行变异操作
for j=1:sizepop
x=individuals.chrom(j,:);%解码
[individuals.fitness(j)]=fitness(x);
end
%计算进化种群中每条染色体的适应度
[newbestfitness,newbestindex]=max(individuals.fitness);
[worestfitness,worestindex]=min(individuals.fitness);
%找到最小和最大适应度的染色体及它们在种群中的位置
if bestfitness<newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
%代替上一次进化中最好的染色体
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
%淘汰适应度最差的个体
avgfitness=sum(individuals.fitness)/sizepop;
trace=[trace;avgfitness bestfitness];
%记录每一代进化中最好的适应度和平均适应度
end
figure(1)
plot(trace(:,1),'-*r');
title('适应度函数曲线(100*100)')
hold on
plot(trace(:,2),'-ob');
legend('平均适应度曲线','最佳适应度曲线','location','southeast')
%%画出适应度变化曲线
clc
%%画出聚类点
data1=load('aa.txt');
%待分类的数据
kernal=[bestchrom(1:3);bestchrom(4:6);bestchrom(7:9);bestchrom(10:12)];
%解码出最佳聚类中心
[n,m]=size(data1);
%求出待聚类数据的行数和列数
index=cell(4,1);
%用来保存聚类类别
dist=0;
%用来计算准则函数
for i=1:n
dis(1)=norm(kernal(1,:)-data1(i,:));
dis(2)=norm(kernal(2,:)-data1(i,:));
dis(3)=norm(kernal(3,:)-data1(i,:));
dis(4)=norm(kernal(4,:)-data1(i,:));
%计算出待聚类数据中的一点到各个聚类中心的距离
[value,index1]=min(dis);
%找出最短距离和其聚类中心的种类
cid(i)=index1;
%用来记录数据被划分到的类别
index{index1,1}=[index{index1,1} i];
dist=dist+value;
%计算准则函数
end
cid;
dist;
%%作图
figure(2)
plot3(bestchrom(1),bestchrom(2),bestchrom(3),'ro');
title('result100*100') 
hold on
%画出第一类的聚类中心
index1=index{1,1};
for i=1:length(index1)
plot3(data1(index1(i),1),data1(index1(i),2),data1(index1(i),3),'r*')
hold on
end
hold on
%画出被划分到第一类中的各点
index1=index{2,1};
plot3(bestchrom(4),bestchrom(5),bestchrom(6),'bo');
hold on
%画出第二类的聚类中心
for i=1:length(index1)
plot3(data1(index1(i),1),data1(index1(i),2),data1(index1(i),3),'b*');
grid on;
hold on
end
%画出被划分到第二类中的各点
index1=index{3,1};
plot3(bestchrom(7),bestchrom(8),bestchrom(9),'go');
hold on
%画出第三类的聚类中心
for i=1:length(index1)
plot3(data1(index1(i),1),data1(index1(i),2),data1(index1(i),3),'g*');
hold on
end
%画出被划分到第三类中的各点
index1=index{4,1};
plot3(bestchrom(10),bestchrom(11),bestchrom(12),'ko');
hold on
%画出第四类的聚类中心
for i=1:length(index1)
plot3(data1(index1(i),1),data1(index1(i),2),data1(index1(i),3),'k*');
hold on
end
%画出被划分到第四类中的各点
toc

function ret=Select(individuals,sizepop)
% 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异
% individuals input  : 种群信息
% sizepop     input  : 种群规模
% ret         output : 经过选择后的种群

 

sumfitness=sum(individuals.fitness);
sumf=(individuals.fitness)./sumfitness;
index=[];

for i=1:sizepop   %转sizepop次轮盘
    pick=rand;
    while pick==0    
        pick=rand;        
    end
    for i=1:sizepop    
        pick=pick-sumf(i);        
        if pick<0        
            index=[index i];            
            break;  
        end
    end
end
individuals.chrom=individuals.chrom(index,:);
individuals.fitness=individuals.fitness(index);
ret=individuals;


function ret=Mutation(pmutation,chrom,sizepop)
% 本函数完成变异操作
% pcorss                input  : 变异概率
% lenchrom              input  : 染色体长度
% chrom                 input  : 染色体群
% sizepop               input  : 种群规模
% bound                 input  : 每个个体的上届和下届
% ret                   output : 变异后的染色体

for i=1:sizepop
    
    % 变异概率决定该轮循环是否进行变异
    pick=rand;
    if pick>pmutation
        continue;
    end
    
    pick=rand;
    while pick==0
        pick=rand;
    end
    index=ceil(pick*sizepop);    
    
    % 变异位置
    pick=rand;
    while pick==0
        pick=rand;
    end
    pos=ceil(pick*3); 
    
    chrom(index,pos)=rand*4000;    
end
ret=chrom;```

```c
function fit=fitness(x)
%% 计算个体适应度值
%x    input   个体
%fit  output  适应度值

data=[2232.43    3077.87    1298.87
1580.1    1752.07    2463.04
1962.4    1594.97    1835.95
1495.18    1957.44    3498.02
1125.17    1594.39    2937.73
24.22    3447.31    2145.01
1269.07    1910.72    2701.97
1802.07    1725.81    1966.35
1817.36    1927.4    2328.79
1860.45    1782.88    1875.13
1237.91    2055.13    3405.09
688.94    2104.72    3198.51
1675.65    1747.23    1580.39
1806.02    1810.19    2191.12
74.56    3288.02    2433.87
307.35    3363.84    2021.61
1988.27    1657.51    2069.2
2173.92    2608.55    1803.57
372.16    3077.44    2163.46
576.6    2140.98    3320
1724.13    1704.49    1798.75
2501.21    2652.65    984.56
1656.94    1913.34    2459.07
362.51    3150.03    2472
565.74    2284.97    3024.58
1978.06    1536.13    2375.64
1661.06    1552.4    2005.05
790.29    2419.98    3051.16
1557.27    1746.27    1879.13
2793.36    3009.26    1073.55
1766.08    1803.14    1895.18
1207.88    1600.62    3123.07
245.75    3373.67    2248.45
2785.36    3052.81    1035.65
315.42    3088.29    2187.12
1243.28    2451.72    3111.99
829.84    1555.91    3139.21
1347.07    2364.31    3096.88
1926.98    1507.34    1626.47
1808.57    1608.78    1565.95
1124.1    1840.98    2819.41
2661    3302.39    1710.32
1805.55    1899.09    2400.6
1130.18    1902.42    2753.7
1355.19    1566.16    2927.81
1651.14    1774.03    1725.56
2110.63    3308.04    702.06
2788.11    3395.23    1684.45
1807.61    1680.56    2356.65
1363.58    1729.44    2749.55
1992.42    1526.9    1581.42];

kernel=[x(1:3);x(4:6);x(7:9);x(10:12)];
fit1=0;
[n,m]=size(data);
for i=1:n

    dist1=norm(data(i,1:3)-kernel(1,:)); 
     dist2=norm(data(i,1:3)-kernel(2,:));  
      dist3=norm(data(i,1:3)-kernel(3,:));  
       dist4=norm(data(i,1:3)-kernel(4,:));  

    a=[dist1 dist2 dist3 dist4];
    mindist=min(a);
    fit1=mindist+fit1;
end
fit=1/fit1;



function ret=Cross(pcross,chrom,sizepop)
%本函数完成交叉操作
% pcorss                input  : 交叉概率
% lenchrom              input  : 染色体的长度
% chrom     input  : 染色体群
% sizepop               input  : 种群规模
% ret                   output : 交叉后的染色体
for i=1:sizepop
    
    % 交叉概率决定是否进行交叉
    pick=rand;
    while pick==0
        pick=rand;
    end
    if pick>pcross
        continue;
    end
    
    % 随机选择交叉个体
    index=ceil(rand(1,2).*sizepop);
    while (index(1)==index(2)) | index(1)*index(2)==0
        index=ceil(rand(1,2).*sizepop);
    end
    
    % 随机选择交叉位置
    pos=ceil(rand*3);
    while pos==0
        pos=ceil(rand*3);
    end
    
    temp=chrom(index(1),pos);
    chrom(index(1),pos)=chrom(index(2),pos);
    chrom(index(2),pos)=temp;
 
end
ret=chrom;```

```csharp
aa.txt:
1739.94    1675.15    2395.96
373.3    3087.05    2429.47
1756.77    1652    1514.98
864.45    1647.31    2665.9
222.85    3059.54    2002.33
877.88    2031.66    3071.18
1803.58    1583.12    2163.05
2352.12    2557.04    1411.53
401.3    3259.94    2150.98
363.34    3477.95    2462.86
1571.17    1731.04    1735.33
104.8    3389.83    2421.83
499.85    3305.75    2196.22
2297.28    3340.14    535.62
2092.62    3177.21    584.32
1418.79    1775.89    2772.9
1845.59    1918.81    2226.49
2205.36    3243.74    1202.69
2949.16    3244.44    662.42
1692.62    1867.5    2108.97
1680.67    1575.78    1725.1
2802.88    3017.11    1984.98
172.78    3084.49    2328.65
2063.54    3199.76    1257.21
1449.58    1641.58    3405.12
1651.52    1713.28    1570.38
341.59    3076.62    2438.63
291.02    3095.68    2088.95
237.63    3077.78    2251.96
1702.8    1639.79    2068.74
1877.93    1860.96    1975.3
867.81    2334.68    2535.1
1831.49    1713.11    1604.68
460.69    3274.77    2172.99
2374.98    3346.98    975.31
2271.89    3482.97    946.7
1783.64    1597.99    2261.31
198.83    3250.45    2445.08
1494.63    2072.59    2550.51
1597.03    1921.52    2126.76
1598.93    1921.08    1623.33
1243.13    1814.07    3441.07
2336.31    2640.26    1599.63
354    3300.12    2373.61
2144.47    2501.62    591.51
426.31    3105.29    2057.8
1507.13    1556.89    1954.51
343.07    3271.72    2036.94
2201.94    3196.22    935.53
2232.43    3077.87    1298.87
1580.1    1752.07    2463.04
1962.4    1594.97    1835.95
1495.18    1957.44    3498.02
1125.17    1594.39    2937.73
24.22    3447.31    2145.01
1269.07    1910.72    2701.97
1802.07    1725.81    1966.35
1817.36    1927.4    2328.79
1860.45    1782.88    1875.13


延时模块的输出信号与输入信号之间具有间接的关系,输出不直接反应输入的变化,而是延迟一个或多个采样时间再将输入信号输出到输出端口。对于当前采样时刻的输出,则是一个或几个采样时刻之前获取的输入。

1、Delay模块
   Commonly Used Blocks提供的延时模块是Delay,具有一个输入端口和一个输出端口,如下图所示:


Delay模块的输入信号为标量、向量或矩阵。双击Delay模块之后可以打开模块参数界面,

Delay的Main页面分为Data区域、Algorithm区域及采样时间。
Data区域中包括两个参数Delay length和Initial Condition,分别表示延时的采样点数和输出的初始值。模块的总延迟时间长度由Delay length的数值和模块采样时间的乘积决定。例如,延迟长度中填入3,采样时间中设置为0.6,Delay模块的输出将在1.8s时开始更新,在0~1.8s之间,delay模块的输出值由Initial Condtion中输入的初始值决定。此外,这两个模块都有一个Source下拉框,包括对话框和输入端口两个选项;对话框表示参数在对话框中输入;输入端口则表示模块增加一个输入端口,在模型中通过信号线传递数值来设定。延迟长度和初始条件二者均设为输入端口如图2所示。
输入端口d的输入此时由外部输入,同时可以在参数对话框的Upper limit内设定延时采样点数的上限。
Delay模块根据设定不同提供不同的输入端口数目,最少一个,最多4个。
算法区域有三个参数:External reset、Input processing 和Use Circle buffer for state
External reset:此参数选择None以外的选项时为Delay模块增加一个输入端口,通过此端口的输入信号达到某种条件而将Delay模块的输出值复位,所谓复位即Delay模块的状态值恢复为初始状态值。在仿真过程中,Delay的状态首先输出初始状态值,经过延迟长度的延时后更新为之前采样时刻的输入值,一旦接收到复位信号,状态值则恢复为初始状态值。复位动作是否执行取决于外部触发条件,可由External reset下拉框选择触发条件,包括None,Rising(上升沿),Falling(下降沿)、Either、Level和Level hold.Either表示上升沿和下降沿均进行复位。Level Hold表示当前采样时刻的值非零时即复位。Level则包含了Level hold的情况,另外还包括在信号从非零跳变到零采样点。
Input Processing:包括Elements as channels(sample based,基于采样)和Columns as channels(frame based,基于帧)及Inherited3个选项,基于采样和基于帧的采样方式区别在于采样数据的组织方式。
所谓基于采样(sample based),是指Simulink模块在每个采样时刻处理一个帧数据,每个帧数据包含了来自一个或多个独立的通道。例如t=0时刻采样一个32的矩阵,就需要6个不同的通道来解释数据。
所谓基于帧,Simulink模块在每个词阿阳时刻处理一个帧数据,每个帧数据包含了来自一个或多个独立通道的连续采样,每个通道包含一列输入数据。如对一个32的矩阵进行采样时,由于是两列数据,需要使用两个通道,每个通道采样连续3个数据元素作为一帧。
使用帧采样方式可以在同一时刻使用较少的通道处理多个数据元素,在一些通信算法及信号处理建模中有较突出的优势,可提高代买女性效率,降低模型仿真运行时间。
Inherited是继承输入信号的采样方式。选择基于采样方式时,输入信号时普通单线信号,选择基于帧方式时,输入信号显示为双线条信号。
Use circular buffer for state:勾选此选项时,将使用环境缓存存储仿真或代码生成时使用状态变量。当延迟长度值比较大时,勾选此选项有助于提高执行效率。线性缓存的数据拷贝次数随着缓存长度增长成正比例增长;环形缓冲,即使存储长度变长,拷贝操作的次数仍是常数。

Sample based采样信号,Delay length为1的情况
Frame based 采样信号,Delay length小于等于每帧的信号长度的情况
Delay模块的参数对话框第二个页面是State Attributes,设定一个合法标示符作为状态名称,表示Delay模块内部所存储的状态变量名,正是这个状态变量实现了输入到输出的延时效果。这个状态变量名结合Package的选择(Simulink包或mpt包)和Code generation storage class的选择,共同决定了Delay模块在生成代码时的形态。
Unit Delay模块
跟delay模块同样实现延时的模块还有Unit Delay模块,它不是Commonly Used Blocks里的模块,是Delay模块的一种特例,即只延时一个采样时间。其参数对话框相对简单,不需要设置延迟长度,不需要考虑缓存区使用环形或线性区域,没有复位功能,
下图所显示的模型为使用Delay模块实现的一个累加计数器,计数到10之后自动复位,复位之后重新计时,周而复始;
模型采用固定长度解算器,结算方法为离散方法,步长为0.5,仿真时间为10s。模型中Delay的初始值为0,采用rising复位方式,复位端口输入非零值时计数器复位。在无复位信号时每个采样时刻加1并将值缓存为内部状态值。复位信号由常数9与累加器的输出比较得到,当计数值大于9时,Rational模块实现大于的比较功能,上面的输入端口信号值大于下面的输入端口信号值,输出Boolean型数值1到Delay的复位端口使Delay模块状态值复位;为了避免产生代数环,UnitDelay模块需要连在Relational Operator和Delay模块中间进行延时,因为Delay模块的reset输入口是直接馈入的,整个闭环上没有延时单元则会造成代数环。复位将在加法器计算出10的下一个采样时刻进行。

 

标签:采样,Delay,Simulink,index,----,individuals,MATLAB,模块,chrom
From: https://www.cnblogs.com/kn-zheng/p/18061202

相关文章

  • macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载
    macOSVentura13.6.5(22G621)BootISO原版可引导镜像下载3月8日凌晨,macOSSonoma14.4发布,同时带来了macOSVentru13.6.5和macOSMonterey12.7.4安全更新。macOSVentura13.6及更新版本,如无特殊说明皆为安全更新,不再赘述。本站下载的macOS软件包,既可以拖拽到......
  • JavaScript 打包器esbuild的基础使用
    esbuild是一种类似于webpack的极速JavaScript打包器。esbuild项目主要目标是:开辟一个构建工具性能的新时代,创建一个易用的现代打包器。先安装esbuildnpmiesbuild-g-g代表全局范围检查esbuild的版本esbuild--version命令行构建esbuildsrc\app.jsx--bundle--outfi......
  • obs教程
    obs视频录制设置点击右下设置-》选择输出-》选择录像类型:选择标准录像格式:mp4视频编码器:x264(cpu编码,适用于cpu较强,且没有核显),QuickSyncH.264(cpu核显编码),NVIDIANVENCH.264(英伟达显卡编码),H264AMF(amd显卡编码)码率控制:cbr(恒定码率录制,录制视频选择,适用于固定宽带,恒定输......
  • macOS Monterey 12.7.4 (21H1123) 正式版发布,ISO、IPSW、PKG 下载 (安全更新)
    macOSMonterey12.7.4(21H1123)正式版发布,ISO、IPSW、PKG下载(安全更新)3月8日凌晨,macOSSonoma14.4发布,同时带来了macOSVentru13.6.5和macOSMonterey12.7.4安全更新。本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U......
  • MySQL(一):整体架构
    1、整体概述  MySQL是由连接池、管理工具和服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。1.1、ConnectionPool-连接池创建数据库连接是一个耗时的操作,连接池的作用就是将这些连接缓存下来,再次访问数据库时,可以直接用已经建立好的连接,提升服......
  • fink泛型参数问题和TypeHint TypeInformation Types区别
    TypeHint,TypeInformation,Types区别TypeInformation是flink的类型定义,TypeHint是描述用于描述泛型参数的辅助类,Types是一个封装了常用TypeInformation的工具类描述问题下面一段代码的有两个参数,第一个来自数据流元素,他的本质是入参。第二个是出参,效果和返回值类似第一个参......
  • macOS Monterey 12.7.4 (21H1123) Boot ISO 原版可引导镜像下载
    macOSMonterey12.7.4(21H1123)BootISO原版可引导镜像下载3月8日凌晨,macOSSonoma14.4发布,同时带来了macOSVentru13.6.5和macOSMonterey12.7.4安全更新。本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚......
  • 匈牙利算法--任务分配
    https://blog.csdn.net/ljjjjjjjjjjj/article/details/123261360例如有3个任务ABC,要分配给甲乙丙三人分别去完成,每个人完成3个任务所耗费精力不同(因为每个人特长不同),此处也叫完成任务耗费的代价,合理分配任务,可以达到总效率最高的目标。此时若想达到耗费总精力最小,可以用穷举法......
  • github 搭建个人导航网
    最近搭建了个个人的导航网,具体内容见下图,欢迎大家访问吖,点我访问 (首次访问较慢) 具体实现是使用vue3编写,白嫖github的page部署首先在github上创建一个仓库:name.github.io#name是你github的名字然后在本地创建一个vue3项目 然后把刚创建的仓库clone到......
  • Prettier缩进改制表符等于的空格数
    1.缩进改制表符等于的空格数修改为41.1问题VSCODE中Prettier插件中制表符'\t'默认的空格数为2,而我们一般空格数对应为4,这就导致我们很多时候看着不舒服,如何修改呢?1.2解决方法搜索,设置>Prettier:TabWidth,设置为4即可搜索,设置>Prettier:UseTab,勾选即可2.......