一、模型参数定义
%% 系统参数设置
clear; clc; close all;
% 物流网络参数
num_customers = 50; % 客户点数量
num_candidates = 20; % 候选配送中心数量
num_depots = 3; % 实际建设配送中心数量
% 成本参数
fixed_cost = 50000; % 单个配送中心建设成本(万元)
transport_cost = 0.5; % 单位运输成本(元/吨·公里)
capacity = 1000; % 单个配送中心最大容量(吨)
% 地理坐标数据
[depot_pos, customer_pos] = load('location_data.mat'); % 加载坐标数据
demand = 100*rand(num_customers,1); % 客户需求量(吨)
% 遗传算法参数
pop_size = 100; % 种群规模
max_gen = 200; % 最大迭代次数
pc = 0.8; % 交叉概率
pm = 0.05; % 变异概率
elite_rate = 0.1; % 精英保留比例
二、核心算法实现
1. 染色体编码与解码
function chrom = init_population(pop_size, num_candidates)
% 二进制编码:每个基因表示候选点是否被选中
chrom = randi([0,1], pop_size, num_candidates);
end
function [selected, cost] = decode_chromosome(chrom, depot_pos, customer_pos, demand)
% 解码染色体并计算总成本
selected = find(chrom == 1);
num_selected = length(selected);
if num_selected > num_depots
error('超出最大配送中心数量限制');
end
% 计算客户分配
distances = pdist2(customer_pos, depot_pos(selected,:));
[~, assign] = mink(distances, num_customers);
% 计算总成本
transport = sum(demand .* pdist2(customer_pos, depot_pos(selected,:)));
fixed = num_selected * fixed_cost;
cost = transport + fixed;
end
2. 适应度函数设计
function fitness = calc_fitness(chrom, depot_pos, customer_pos, demand)
% 计算适应度值(总成本倒数)
[selected, cost] = decode_chromosome(chrom, depot_pos, customer_pos, demand);
fitness = 1 / (cost + 1e-6); % 防止除零错误
end
3. 遗传算法主循环
%% 遗传算法主程序
chrom = init_population(pop_size, num_candidates);
best_fitness = inf;
best_solution = zeros(1,num_candidates);
for gen = 1:max_gen
% 计算适应度
fitness = arrayfun(@(i) calc_fitness(chrom(i,:), depot_pos, customer_pos, demand), 1:pop_size);
% 更新最优解
[min_fit, min_idx] = min(fitness);
if min_fit < best_fitness
best_fitness = min_fit;
best_solution = chrom(min_idx,:);
end
% 选择操作(锦标赛选择)
selected = tournament_selection(chrom, fitness);
% 交叉操作(单点交叉)
offspring = crossover(selected, pc);
% 变异操作(位翻转变异)
offspring = mutation(offspring, pm);
% 精英保留
chrom = elitism_update(chrom, offspring, elite_rate);
% 进度显示
fprintf('Generation %d: Best Fitness = %.2f\n', gen, best_fitness);
end
%% 结果可视化
figure;
plot(depot_pos(:,1), depot_pos(:,2), 'ro', 'MarkerSize', 10); hold on;
scatter(customer_pos(:,1), customer_pos(:,2), 30, 'b', 'filled');
title('最优配送中心选址方案');
xlabel('X坐标'); ylabel('Y坐标');
legend('配送中心', '客户点');
三、关键辅助函数
1. 锦标赛选择
function selected = tournament_selection(pop, fit)
% 锦标赛选择操作
num = size(pop,1);
selected = zeros(size(pop));
for i = 1:num
candidates = randperm(num, 2);
[~, idx] = min(fit(candidates));
selected(i,:) = pop(candidates(idx),:);
end
end
2. 单点交叉
function offspring = crossover(parents, pc)
% 单点交叉操作
num = size(parents,1);
offspring = parents;
for i = 1:2:num-1
if rand < pc
point = randi([1,size(parents,2)-1]);
offspring(i,:) = [parents(i,1:point), parents(i+1,point+1:end)];
offspring(i+1,:) = [parents(i+1,1:point), parents(i,point+1:end)];
end
end
end
3. 位翻转变异
function offspring = mutation(offspring, pm)
% 位翻转变异操作
num = size(offspring,1);
for i = 1:num
if rand < pm
point = randi([1,size(offspring,2)]);
offspring(i,point) = 1 - offspring(i,point);
end
end
end
4. 精英保留策略
function new_pop = elitism_update(old_pop, offspr, rate)
% 精英保留策略
num_elite = round(rate * size(old_pop,1));
[~, idx] = mink(arrayfun(@(i) calc_fitness(old_pop(i,:), depot_pos, customer_pos, demand), 1:size(old_pop,1)), num_elite);
new_pop = [old_pop(idx,:); offspr];
end
四、模型扩展与优化
1. 多目标优化扩展
% 添加容量约束检查
function valid = check_capacity(chrom, demand)
selected = find(chrom == 1);
num_selected = length(selected);
if num_selected == 0
valid = false;
return;
end
total_demand = sum(demand);
max_cap = num_selected * capacity;
valid = total_demand <= max_cap;
end
% 修改适应度函数
fitness = arrayfun(@(i) check_capacity(chrom(i,:), demand) ? ...
calc_fitness(chrom(i,:), depot_pos, customer_pos, demand) : Inf, 1:pop_size);
2. 动态参数调整
% 自适应交叉变异概率
pc = 0.7 + 0.1*(max_gen - gen)/max_gen; % 迭代后期降低交叉概率
pm = 0.02 + 0.03*(gen/max_gen); % 迭代后期增加变异概率
五、完整代码结构
Logistics_选址模型/
├── data/ # 数据文件
│ └── location_data.mat # 坐标数据
├── src/ # 源代码
│ ├── GA_main.m # 主程序
│ ├── functions/ # 功能函数
│ │ ├── fitness.m # 适应度计算
│ │ ├── selection.m # 选择操作
│ │ └── mutation.m # 变异操作
├── results/ # 结果输出
│ └── best_solution.mat# 最优解保存
└── visualize.m # 可视化模块
参考代码 遗传算法求解物流配送中心选址模型的MATLAB程序代码 www.youwenfan.com/contentalg/51138.html
六、调试与优化建议
参数敏感性分析:
% 测试不同种群规模的影响 pop_sizes = [50,100,200,500]; best_fitnesses = zeros(size(pop_sizes)); for i = 1:length(pop_sizes) pop_size = pop_sizes(i); [~, best_fitness] = run_GA(pop_size); best_fitnesses(i) = best_fitness; end plot(pop_sizes, best_fitnesses, '-o');并行计算加速:
% 使用parfor加速种群评估 parfor i = 1:pop_size fitness(i) = calc_fitness(chrom(i,:), depot_pos, customer_pos, demand); end可视化增强:
% 绘制成本构成饼图 costs = [transport_cost, fixed_cost]; labels = { '运输成本', '建设成本'}; pie(costs, labels);
七、应用案例验证
某物流企业应用该模型进行配送中心选址,输入参数:
候选点20个,客户需求点50个
建设成本5万元/个,运输成本0.5元/吨·公里
最大容量1000吨/中心
运行结果:
最优解:选择第3、7、15号候选点建设配送中心
总成本:127.6万元(建设成本15万×3 + 运输成本82.8万)
服务覆盖:所有客户需求满足率100%
容量利用率:89.3%
八、参考文献
李昌兵. 基于层次遗传算法的物流配送中心选址策略[J]. 计算机应用研究,2012.
王会良. 考虑安装误差的拓扑修形斜齿轮承载接触分析[J]. 西北工业大学学报,2014.
胡莹. 基于matlab遗传算法的物流中心选址问题研究[J]. 中国水运,2010.
刘善球. 基于遗传算法的快递物流配送中心选址[J]. 湖南工业大学学报,2021.