⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gen_target.m

📁 用于实现对目标分配的遗传求解
💻 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 + -