一些学习成果的分享。

遗传算法、模拟退火算法、粒子群优化算法在电子战波形优化中的作用

基于智能优化算法解决多个干扰激励源的合成干扰波形优化问题,仿真目标为多参数的波形优化干扰。

代码如下:

SA_GA_PSO.m

clear;clc;%清除缓存
close all;

%%GA部分

NP=100; %种群规模
Dim=5; %维度
max_gen=800;  %最大迭代次数
pop_max=2*pi;   %位置边界
pop_min=0;
CR=0.6; %交叉概率 CorssRate
MR=0.05; %变异概率  MutationRate
fun_num=11; %测试函数中目标函数索引

%% 初始化种群
for i=1:NP
    pops(i,:)=(pop_max-pop_min).*rand(1,Dim)+pop_min;  %初始化种群
    Obj_fun(i,:)=fun(pops(i,:),fun_num);  %计算对应的目标函数值
end
Fitness=calculateFitness(Obj_fun); %计算适应性
[min_Obj_fun,index]=min(Obj_fun); %最小目标函数值及其索引
best_pop=pops(index,:);    %最佳位置
%% 更新阶段
for gen=1:max_gen
    
    %依据个体的适应性来更新选择概率
    Prob=Fitness/sum(Fitness);
    P=cumsum(Prob);    %P是累加概率
    
    %选择
    for i=1:NP
        r=rand;   % 轮盘赌选择
        j=find(r<=P,1,'first');
        pops(i,:)=pops(j,:);
    end
    %交叉
    for i=1:2:(NP-1)
        r=rand;
        if r<CR
            point=ceil(rand*Dim);%取出一个维度
            temp=pops(i,:);   %个体i与个体i+1的几个(point到Dim)维度位置的交换
            pops(i,point:Dim)=pops(i+1,point:Dim);
            pops(i+1,point:Dim)=temp(1,point:Dim);
        end
    end
    %变异
    for i=1:NP
        if(rand<MR)
            muPoint=ceil(rand*(Dim));
            pops(i,muPoint)= rand*(pop_max-pop_min)+ pop_min;
        end
        %计算更新后的个体的目标函数值
        Obj_fun(i,:)=fun(pops(i,:),fun_num); 
    end
    %更新适应性
    Fitness=calculateFitness(Obj_fun);
    %完成一代的更新
    for i=1:NP
        if Obj_fun(i)<min_Obj_fun
            best_pop=pops(i,:);
            min_Obj_fun=Obj_fun(i);
        end
    end
    %记录
    %pops
    record(gen,:)=[gen,min_Obj_fun];
    %disp(['Generation ' num2str(gen) '   Min Obj_fun= ' num2str(min_Obj_fun)]);
end

best_pop
min_Obj_fun
figure(1)
plot(record(:,1),record(:,2));
xlabel('迭代次数');
ylabel('效益函数值');
title('遗传算法收敛图');

%%画波形
t1 = 0:0.001:1;
f1 = [1 2 3 4 5];
ft = zeros(1,1001);
for j =1:length(best_pop)
    ft= ft+cos(2*pi*f1(j)*t1+best_pop(j));
end
figure(2)
plot(t1,ft,"b")
hold on



%%SA部分

T=10000; %初始化温度值
T_min=1e-18; %设置温度下界
alpha=0.98; %温度的下降率
k=100; %迭代次数(解空间的大小)
Dim=5;
fun_num=11;
times=0;

x=getx; %随机得到初始解
while(T>T_min)
    times=times+1;
    for j=1:k
        y=fun(x,fun_num);
        x_new=getx;
        y_new=fun(x_new,fun_num);%得到新解并求新的收益
        delta=y_new-y;
        if (delta<0)
            x=x_new;%+(2*rand-1);
            y_record(times)=y_new;
        else
            p=getp(delta,T);
            if(p>rand)
                x=x_new;%以概率p接受新解作为当前最优解
                y_record(times)=y_new;
            else
                y_record(times)=y;
            end
        end
    end
    T=T*alpha;
end
disp('最优解为:')
disp(x)
y
times

