✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、算法改进、程序设计科研仿真。
🍎完整代码获取 定制创新 论文复现私信
🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。
🔥 内容介绍
一、研究背景与问题描述
1. 研究背景
高校校园面积大、学生宿舍、教学楼、食堂、操场等人群分布分散;现有快递点存在布局混乱、取件步行距离过长、人流聚集拥堵、配送成本高等问题。校园驿站选址属于带权重多设施平面选址问题:
需求点:宿舍楼、教学楼、实训楼(每个点位赋予人流量权重,代表取件需求规模);
决策变量:k 个快递驿站平面坐标;
优化目标:所有需求点到最近驿站的加权总距离最小;
约束:驿站不可布置在禁建区(道路、湖泊、教学楼内部)、驿站数量固定、坐标限定校园地理边界内。
二、精英保留遗传算法 (Elitist GA) 基础原理
标准 GA 存在优秀个体丢失、后期收敛缓慢、最优解震荡问题;精英保留策略直接将每一代最优个体不参与交叉变异,完整复制到下一代,保证全局最优解不退化,收敛速度与稳定性大幅提升。完整迭代流程:
种群初始化;
适应度计算(目标函数取倒数,越小距离对应越高适应度);
精英保存:筛选前 Ne 个最优个体直接保留;
选择操作:轮盘赌 / 锦标赛选择剩余父代;
交叉、变异生成子代;
子代 + 精英合并形成新种群,迭代直至最大迭代次数。
三、整体选址优化模型搭建
步骤 1:校园数据采集与预处理
需求点位采集标记全部宿舍楼、教学楼、商业街坐标 (xi,yi);统计日均快递取件人数,归一化得到权重 wi。
校园地理约束建模
划定校园坐标上下限;
多边形顶点描述湖泊、主干道、教学区等禁建区域;
参数初始化驿站数量 k、种群规模、迭代次数、交叉概率、变异概率、精英个体比例、最小驿站间距。
⛳️ 运行结果
📣 部分代码
% 问题数据points = [5,12,120; 10,25,180; 15,8,100; 18,20,150; 22,5,80;25,18,160; 30,10,140; 32,28,110; 38,15,170; 42,25,190];x_i = points(:,1); y_i = points(:,2); w_i = points(:,3);% 参数N = 100; k_tour = 2; eta_c = 2; p_m = 0.1;sigma_m = [5,3]; max_stagnation = 50; epsilon = 0.001;num_runs = 20;% 存储结果results_with_elite = zeros(num_runs, 1);results_without_elite = zeros(num_runs, 1);%% 有精英策略fprintf('\n1. 有精英策略\n');for run = 1:num_runsrng('shuffle');population = [0+50*rand(N,1), 0+30*rand(N,1)];fitness = zeros(N,1);for i=1:Nfitness(i) = -sum(w_i.*sqrt((population(i,1)-x_i).^2+(population(i,2)-y_i).^2));endstagnation = 0; prev_best = -inf;for gen = 1:500[sorted_fit, idx] = sort(fitness,'descend');elites = population(idx(1:10),:);n_off = N-10;parents = zeros(n_off,2);for i=1:n_offcand = randi(N,2,1);[~,best_c] = max(fitness(cand));parents(i,:) = population(cand(best_c),:);endoffspring = zeros(n_off,2);shuff = randperm(n_off);parents = parents(shuff,:);for i=1:2:n_off-1p1=parents(i,:); p2=parents(i+1,:);for d=1:2u=rand();if u<=0.5; beta=(2*u)^(1/(eta_c+1));else beta=(1/(2*(1-u)))^(1/(eta_c+1)); endc1(d)=0.5*((1+beta)*p1(d)+(1-beta)*p2(d));c2(d)=0.5*((1-beta)*p1(d)+(1+beta)*p2(d));endc1(1)=max(0,min(50,c1(1))); c1(2)=max(0,min(30,c1(2)));c2(1)=max(0,min(50,c2(1))); c2(2)=max(0,min(30,c2(2)));offspring(i,:)=c1; offspring(i+1,:)=c2;endfor i=1:n_offif rand()<p_moffspring(i,1)=max(0,min(50,offspring(i,1)+sigma_m(1)*randn()));offspring(i,2)=max(0,min(30,offspring(i,2)+sigma_m(2)*randn()));endendoff_fit = zeros(n_off,1);for i=1:n_offoff_fit(i) = -sum(w_i.*sqrt((offspring(i,1)-x_i).^2+(offspring(i,2)-y_i).^2));endnew_pop = [elites; offspring];new_fit = [sorted_fit(1:10); off_fit];[new_fit, new_idx] = sort(new_fit,'descend');population = new_pop(new_idx(1:N),:);fitness = new_fit(1:N);if gen>1 && abs(fitness(1)-prev_best)/abs(prev_best)<epsilonstagnation = stagnation+1;if stagnation>=max_stagnation; break; endelse; stagnation=0; endprev_best = fitness(1);endresults_with_elite(run) = -fitness(1);fprintf('第%d次: %.4f\n', run, results_with_elite(run));end%% 无精英策略fprintf('\n2. 无精英策略\n');for run = 1:num_runsrng('shuffle');population = [0+50*rand(N,1), 0+30*rand(N,1)];fitness = zeros(N,1);for i=1:Nfitness(i) = -sum(w_i.*sqrt((population(i,1)-x_i).^2+(population(i,2)-y_i).^2));endstagnation = 0; prev_best = -inf;for gen = 1:500parents = zeros(N,2);for i=1:Ncand = randi(N,2,1);[~,best_c] = max(fitness(cand));parents(i,:) = population(cand(best_c),:);endoffspring = zeros(N,2);shuff = randperm(N);parents = parents(shuff,:);for i=1:2:N-1p1=parents(i,:); p2=parents(i+1,:);for d=1:2u=rand();if u<=0.5; beta=(2*u)^(1/(eta_c+1));else beta=(1/(2*(1-u)))^(1/(eta_c+1)); endc1(d)=0.5*((1+beta)*p1(d)+(1-beta)*p2(d));c2(d)=0.5*((1-beta)*p1(d)+(1+beta)*p2(d));endc1(1)=max(0,min(50,c1(1))); c1(2)=max(0,min(30,c1(2)));c2(1)=max(0,min(50,c2(1))); c2(2)=max(0,min(30,c2(2)));offspring(i,:)=c1; offspring(i+1,:)=c2;endfor i=1:Nif rand()<p_moffspring(i,1)=max(0,min(50,offspring(i,1)+sigma_m(1)*randn()));offspring(i,2)=max(0,min(30,offspring(i,2)+sigma_m(2)*randn()));endendoff_fit = zeros(N,1);for i=1:Noff_fit(i) = -sum(w_i.*sqrt((offspring(i,1)-x_i).^2+(offspring(i,2)-y_i).^2));endpopulation = offspring;fitness = off_fit;if gen>1 && abs(fitness(1)-prev_best)/abs(prev_best)<epsilonstagnation = stagnation+1;if stagnation>=max_stagnation; break; endelse; stagnation=0; endprev_best = fitness(1);endresults_without_elite(run) = -fitness(1);fprintf('第%d次: %.4f\n', run, results_without_elite(run));end%% 输出对比结果表格