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