基于免疫算法的商店定址算法

注释:由于我的excel2007不能被matlab 调用,所以我复制了31组数组进行测试;;

免疫算法思想来日送上

%% 免疫优化算法在物流配送中心选址中的应用
%% 清空环境
clc;
clear all;
close all;
%% 算法参数设置
sizePop = 50;       % 种群规模;
overBest = 10;     % 记忆库容量;
maxGen = 100;    %迭代次数;
pcross = 0.5;        %交叉概率;
pmutation = 0.4;  %变异概率;
ps = 0.95;             %多样性评价参数;
lengthCenter = 6; % 配送中心数;
M = sizePop + overBest;

%% step1识别抗原,将中群信息定义为结构体;
individuals = struct('fitness',zeros(1,M),'concentration',...
    zeros(1,M),'excellence',zeros(1,M),'chrom',[]);

%% step2 产生初始抗体群
individuals.chrom = popInt(M,lengthCenter);
trace = []; %记录每代适应度和评价适应度;

%% 迭代寻优
for iii = 1:maxGen
    %% step 3抗体群多样性评价
    for i = 1:M
        individuals.fitness(i) = fitness(individuals.chrom(i,:));% 抗体与抗原亲和度(适应度值计算)
        
        individuals.concentration(i) = concentration(i,M,individuals);%抗体浓度计算
    end
    %% 综合亲和度和浓度计算优秀程度,得出繁殖概率
    individuals.excellence = excellence(individuals,M,ps);
    
    %% 记录当代最佳个体和种群平均适应程度
    [best,index] = min(individuals.fitness);             %找出最有适应度
    bestchrom = individuals.chrom(index,:);           % 找出最优个体; 
    average = mean(individuals.fitness);                %平均适应度
    trace = [trace;best,average];                            %记录
    
    %% step4 根据excellence形成父群,更新记忆库
    bestindividuals = bestselect(individuals,M,overBest);
    individuals = bestselect(individuals,M,sizePop);
    
    %% step5 选择,交叉,变异,产生新种群
    individuals = select(individuals,sizePop);          %选择;
    individuals.chrom = cross(pcross,individuals.chrom ,sizePop,lengthCenter);  %交叉
    individuals.chrom  = mutation(pmutation,individuals.chrom ,sizePop,lengthCenter); %变异
    individuals = incorporate(individuals ,sizePop,bestindividuals,overBest);%加入记忆库中抗体;
end

%% 画出各算法曲线
figure(1)
plot(trace(:,1),'r','linewidth',2);
hold on
plot(trace(:,2),'--','linewidth',2);
legend('最优度适应值','平均适应值')
grid on;
title('免疫算法收敛曲线','fontsize',12);
xlabel('迭代次数');
ylabel('适应度值');

