📄 gen_target.m
字号:
%基于遗传算法的目标分配子程序
%设定我方每架飞机只能攻击敌方一架飞机,敌方每一架飞机也只能被我方一架飞机选为目标机
clear
% 我方飞机数
n=6;
% 对方飞机数
m=6;
% 样本数
sample=30;
% 随机产生初始优势矩阵
%c=rand(n,m);
c=[0.6635 0.1690 0.7803 0.5342 0.0450 0.9789
0.4433 0.5499 0.1104 0.5604 0.9153 0.2537
0.4670 0.9404 0.3163 0.9163 0.0462 0.2047
0.8836 0.6657 0.2735 0.1349 0.3870 0.0593
0.2047 0.2470 0.4828 0.3490 0.8450 0.3265
0.8796 0.9626 0.8020 0.9394 0.3965 0.2482];
% 产生样本的初始目标分配
cc=rand(sample,m);
for i=1:sample
for j=1:n
b(i,j)=ceil(cc(i,j)*m);
end
end
b(1:n)=1:n;
% 样本适配值
fmax=0;
% 最佳目标分配结果
bopt=[];
% 计数器
count=[];
f=[];
bn=b;
for k=1:200
if(mod(k,50)==0)
disp(fmax);
end
ff=0;
%约束条件处理
for i=1:sample
labsum=0;
for j=1:n
count(j)=0;
for k=1:n
if(b(i,k)==b(i,j))
% 计算每行中相同目标的个数
count(j)=count(j)+1;
end
end
% 如果每行中相同目标的个数大于1则使标号加1
if(count(j)>1)
labsum=labsum+1;
end
end
%复制操作
if(labsum>0)
f(i)=0.01;
else
f(i)=0;
for j=1:n
f(i)=f(i)+c(j,b(i,j));
end
end
ff=ff+f(i);
fdisk(i)=ff;
%如果分配后的适配值增大则记下当前的最大适配值和最佳目标分配策略
if(fmax<f(i))
fmax=f(i);
bopt=b(i,:);
end
end
% 随机产生均匀分布的随机数,对其进行升序排列,得排列号,取其前n个序号,满足tmp>fd(j)/ff&tmp<fd(j+1)/ff时,则第i飞机对应目标为j
for i=1:sample
tmp=rand;
fd(2:sample+1)=fdisk;
fd(1)=0;
for j=1:sample
if(tmp>fd(j)/ff&tmp<fd(j+1)/ff)
bn(i,:)=b(j,:);
end
end
end
%交叉操作
for i=1:sample
%在任选的两个参数串中随机选取两个数
if(rand>0.7)
num1=ceil(rand*n);
num2=ceil(rand*n);
if(num1<num2)
for j=num1:1:floor((num1+num2)/2)
tmp=bn(i,j);
bn(i,j)=bn(i,num2-j+num1);
bn(i,num2-j+num1)=tmp;
end
else
for j=num1:-1:floor((num1+num2)/2)
tmp=bn(i,j);
bn(i,j)=bn(i,num2-j+num1);
bn(i,num2-j+num1)=tmp;
end
end
end
end
b=bn;
end
clc
fmax
bopt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -