基于免疫算法的商店定址算法
注释:由于我的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


希望对大家有帮助,要的建议请留下
浙公网安备 33010602011771号