%% 画出中心选址图
cityCoordinate = xlsread('city_coordinate');
for i = 1:31
    distance(i,:) = dist(cityCoordinate(i,1:2),cityCoordinate(bestchrom,1:2)');
end
[a,b] = min(distance');
index = cell(1,lengthCenter);
for i = 1:lengthCenter
    index{i} = find(b == i);
end
figure(2);
title('最有规划路线');
cargox = cityCoordinate(bestchrom,1);
cargoy = cityCoordinate(bestchrom,2);
plot(cargox,cargoy,'rs','linewidth',2,'MarkerEdgeColor','r',...
        'MarkerFaceColor','g',...
        'MarkerSize',10);
hold on 
plot(cityCoordinate(:,1),cityCoordinate(:,2),'o','linewidth',2,'MarkerEdgeColor','k',...
        'MarkerFaceColor','g',...
        'MarkerSize',10);
grid on;
for i = 1:31
    x =[cityCoordinate(i,1),cityCoordinate(bestchrom(b(i)),1)];
    y =[cityCoordinate(i,2),cityCoordinate(bestchrom(b(i)),2)];
    plot(x,y,'c','linewidth',2);
    hold on
end

function chrom = popInt(M,lengthCenter)
%初始化种群函数(记忆库为空,全部随机产生);
% M                    input   种群数量
% lengthCenter   input   抗体长度;
% chrom             output 初始种群;

for i = 1:M
    flag = 0;
   while flag == 0
    r = randperm(31);   
    chrom(i,:) = r(1:lengthCenter);
    flag = test(chrom(i,:));
    end
end
% 
% % for i = 1:M
% %     flag = 0;
% %     while flag == 0
% %         [a,b] = sort(rand(1,31));
% %         chrom(i,:) = b(1:lengthCenter);
% %         flag = test(chrom(i,:));
% %     end
% % end
end

function flag = test(chrom)
% 检查个体是否满足距离约束;
% chrom  input 个体
% flag      output 是否满足约束标志;
cityCoordinate = [
1304    2312;
3639    1315;
4177    2244;
3712    1399;
3488    1535;
3326    1556;
3238    1229;
4196    1044;
4312    790;
4386    570;
3007    1970;
2562    1756;
2788    1491;
2381    1676;
1332    695;
3715    1678;
3918    2179;
4061    2370;
3780    2212;
3676    2578;
4029    2838;
4263    2931;
3429    1908;
3507    2376;
3394    2643;
3439    3201;
2935    3204;
3140    3550;
2545    2357;
2778    2826;
2370    2975];
% cityCoordinate = xlsread('city_coordinate.xlsx',1,'A:B');
flag = 1;
distance = dist(cityCoordinate(chrom,:)');
if max(max(distance)) > 4000;
    flag = 0;
end
end

function fit = fitness(individual)
% 计算个体适应度
% individual   input     个体
% fit               output   适应度值;
% cityInformation = xlsread('city_coordinate','A:B');
% cityCoordinate = cityInformation(1:2,:);
cityCoordinate = [
1304    2312;
3639    1315;
4177    2244;
3712    1399;
3488    1535;
3326    1556;
3238    1229;
4196    1044;
4312    790;
4386    570;
3007    1970;
2562    1756;
2788    1491;
2381    1676;
1332    695;
3715    1678;
3918    2179;
4061    2370;
3780    2212;
3676    2578;
4029    2838;
4263    2931;
3429    1908;
3507    2376;
3394    2643;
3439    3201;
2935    3204;
3140    3550;
2545    2357;
2778    2826;
2370    2975];
% carge = cityInformation(3,:);
carge=[20,90,90 60 70 70 40 90 90 70 60 40 40 40 20 80 90 70 100 50,...
            50 50 80 70 80 40 40 60 70 50 30];
for i = 1:31
    distance(i,:) = dist(cityCoordinate(i,:),cityCoordinate(individual,:)');
end
[a,b] = min(distance');
for i = 1:31
    expense(i) = a(i)*carge(i);
end
% 举例大于3000时给一个惩罚措施;
fit = sum(expense) + 4.0e+4 + 4*length(find(a>4000));
end

function con = concentration(i,M,individuals)
% 计算个体浓度值
% i                                input   第i个抗体
% M                              input   抗体总数
% con                            output 浓度值
con = 0;
for j = 1:M
 %% 计算个体1和个体2之间的相似度
    resemble = 0;
    l = zeros(1,length(individuals.chrom(i,:)));
    for k = 1:length(individuals.chrom(i,:))
        if find(individuals.chrom(i,k) == individuals.chrom(j,:))
            l(k) =1;
        end
    end
    resemble = sum(l)/length(individuals.chrom(i,:));
  %% 计算个体浓度
  if resemble > 0.7
      con = con + 1;
  end
end
con = con/M;
end

function exce = excellence(individuals,M,ps)
% 计算个体繁殖概率;
fit = 1./individuals.fitness;
sumfit = sum(fit);
con = individuals.concentration;
sumcon = sum(con);
for i = 1:M
    exce(i) = fit(i)/sumfit*ps + con(i) /sumcon*(1-ps);
end
end

function rets = bestselect(individuals,M,N)
% 精英保留策略
s = 3;
rets = struct('fitness',zeros(1,N),'concentration',...
    zeros(1,N),'excellence',zeros(1,N),'chrom',[]);
[fitness , index] = sort(individuals.fitness);
for i = 1:s
    rets.fitness(i) = individuals.fitness(index(i));
    rets.concentration(i) = individuals.concentration(index(i));
    rets.excellence(i) = individuals.excellence(index(i));
    rets.chrom(i,:) = individuals.chrom(index(i),:);
end
%% 剩余m-s个个体
leftindividuals = struct('fitness',zeros(1,M-s),'concentration',...
    zeros(1,M-s),'excellence',zeros(1,M-s),'chrom',[]);
for k = 1:M-s
    leftindividuals.fitness(k) = individuals.fitness(index(k+s));
    leftindividuals.concentration(k) = individuals.concentration(index(k+s));
    leftindividuals.excellence(k) = individuals.excellence(index(k+s));
    leftindividuals.chrom(k,:) = individuals.chrom(index(k+s),:);
end
%% 对剩余抗体群众再选N-s个最好个体
[exce,index] = sort(1./leftindividuals.excellence);
for i =s+1:N
    rets.fitness(i) = individuals.fitness(index(i-s));
    rets.concentration(i) = individuals.concentration(index(i-s));
    rets.excellence(i) = individuals.excellence(index(i-s));
    rets.chrom(i,:) = individuals.chrom(index(i-s),:);
end
end

function ret= select(individuals,sizePop)
%轮盘赌选择
exc = individuals.excellence;
pselect = exc./sum(exc);
index = [];
for i = 1:sizePop
    p = rand;
    while p == 0
        p = rand;
    end
    for j = 1:sizePop
        p = p - pselect(j);
        if p < 0
            index = [index j];
            break;
        end
    end
end
individuals.chrom = individuals.chrom(index,:);
individuals.fitness= individuals.fitness(index);
individuals.concentration= individuals.concentration(index);
individuals.excellence = individuals.excellence (index);
ret = individuals;
end

function ret= cross(pcross,chrom ,sizePop,length)
%交叉操作
for i = 1:sizePop
    %% 随机选择两个染色体
    p = rand;
    while p == 0
        p = rand;
    end
    if p > pcross
        continue;
    end
    index(1) = unidrnd(sizePop);
    index(2) = unidrnd(sizePop);
    while index(1) == index(2)
        index(2) = unidrnd(sizePop);
    end
    pos = ceil(length*rand);
    while pos == 1
        pos =ceil(length*rand);
    end
    chrom1 = chrom(index(1),:);
    chrom2 = chrom(index(2),:);
    temp = chrom1(pos:length);
    chrom1(pos:length) = chrom2(pos:length);
    chrom2(pos:length) = temp;
    %% 满足约束条件赋予新种群
    flag1 = test(chrom(index(1),:));
    flag2 = test(chrom(index(2),:));
    if flag1 * flag2 == 1
        chrom(index(1),:) = chrom1;
        chrom(index(2),:) = chrom2;
    end
end
ret = chrom;
end

function new = incorporate(individuals ,sizepop,bestindividuals,overbest)
%形成新的种群
m = sizepop + overbest;
new = struct('fitness',zeros(1,m),'concentration',...
    zeros(1,m),'excellence',zeros(1,m),'chrom',[]);
for i = 1:sizepop
    new.fitness(i) = individuals.fitness(i);
    new.concentration(i) = individuals.concentration(i);
    new.excellence(i) = individuals.excellence(i);
    new.chrom(i,:) = individuals.chrom(i,:);
end
%% 记忆库中抗体
for i = sizepop+1:m
    new.fitness(i) = individuals.fitness(i-sizepop);
    new.concentration(i) = individuals.concentration(i-sizepop);
    new.excellence(i) = individuals.excellence(i-sizepop);
    new.chrom(i,:) = individuals.chrom(i-sizepop,:);
end
end

希望对大家有帮助,要的建议请留下

posted on 2015-03-29 22:47  Kermit.Li  阅读(1082)  评论(0)    收藏  举报

导航