蚁群优化算法

news2024/11/15 13:23:52

目录

蚁群优化

Quadratic Assignment Problem (QAP)

 主要代码

create model

Cost

RouletteWheelSelection

Plot

结果


蚁群优化


        蚁群优化(ACO)是一套概率元启发法和智能优化算法,其灵感来源于蚂蚁的社会行为。ACO算法也被归类为群集智能方法,因为在这些算法的结构中通过模拟蚂蚁的行为来实现这一范式。


Quadratic Assignment Problem (QAP)

        二次分配问题


 主要代码


clc;
clear;
close all;

%% Problem Definition

model = CreateModel();

CostFunction = @(p) MyCost(p, model);

nVar = model.n;

%% ACO Parameters

MaxIt = 500;      % Maximum Number of Iterations

nAnt = 50;        % Number of Ants (Population Size)

Q = 1;

tau0 = 10;        % Initial Phromone

alpha = 0.3;      % Phromone Exponential Weight 弗罗蒙指数权重

rho = 0.1;        % Evaporation Rate 蒸发率


%% Initialization

tau = tau0*ones(model.m, nVar);

BestCost = zeros(MaxIt, 1);    % Array to Hold Best Cost Values

% Empty Ant
empty_ant.Tour = [];
empty_ant.Cost = [];

% Ant Colony Matrix
ant = repmat(empty_ant, nAnt, 1);

% Best Ant
BestSol.Cost = inf;


%% ACO Main Loop

for it = 1:MaxIt
    
    % Move Ants
    for k = 1:nAnt
        
        ant(k).Tour = [];
        
        for l = 1:nVar
            
            P = tau(:, l).^alpha;
            
            P(ant(k).Tour) = 0;
            
            P = P/sum(P);
            
            j = RouletteWheelSelection(P);
            
            ant(k).Tour = [ant(k).Tour j];
            
        end
        
        ant(k).Cost = CostFunction(ant(k).Tour);
        
        if ant(k).Cost<BestSol.Cost
            BestSol = ant(k);
        end
        
    end
    
    % Update Phromones
    for k = 1:nAnt
        
        tour = ant(k).Tour;
        
        for l = 1:nVar
            
            tau(tour(l), l) = tau(tour(l), l)+Q/ant(k).Cost;
            
        end
        
    end
    
    % Evaporation
    tau = (1-rho)*tau;
    
    % Store Best Cost
    BestCost(it) = BestSol.Cost;
    
    % Show Iteration Information
    disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);

    % Plot Solution
    figure(1);
    PlotSolution(BestSol.Tour, model);
    pause(0.01);
    
end

%% Results

