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

286 篇文章 32 订阅
236 篇文章 15 订阅

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

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,具有一个输入端口和一个输出端口,如下图所示:

图1
图2
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模块在每个词阿阳时刻处理一个帧数据,每个帧数据包含了来自一个或多个独立通道的连续采样,每个通道包含一列输入数据。如对一个3
2的矩阵进行采样时,由于是两列数据,需要使用两个通道,每个通道采样连续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的下一个采样时刻进行。
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值