%xx=1:times;
figure(3)
plot(y_record);
axis([1 times 2 6]);
xlabel('迭代次数');
ylabel('效益函数值');
title('模拟退火算法收敛图');

%%画波形
t1 = 0:0.001:1;
f1 = [1 2 3 4 5];
ft = zeros(1,1001);
for j =1:length(x)
    ft= ft+cos(2*pi*f1(j)*t1+x(j));
end
figure(2)
plot(t1,ft,"g--");
hold on


%%PSO部分

Dim = 5;      %维度
index=11;      %测试函数索引
c1 = 1.4;
c2 = 1.4;
maxgen = 100;    %进化次数
sizepop = 100;   %种群规模
Vmax = 1;
Vmin = -1;
popmax = 5;
popmin = -5;
w=0.8;
record=zeros(1,maxgen);
%% 产生初始粒子和速度
for i = 1:sizepop
    % 随机产生一个种群
    pop(i,:) = (popmax-popmin)*rand(1,Dim)+popmin;    %初始种群
    V(i,:) = (Vmax-Vmin)*rand(1,Dim)+Vmin;       %初始化速度
    % 计算适应度
    fitness(i) = fun(pop(i,:),index);   %计算适应度
end
%% 个体极值和群体极值
[bestfitness bestindex] = min(fitness); %bestindex:全局最优粒子索引
gbest = pop(bestindex,:);   %全局最佳位置
pbest = pop;    %个体最佳
fitnesspbest = fitness;   %个体最佳适应度值
fitnessgbest = bestfitness;   %全局最佳适应度值
%% 迭代寻优
for i = 1:maxgen       %代数更迭
    for j = 1:sizepop  %遍历个体
        % 速度更新
        V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:));
        %速度边界处理
        V(j,find(V(j,:)>Vmax)) = Vmax;
        V(j,find(V(j,:)<Vmin)) = Vmin;
        
        % 种群更新
        pop(j,:) = pop(j,:) + V(j,:);
        %位置边界处理
        pop(j,find(pop(j,:)>popmax)) = popmax;
        pop(j,find(pop(j,:)<popmin)) = popmin;
        
        % 适应度值更新
        fitness(j) = fun(pop(j,:),index);
    end
    
    for j = 1:sizepop
        % 个体最优更新
        if fitness(j) < fitnesspbest(j)
            pbest(j,:) = pop(j,:);
            fitnesspbest(j) = fitness(j);
        end
        % 群体最优更新
        if fitness(j) < fitnessgbest
            gbest = pop(j,:);
            fitnessgbest = fitness(j);
        end
    end
    record(1,i)=fitnessgbest;
    %fprintf('%d      %f\n',i,fitnessgbest);  %输出结果
    
    % 收敛动图绘制存储
%     plot(pop(:,1),pop(:,2),'*b')
%     axis([popmin popmax popmin popmax])
%     pause(0.1)
%     x1=xlabel('x1');
%     x2=ylabel('x2');
%     title(['进化次数=' num2str(i)]);
%     drawnow;
%     frame = getframe(1);
%     im = frame2im(frame);
%     [A,map] = rgb2ind(im,256);
%     if i == 1
%         imwrite(A,map,'E:\测试图\标准PSO.gif','gif','LoopCount',Inf,'DelayTime',0.1);
%     else
%         imwrite(A,map,'E:\测试图\标准PSO.gif','gif','WriteMode','append','DelayTime',0.1);
%     end
end
gbest
fitnessgbest
%% 适应度值变化绘图
figure(4)
plot(record);
xlabel('迭代次数');
ylabel('效益函数值');
title('模拟退火算法收敛图');

%%画波形
t1 = 0:0.001:1;
f1 = [1 2 3 4 5];
ft = zeros(1,1001);
for j =1:length(gbest)
    ft= ft+cos(2*pi*f1(j)*t1+gbest(j));
end
figure(2)
plot(t1,ft,"r-.")
hold on

fun.m

