📄 ga_gaaa.asv
字号:
%遗传算法
% function [out]=GA1(in)
clear all;
close all;
tic
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 参数设置 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
M1 = 4;
M2 = 4;
M3 = 4; % 我方各载机所携带的武器数
total_W = M1+M2+M3; % 总的武器数12
total_T = 10; % 总的目标数10
% 迎击武器单一命中概率,行为目标,列为武器
PP = [0.10 0.05 0.36 0.73 0.21 0.70 0.02 0.85 0.90 0.10 0.08 0.50 ;
0.56 0.56 0.75 0.31 0.38 0.06 0.33 0.32 0.95 0.37 0.50 0.87;
0.80 0.25 0.21 0.67 0.40 0.20 0.12 0.50 0.45 0.60 0.30 0.60;
0.40 0.17 0.10 0.52 0.23 0.80 0.75 0.73 0.50 0.80 0.08 0.10;
0.32 0.20 0.43 0.26 0.45 0.15 0.62 0.85 0.95 0.01 0.90 0.70;
0.20 0.10 0.82 0.32 0.30 0.40 0.03 0.34 0.26 0.69 0.70 0.87;
0.96 0.58 0.75 0.80 0.01 0.63 0.27 0.10 0.72 0.23 0.01 0.07;
0.40 0.67 0.50 0.91 0.34 0.54 0.90 0.22 0.65 0.23 0.90 0.92;
0.03 0.42 0.15 0.32 0.40 0.30 0.74 0.58 0.85 0.90 0.30 0.55;
0.15 0.75 0.62 0.45 0.56 0.80 0.61 0.76 0.10 0.06 0.35 0.50];
% 目标对飞机的威胁评估因子,行为飞机,列为目标
TH = [0.20 0.40 0.62 0.35 0.40 0.20 0.2943 0.3466 0.2708 0.3320 ;
0.5390 0.4881 0.4521 0.3418 0.3829 0.4652 0.2562 0.3463 0.2935 0.2548 ;
0.5541 0.5402 0.4976 0.4765 0.4921 0.5654 0.3178 0.3735 0.3012 0.3030 ];
% 求每个目标对我机群的总威胁,即TH每列求和
TH_Z = zeros(1,total_T);
for i = 1:total_T
for j = 1:3
TH_Z(i) = TH_Z(i)+TH(j,i);
end
end
% 对目标进行排序,按照其对我机群的威胁从大到小,输出为敌机序号
mb_px = mbpx(TH_Z,total_T);
%[order,index]=sort(TH_Z);
%index
weapon = [1:total_W]; % 武器列表
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 初始化种群 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
popsize=80; %种群规模
len=total_W; %染色体长度
maxgen=100; %最大迭代次数
pcross=0.72; %交叉概率
pmutation=0.08; %变异概率
%初始化种群
for popsiz=1:popsize
t_num = total_W; % 目标数
target = [1:total_T,mb_px(1:(total_W-total_T))]; % 目标列表;每机一个多余导弹加分给威胁最大的目标
for l=1:total_W
m = rand_function(1,t_num); % 产生一个1-t_num之间的随机数
pop(popsiz,l)=target(m); % 列数即12个武器,依次排列
target = [target(1:m-1),target(m+1:t_num)]; % 将目标列表中的第m个排除
t_num = t_num-1; % 目标个数减去1
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%遗传结束条件 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mingen=15; %最小迭代次数
gen_min_tatio=0.02; %子群体最小进化率
gen_die=5; %子群体进化率小于最小进化率的可容忍进化代数
t=0; %子群体进化率小于最小进化率的当前代数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 迭代寻优 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for gen=1:maxgen %执行至设定的代数终止
[mpop,npop]=size(pop); %取种群矩阵的行数和列数,即种群规模和染色体长度
cost = zeros(1,mpop); %失败威胁值初始化
%%%%%%%%%%%% 计算每个方案的失败威胁概率和 %%%%%%%%%%%%%%
for m=1:mpop
for kk = 1:npop
cost(m) = cost(m)+TH_Z(pop(m,kk))*(1-PP(pop(m,kk),kk)); %每个目标分一个导弹
end
for i = 1:npop-1
for j = i+1:npop
if pop(m,i)==pop(m,j) %当有一个目标分配两个导弹时
cost(m) = cost(m)-TH_Z(pop(m,i))*(1-PP(pop(m,i),i))-TH_Z(pop(m,j))*(1-PP(pop(m,j),j))...
+TH_Z(pop(m,i))*(1-PP(pop(m,i),i))*(1-PP(pop(m,j),j));
end
end
end
c=10; %适配值函数f(x)中的常数c
f(m)=c/(0.001+cost(m)); %第m个方案的适配值函数值
end
%保存每一代最好的结果
[cost_order,cost_index]=sort(cost);
cost_min(gen)=cost_order(1);
result(gen,:)=pop(cost_index(1),:);
%结束的条件判断
if (gen>mingen)&((cost_min(gen-1)-cost_min(gen))<gen_min_tatio*cost_min(gen-1))
t=t+1;
else
t=0;
end
if t>=gen_die
break;
end
%轮盘选择
selectpop=select2(f,pop);
%交叉操作策略B
crosspop=crossover2(pcross,selectpop);
%逆转变异操作
pop=mutation2(pmutation,crosspop);
end
%%%%% 输出最优分配 %%%%%
time1=toc; %测CPU时间
gen
cost_min(gen); %遗传结束时的最好评估值结果
MM = 10; % 蚂蚁数m
for k=1:MM %得到前MM个最好值
pop_choose(k,:)=pop(cost_index(k),:);
end
cost_min_2=ant3_10_GAAA(pop_choose); %转向蚁群寻优
% final_result = result(gen,:); %排序结果
load parameter
time=time1+time2 %CPU总耗时
die=gen+nc %总代数
cost=[cost_min,cost_min_2]; %最优解序列
min=cost(die+1)
T=[1:(die+1)]; %画图
plot(T,cost);
xlabel('迭代次数');
ylabel('最佳评估值');
%plot(T,result(:,1));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -