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

简介: 基于遗传算法求解物流配送中心选址模型的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/contentalg/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.

相关文章
|
7天前
|
JSON API 数据格式
OpenCode入门使用教程
本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
3172 7
|
13天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
3天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
|
15天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
2239 18
|
7天前
|
人工智能 前端开发 Docker
Huobao Drama 开源短剧生成平台:从剧本到视频
Huobao Drama 是一个基于 Go + Vue3 的开源 AI 短剧自动化生成平台,支持剧本解析、角色与分镜生成、图生视频及剪辑合成,覆盖短剧生产全链路。内置角色管理、分镜设计、视频合成、任务追踪等功能,支持本地部署与多模型接入(如 OpenAI、Ollama、火山等),搭配 FFmpeg 实现高效视频处理,适用于短剧工作流验证与自建 AI 创作后台。
1122 5
|
6天前
|
人工智能 运维 前端开发
Claude Code 30k+ star官方插件,小白也能写专业级代码
Superpowers是Claude Code官方插件,由核心开发者Jesse打造,上线3个月获3万star。它集成brainstorming、TDD、系统化调试等专业开发流程,让AI写代码更规范高效。开源免费,安装简单,实测显著提升开发质量与效率,值得开发者尝试。
|
17天前
|
人工智能 测试技术 开发者
AI Coding后端开发实战:解锁AI辅助编程新范式
本文系统阐述了AI时代开发者如何高效协作AI Coding工具,强调破除认知误区、构建个人上下文管理体系,并精准判断AI输出质量。通过实战流程与案例,助力开发者实现从编码到架构思维的跃迁,成为人机协同的“超级开发者”。
1267 102
|
13天前
|
人工智能 JSON 自然语言处理
【2026最新最全】一篇文章带你学会Qoder编辑器
Qoder是一款面向程序员的AI编程助手,集智能补全、对话式编程、项目级理解、任务模式与规则驱动于一体,支持模型分级选择与CLI命令行操作,可自动生成文档、优化提示词,提升开发效率。
1002 10
【2026最新最全】一篇文章带你学会Qoder编辑器