群体优化算法---猫群算法介绍,物流配送路径规划(包含3-opt,贪心算法)

介绍

猫群算法(Cat Swarm Optimization,CSO)是一种新型的基于群体智能的优化算法,由Chu et al.在2006年提出。该算法通过模拟猫的行为,尤其是其两种主要的行为:追捕行为(seeking mode)和休息行为(tracing mode),来实现对复杂优化问题的求解。以下是对猫群算法的详细介绍

算法背景和基本概念

猫群算法借鉴了猫的生活习性。猫在生活中有两种主要行为:
追捕行为(Seeking Mode):猫在寻觅猎物时会保持警觉,寻找最佳捕猎机会。
休息行为(Tracing Mode):猫在确定目标后,会迅速追踪目标,直到捕获。

猫群算法通过模拟这两种行为,使得算法能够有效地在解空间中进行探索和开发

算法结构

猫群算法的结构主要包括以下几个部分:

初始化:
初始化猫群,包括每只猫的位置和速度。
设置算法参数,如猫的数量、最大迭代次数、追捕模式和休息模式的概率等。

追捕行为(Seeking Mode):
在追捕模式中,猫会根据当前环境评估多个候选解,并选择其中最优的解进行移动。
具体步骤包括:
生成若干个候选解。
计算每个候选解的适应度。
根据适应度选择一个最优解。

休息行为(Tracing Mode):
在休息模式中,猫会沿着其目标方向进行移动,模拟猫在追踪猎物时的行为。

具体步骤包括:
计算猫当前的位置和速度。
更新猫的位置和速度,使其朝向目标方向移动。

更新猫群状态:
根据追捕模式和休息模式的概率,更新每只猫的状态。
更新全局最优解。

终止条件:
检查是否满足终止条件(如达到最大迭代次数或找到满意的解)。
如果满足终止条件,则输出最优解,否则返回步骤2继续迭代

算法步骤

以下是猫群算法的详细步骤:

初始化:
初始化猫群位置和速度。
设置算法参数:猫的数量(N),追捕模式概率(SRD),休息模式概率(MRD),最大迭代次数(MaxIter)。

迭代过程:
追捕行为(Seeking Mode):
对每只猫生成若干个候选解。
计算每个候选解的适应度。
根据适应度选择最优候选解。
更新猫的位置。

休息行为(Tracing Mode):
根据当前猫的位置和速度,更新猫的位置。
计算新的速度和位置。

更新全局最优解:
根据所有猫的适应度,更新全局最优解。

检查终止条件:
如果达到最大迭代次数或找到满意的解,则终止算法并输出最优解。
否则,返回步骤2继续迭代。

优缺点分析

优点:

全局搜索能力强:猫群算法通过模拟追捕行为和休息行为,能够在解空间中进行全局搜索和局部搜索,提高了搜索效率。
简单易实现:算法结构简单,易于实现和理解。
适应性强:适用于多种优化问题,包括连续优化和离散优化问题。

缺点:
参数敏感性:算法性能对参数设置较为敏感,参数选择不当可能导致收敛速度慢或陷入局部最优。
计算复杂度高:算法在每次迭代中需要评估多个候选解,计算复杂度较高

应用领域

猫群算法广泛应用于以下领域:

函数优化:用于求解复杂的多峰函数优化问题。
路径规划:用于机器人路径规划、物流配送等领域,寻找最优路径。
资源分配:用于分配有限资源以最大化收益,如生产调度、项目管理等。
工程设计:用于复杂工程设计中的参数优化,如结构优化、电路设计等。

猫群算法通过模拟猫的行为,实现了对复杂优化问题的有效求解。尽管存在计算复杂度高、参数敏感性强等问题,但其在多种应用领域中的成功实践表明了其强大的搜索能力和广泛的适用性。

本文代码

我们将引入3-opt,贪心算法来对更好的使用猫群算法进行物流路径规划

核心代码

function CSO_Logistics_Advanced()
    % 参数设置
    numCats = 50; % 猫的数量
    maxIter = 1000; % 增加最大迭代次数
    SRD = 0.5; % 寻捕模式的概率
    MRD = 0.3; % 追踪模式的概率
    seekingRange = 0.3; % 寻捕模式的范围
    tracingRange = 0.2; % 追踪模式的范围
    
    % 城市位置 (假设随机生成)
    numCities = 20;
    cityPositions = rand(numCities, 2) * 100;
    
    % 初始化猫群
    cats = InitializeCats(numCats, numCities, cityPositions);
    
    % 初始化全局最优解
    globalBestCost = inf;
    globalBestPath = [];
    
    % 主循环
    for iter = 1:maxIter
        for i = 1:numCats
            % 寻捕模式
            if rand < SRD
                cats(i).position = SeekingMode(cats(i).position, cityPositions, seekingRange);
            else
                % 追踪模式
                cats(i).position = TracingMode(cats(i).position, cityPositions, tracingRange);
            end
            
            % 计算路径成本
            cost = CalculatePathCost(cats(i).position, cityPositions);
            if cost < cats(i).cost
                cats(i).cost = cost;
                cats(i).bestPosition = cats(i).position;
            end
            
            % 更新全局最优解
            if cost < globalBestCost
                globalBestCost = cost;
                globalBestPath = cats(i).position;
            end
        end
        
        % 打印当前迭代信息
        fprintf('Iteration %d: Best Cost = %f\n', iter, globalBestCost);
    end
    
    % 局部搜索
    globalBestPath = LocalSearch(globalBestPath, cityPositions);
    
    % 绘制最优路径
    PlotPath(globalBestPath, cityPositions);