function y=fun(x,index)
% x代表参数,index代表测试的函数的选择
% 该测试函数为通用测试函数,可以移植
% 目录
%  函数名            位置                   最优值
% 1.Sphere             0                       0
% 2.Camel             多个      
% 3.Rosenbrock
switch index
    case 1 %Sphere函数
        y=sum(x.^2);
    case 2 %Camel函数,Dim只能取2
        if length(x)>2
            error('x的维度超出了2');
        end
        xx=x(1);yy=x(2);y=(4-2.1*xx^2+xx^4/3)*xx^2+xx*yy+(-4+4*yy^2)*yy^2;
    case 3 %Rosenbrock函数
        y=0;
        for i=2:length(x)
            y=y+100*(x(i)-x(i-1)^2)^2+(x(i-1)-1)^2;
        end
    case 4 %Ackley函数
        a = 20; b = 0.2; c = 2*pi;
        s1 = 0; s2 = 0;
        for i=1:length(x)
            s1 = s1+x(i)^2;
            s2 = s2+cos(c*x(i));
        end
        y = -a*exp(-b*sqrt(1/length(x)*s1))-exp(1/length(x)*s2)+a+exp(1);
    case 5 %Rastrigin函数
        s = 0;
        for j = 1:length(x)
            s = s+(x(j)^2-10*cos(2*pi*x(j)));
        end
        y = 10*length(x)+s;
    case 6 %Griewank函数
        fr = 4000;
        s = 0;
        p = 1;
        for j = 1:length(x); s = s+x(j)^2; end
        for j = 1:length(x); p = p*cos(x(j)/sqrt(j)); end
        y = s/fr-p+1;
    case 7 %Shubert函数
        s1 = 0; 
        s2 = 0;
        for i = 1:5 
            s1 = s1+i*cos((i+1)*x(1)+i);
            s2 = s2+i*cos((i+1)*x(2)+i);
        end
        y = s1*s2;
    case 8 %beale函数
        y = (1.5-x(1)*(1-x(2)))^2+(2.25-x(1)*(1-x(2)^2))^2+(2.625-x(1)*(1-x(2)^3))^2;
    case 9 %Schwefel函数
        s = sum(-x.*sin(sqrt(abs(x))));
        y = 418.9829*length(x)+s;
    case 10 %Schaffer函数
        temp=x(1)^2+x(2)^2;
        y=0.5-(sin(sqrt(temp))^2-0.5)/(1+0.001*temp)^2;
    case 11 %干扰适应度函数
        t = 0:0.001:1;
        f = [1 2 3 4 5];
        radar=zeros(1,1001);
        for i = 1:length(x)
            radar = radar+cos(2*pi*f(i)*t+x(i));
        end
        radar_abs = abs(radar);
        y = max(radar_abs);
    otherwise
        disp('no such function, please choose another');
end

getx.m

function x=getx
    Dim=5;
    for i = 1:Dim
        x(i)=2*pi*rand;
    end
end

getp.m

function p=getp(c,t)
    p=exp(-c/t);
end

calculateFitness.m

function Fitness=calculateFitness(fObjV)

ind=find(fObjV>=0);   %如果目标函数值不为负
Fitness(ind)=1./(fObjV(ind)+1);

ind=find(fObjV<0);    %如果目标函数值为负
Fitness(ind)=1+abs(fObjV(ind));

仿真结果

GA算法收敛图

SA算法收敛图

粒子群优化算法收敛图(图中文字有误)

三种波形合成图

结果分析

用matlab对《认知电子战原理与技术》4.3.3节“自适应的干扰波形优化”进行了仿真,基本完成了复现。主要包括GA遗传算法、SA模拟退火算法、PSO粒子群优化算法三种,采用功率利用率作为适应度函数。得到的最佳相位分别为[3.5881 2.8670 2.9428 4.3782 0.7402]、[ 3.0420 4.6321 6.2296 3.6424 2.3906]、[0.6512 -0.7903 3.6211 0.0018 1.6819],函数收敛值分别为2.4630、 2.4012、2.3829。合成波形中,蓝线、绿线、红线分别代表GA,SA,PSO算法的波形。
可以看出遗传算法的迭代次数最短,但收敛值也最大,模拟退火算法和粒子群优化算法收敛需要的次数更高,但可以一定程度上找到全局最优解。

添加新评论