☰
【优化选址】基于精英保留策略遗传算法校园快递驿站选址优化(目标函数:最小化加权距离)附Matlab代码
2026/10/18 13:17:09 网站建设 项目流程

✅作者简介:热爱科研的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​​%% 输出对比结果表格​

🔗 参考文献

[1]胥杰馨,柴俊霖,董志明,等.基于动态自适应遗传算法的电动轮矿车储能系统多目标协同优化[J].煤炭科学技术, 2026, 54(S1):492.DOI:10.12438/cst.2025-1123.

🍅更多免费数学建模和仿真教程关注领取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询