基于遗传算法求解物流配送中心选址模型的MATLAB实现

一、模型参数定义

%% 系统参数设置
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/contentcnt/51138.html

六、调试与优化建议

  1. 参数敏感性分析

    % 测试不同种群规模的影响
    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');
    
  2. 并行计算加速

    % 使用parfor加速种群评估
    parfor i = 1:pop_size
        fitness(i) = calc_fitness(chrom(i,:), depot_pos, customer_pos, demand);
    end
    
  3. 可视化增强

    % 绘制成本构成饼图
    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.

posted @ 2026-04-20 10:18  w199899899  阅读(13)  评论(0)    收藏  举报