figure;
plot(BestCost, 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;

create model


function model = CreateModel()

    x = [67 80 62 34 54 36 53 46 39 35 83 58 87 90 83 38 26 78 49 67];
    
    y = [9 81 9 43 89 30 95 87 1 74 85 86 56 86 22 73 36 34 17 37];
    
    m = numel(x);
    
    d = zeros(m, m);
    for p = 1:m-1
        for q = p+1:m
            d(p, q) = sqrt((x(p)-x(q))^2+(y(p)-y(q))^2);
            d(q, p) = d(p, q);
        end
    end
    
    w = [0    6    6    3    5    5    5
       6    0    6    4  -10    3    6
       6    6    0    4    5    8    6
       3    4    4    0    4    4  100
       5  -10    5    4    0    3    4
       5    3    8    4    3    0    4
       5    6    6  100    4    4    0];

    n = size(w, 1);
    
    model.n = n;
    model.m = m;
    model.w = w;
    model.x = x;
    model.y = y;
    model.d = d;
    
end

Cost


function z = MyCost(p, model)

    n = model.n;
    w = model.w;
    d = model.d;

    z = 0;
    
    for i = 1:n-1
        for j = i+1:n
            
            z = z+w(i, j)*d(p(i), p(j));
            
        end
    end

end

RouletteWheelSelection


cumsum 累积和

B = cumsum(A) 从 A 中的第一个其大小不等于 1 的数组维度开始返回 A 的累积和。

  • 如果 A 是向量,则 cumsum(A) 返回包含 A 元素累积和的向量。

  • 如果 A 是矩阵,则 cumsum(A) 返回包含 A 每列的累积和的矩阵。

  • 如果 A 为多维数组,则 cumsum(A) 沿第一个非单一维运算。

B = cumsum(A,dim) 返回沿维度 dim 的元素的累积和。例如,如果 A 是矩阵,则 cumsum(A,2) 返回每行的累积和。

B = cumsum(___,direction) 可选择性地使用上述任何语法指定方向。必须指定 A,也可以指定 dim。例如,cumsum(A,2,'reverse') 通过从尾到头计算 A 的第二个维度返回其中各行的累积和。

B = cumsum(___,nanflag) 指定在上述任意语法的计算中包括还是忽略 NaN 值。cumsum(A,'includenan') 会在计算中包括所有 NaN 值,而 cumsum(A,'omitnan') 则忽略这些值。

find 查找

k = find(X) 返回一个包含数组 X 中每个非零元素的线性索引的向量。

  • 如果 X 为向量,则 find 返回方向与 X 相同的向量。

  • 如果 X 为多维数组,则 find 返回由结果的线性索引组成的列向量。

k = find(X,n) 返回与 X 中的非零元素对应的前 n 个索引。

k = find(X,n,direction)(其中 direction 为 'last')查找与 X 中的非零元素对应的最后 n 个索引。direction 的默认值为 'first',即查找与非零元素对应的前 n 个索引。

function j = RouletteWheelSelection(P)

    r = rand;
    
    C = cumsum(P);
    
    j = find(r <= C, 1, 'first');

end

Plot


function PlotSolution(p, model)

    x = model.x;
    y = model.y;
    
    plot(x, y, 'o', 'MarkerSize', 20, 'Color', [0.4 0.5 0.9]);
    
    hold on;
    
    plot(x(p), y(p), 'sk', 'MarkerSize', 16, 'MarkerFaceColor', 'y');
    
    n = model.n;
    for i = 1:n
        text(x(p(i)), y(p(i)), num2str(i), ...
            'HorizontalAlignment', 'center', ...
            'VerticalAlignment', 'middle');
    end
    
    title('Quadratic Assignment Problem');
    
    hold off;
    axis equal;
    grid on;
    
    alpha = 0.1;
    
    xmin = min(x);
    xmax = max(x);
    dx = xmax - xmin;
    xmin = floor((xmin - alpha*dx)/10)*10;
    xmax = ceil((xmax + alpha*dx)/10)*10;
    xlim([xmin xmax]);
    
    ymin = min(y);
    ymax = max(y);
    dy = ymax - ymin;
    ymin = floor((ymin - alpha*dy)/10)*10;
    ymax = ceil((ymax + alpha*dy)/10)*10;
    ylim([ymin ymax]);

end

结果


Iteration 500: Best Cost = 2003.5414

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑系统可以直接备份到其它硬盘上吗

在日常使用电脑的过程中&#xff0c;我们都希望能够保护好重要的系统数据&#xff0c;以防止意外数据丢失或系统崩溃。那么&#xff0c;能否将电脑系统直接备份到其他硬盘上呢&#xff1f;本文将为您解答这个问题&#xff0c;并探讨备份系统的方法和注意事项。 工具/原料&…

Kubernetes通过滚动更新deployment实现金丝雀发布

如果要使用 Deployment 向用户子集或服务器子集上线版本&#xff0c; 则可以遵循资源管理所描述的金丝雀模式&#xff0c; 创建多个 Deployment&#xff0c;每个版本一个。 所谓金丝雀发布&#xff08;Canary Release&#xff09;&#xff0c;就是第一个新的 Pod 创建完成后立…

高考落榜,误打误撞学习了软件测试现在月薪30k成为了班上人人羡慕的对象

记得我刚高考结束时&#xff0c;并没有想象中的狂欢&#xff0c;反而是一种处于一种坐立不安的焦虑中&#xff0c;因为那时单纯地认为&#xff1a;这张试卷&#xff0c;将决定我的一生。对于将信仰寄托于高考的学生来说&#xff0c;当网页上高考成绩弹出的一瞬间&#xff0c;世…

数据在内存中的存储--浮点数

那么好了好了&#xff0c;宝子们&#xff0c;今天给大家介绍一下 “数据在内存中储存” 的来龙去脉---浮点数&#xff0c;来吧&#xff0c;开始整活&#xff01;⛳️ 一、数据类型家族&#xff08;浮点数&#xff09; 家族成员&#xff1a;float&#xff0c;double&#xf…

通过 docker-compose 快速部署 Kafka 保姆级教程

一、概述 Kafka是由Apache基金会开发的分布式流处理平台&#xff0c;采用发布-订阅模式&#xff0c;支持高吞吐量、低延迟的数据传输。主要用于处理实时数据管道、数据存储和数据分析等大数据应用场景。Kafka采用高效的数据压缩算法&#xff0c;可以在集群中存储大量的数据&am…

相约未名湖畔,百度商业AI技术创新大赛携手北大学子共探AI发展

火热六月&#xff0c;百度商业AI技术创新大赛正在如火如荼的进行&#xff0c;百度商业与高校合作展开全国巡回宣讲会&#xff0c;吸引高校学子参与&#xff0c;激发创新思维&#xff0c;为科技发展注入源源不断的新生力量。6月6日&#xff0c;百度商业AI技术创新大赛走进北京大…

CSPM项目管理专业人员能力等级评价各级考试题目由什么构成?

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

智能存储柜的种类和特点分析

近年来随着网络技术的发展和人们对社会发展服务水平的需求不断提高&#xff0c;智能产品越来越普及&#xff0c;生活中也出现了越来越多的智能存储柜&#xff0c;应用于商场、超市、企业、工厂等场景&#xff0c;使用方便、保密性强、可靠性高。 智能存储柜种类非常多&#xff…

TIOBE 6月榜单出炉!AI影响到Python第一的位置?

TIOBE 6月榜单已经发布了&#xff0c;一起来看看这个月编程语言排行榜有什么变化吧&#xff01; Python第一宝座岌岌可危 在过去的几年中&#xff0c;Python已经5次获得TIOBE指数年度奖项。由于数据科学和人工智能领域的推动&#xff0c;它越来越受欢迎。自 2021 年 10 月起&a…

大模型热潮来袭,AI基础软件深度赋能金融行业数智化升级

近日&#xff0c;由中国金融电子化集团有限公司、南京市建邺区人民政府主办的“2023 中国金融业数字化转型发展大会暨第十三届中国城市商业银行信息化发展创新座谈会”在南京盛大举办。九章云极DataCanvas公司副总裁周晓凌受邀出席会议&#xff0c;并发表“大模型时代的银行AI中…

前端必须掌握的HTML知识

前端开发者必须掌握的HTML知识包括&#xff1a; HTML基础语法&#xff1a;HTML标签、属性、值等基础语法。 HTML文档结构&#xff1a;HTML文档的基本结构&#xff0c;包括、、等标签的使用。 HTML元素&#xff1a;常用的HTML元素&#xff0c;如文本元素、图像元素、链接元素、…

【有奖调研】互联网新型社交,华为在找“元服务搭子”,快来集合!

“聊技术无话不谈&#xff0c;一起来吹吹元服务&#xff01;畅聊你对元服务的想法&#xff0c;说不定&#xff0c;你就能撬动元服务的爆发增长&#xff01;” 元服务&#xff08;即原子化服务&#xff09;是华为“轻量化”服务的新物种&#xff0c;可提供全新的服务和交互方式…

【C++】 STL(上)STL简述、STL容器

文章目录 简述STL容器list链表vector向量deque双端队列map映射表set集合hash_map哈希表 简述 STL是“Standard Template Library”的缩写&#xff0c;中文译为“标准模板库”。STL是C标准库的一部分&#xff0c;位与各个C的头文件中&#xff0c;即他并非以二进制代码的形式提供…

【Linux】解决Linux无法联网的一个小问题

今天使用在虚拟机VMware中使用Linux系统&#xff08;Centos7&#xff09;的时候&#xff0c;发现不能联网&#xff0c;找了很多办法也没有解决&#xff0c;甚至重新安装也没有解决&#xff0c;后来想起之前的解决方案。 要在任务管理器中打开&#xff0c;VMware的网络管理。

量子 金融,将改变游戏规则?

光子盒研究院 前言&#xff1a;如今&#xff0c;量子技术早已走出实验室、广泛赋能电力、化学、医学等各个领域&#xff1b;创新赛道上&#xff0c;加速奔跑的量子产业&#xff0c;将带来无限可能。现在&#xff0c;光子盒特开启「量子」专栏&#xff0c;一一解读量子技术将为下…

简易实现无缝切换自动轮播

原理 页面中设置一个父盒子 bannerBox&#xff0c;固定宽高&#xff0c;相当于一个窗口&#xff0c;超出部分隐藏bannerBox 内部设置一个图片盒子 imgBox&#xff0c;横向&#xff08;或纵向&#xff09;依次排列图片添加定时器&#xff0c;每隔一段时间&#xff0c;imgBox 向…

解决使用html标签自定义的按钮点击时有背景底色的问题

问题描述 如下图所示&#xff0c;点击按钮的瞬间&#xff0c;元素底部会出现一个背景色 解决方法 在点击产生背景色的元素的css样式上加上以下代码&#xff1a;-webkit-tap-highlight-color: transparent;

《Unix环境高级编程》/bin/sh: ./fixup.awk: Permission denied

我的代码是从http://www.apuebook.com/code3e.html下载的&#xff0c;先是在 使用cat /etc/redhat-release看到操作系统是CentOS Linux 7.6&#xff0c;使用uname -r看到内核是3.10.0-957.el7.x86_64。 在代码顶级目录下&#xff0c;执行make。 发现报错&#xff1a; ./fi…

软件测试-基础

目录 软件测试的生命周期 如何描述bug 定义bug的级别 bug的生命周期 如何发现更多的bug 软件测试的生命周期 软件测试的生命周期包括: 需求分析->测试计划->测试设计,测试开发->测试执行->测试评估 需求分析:测试人员了解需求,分析需求是否完整,是否正确合…

idea git项目错乱显示多个git项目记录

在项目的.idea文件夹下找到vcs.xml 删除无用的mapping&#xff0c;例如上图&#xff0c;删除…/的目录即可