end

function cats = InitializeCats(numCats, numCities, cityPositions)
    cats(numCats) = struct('position', [], 'bestPosition', [], 'cost', inf);
    for i = 1:numCats
        cats(i).position = GreedyInit(numCities, cityPositions);
        cats(i).bestPosition = cats(i).position;
    end
end

function newPosition = SeekingMode(position, cityPositions, seekingRange)
    numCities = length(position);
    newPosition = position;
    numCandidates = 10;
    
    bestCost = CalculatePathCost(position, cityPositions);
    for i = 1:numCandidates
        candidate = position;
        if rand < seekingRange
            idx = randperm(numCities, 2);
            candidate([idx(1), idx(2)]) = candidate([idx(2), idx(1)]);
        end
        
        % 3-opt操作
        candidate = ThreeOpt(candidate, cityPositions);
        
        cost = CalculatePathCost(candidate, cityPositions);
        if cost < bestCost
            newPosition = candidate;
            bestCost = cost;
        end
    end
end

function newPosition = TracingMode(position, cityPositions, tracingRange)
    numCities = length(position);
    newPosition = position;
    
    for i = 1:numCities
        if rand < tracingRange
            j = randi([1, numCities]);
            newPosition([i, j]) = newPosition([j, i]);
        end
    end
end

function cost = CalculatePathCost(position, cityPositions)
    numCities = length(position);
    cost = 0;
    
    for i = 1:numCities-1
        cost = cost + norm(cityPositions(position(i), :) - cityPositions(position(i+1), :));
    end
    cost = cost + norm(cityPositions(position(end), :) - cityPositions(position(1), :));
end

function PlotPath(path, cityPositions)
    figure;
    hold on;
    plot(cityPositions(path, 1), cityPositions(path, 2), 'o-');
    plot(cityPositions(path(1), 1), cityPositions(path(1), 2), 'ro', 'MarkerFaceColor', 'r');
    title('Optimal Logistics Path');
    xlabel('X Coordinate');
    ylabel('Y Coordinate');
    grid on;
    hold off;
end

function newPath = LocalSearch(path, cityPositions)
    numCities = length(path);
    newPath = path;
    improved = true;
    
    while improved
        improved = false;
        for i = 1:numCities-2
            for j = i+2:numCities
                newPathCandidate = newPath;
                newPathCandidate(i:j) = newPath(j:-1:i);
                if CalculatePathCost(newPathCandidate, cityPositions) < CalculatePathCost(newPath, cityPositions)
                    newPath = newPathCandidate;
                    improved = true;
                end
            end
        end
    end
end

function initPath = GreedyInit(numCities, cityPositions)
    initPath = zeros(1, numCities);
    remainingCities = 1:numCities;
    initPath(1) = randi(numCities);
    remainingCities(initPath(1)) = [];
    
    for i = 2:numCities
        distances = zeros(1, length(remainingCities));
        for j = 1:length(remainingCities)
            distances(j) = norm(cityPositions(initPath(i-1), :) - cityPositions(remainingCities(j), :));
        end
        [~, minIdx] = min(distances);
        initPath(i) = remainingCities(minIdx);
        remainingCities(minIdx) = [];
    end
end

说明

参数设置:
numCats:猫的数量。
maxIter:最大迭代次数。
SRD:寻捕模式的概率。
MRD:追踪模式的概率。
seekingRange:寻捕模式的范围。
tracingRange:追踪模式的范围。

城市位置:
numCities:城市数量。
cityPositions:城市的坐标,随机生成在[0, 100]范围内。

初始化猫群:
InitializeCats函数生成初始的猫群,每只猫的位置表示为一个随机排列的城市顺序。

寻捕模式(Seeking Mode):
在寻捕模式中,猫生成若干个候选解(城市顺序的排列),选择其中最优的解更新自己的位置。

追踪模式(Tracing Mode):
在追踪模式中,猫根据当前的位置和随机选择的位置交换城市顺序,模拟猫的追踪行为。

路径成本计算:
CalculatePathCost函数计算当前路径的总距离。

全局最优解更新:
在每次迭代中,根据当前猫的路径成本,更新全局最优解。

绘制最优路径:
PlotPath函数绘制全局最优路径和城市位置。

效果

在这里插入图片描述

完整代码获取

微信扫一扫,回复"猫群算法"即可获取完整代码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值