前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Matlab代码】蚁群算法解得最小值

【Matlab代码】蚁群算法解得最小值

作者头像
裴来凡
发布于 2022-05-28 07:04:45
发布于 2022-05-28 07:04:45
86500
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

clc;
clear;
f = inline('20 + x.^2 + y.^2 -10*(cos(2*pi*x) + cos(2*pi*y))');
x = -5:0.01:5;
y = -5:0.01:5;
[X,Y] = meshgrid(x,y);
F = f(X,Y);
figure(1);
mesh(X,Y,F);
xlabel('横坐标x'); ylabel('纵坐标y'); zlabel('空间坐标z');
hold on;
lower_x = -5;
upper_x = 5;
lower_y = -5;
upper_y = 5; 
ant = 1000;    
times = 300;   
rou = 0.9;     
p0 = 0.2;      
ant_x = zeros(1,ant);  
ant_y = zeros(1,ant);  
tau = zeros(1,ant);    
Macro = zeros(1,ant); 
for i=1:ant
    ant_x(i) = (upper_x-lower_x)*rand() + lower_x;
    ant_y(i) = (upper_y-lower_y)*rand() + lower_y;
    tau(i) = f(ant_x(i),ant_y(i));          
    % plot3(ant_x(i),ant_y(i),tau(i),'k*'); 
    hold on;
    Macro = zeros(1,ant);
end
fprintf('蚁群搜索开始(找最小值,绿色):\n');
T = 1;
trap = 0; 
tau_best = zeros(1,times);  
p = zeros(1,ant);   
while T < times
    lamda = 1/T;
    [tau_best(T),bestindex] = min(tau);
    plot3(ant_x(bestindex), ant_y(bestindex), f(ant_x(bestindex),ant_y(bestindex)), 'r*');
    hold on;
    for i = 1:ant
        p(i) = (tau(bestindex) - tau(i))/tau(bestindex); 
    end
    for i = 1:ant
        if p(i) < p0
            tempx = ant_x(i) + 0.5*(2*rand-1)*lamda;  
            tempy = ant_y(i) + 0.5*(2*rand-1)*lamda;
        else
            tempx = ant_x(i) + (upper_x-lower_x)*(rand-2.5);  % 5/2=2.5
            tempy = ant_y(i) + (upper_y-lower_y)*(rand-2.5);
        end
        if tempx < lower_x
            tempx = lower_x;
        end
        if tempx > upper_x
            tempx = upper_x;
        end
        if tempy < lower_y
            tempy = lower_y;
        end
        if tempy > upper_y
            tempy = upper_y;
        end
        if f(tempx,tempy) < tau(i)
            ant_x(i) = tempx;
            ant_y(i) = tempy;
            Macro(i) = f(tempx,tempy);
        end
    end
    for i = 1:ant
        tau(i) = (1-rou)*tau(i) + Macro(i);
    end
    T = T + 1;
    if T >= times
        fprintf('蚁群搜索到的最小值点:(%.5f,%.5f,%.5f)\n',...
        ant_x(bestindex), ant_y(bestindex), f(ant_x(bestindex),ant_y(bestindex)));
        fprintf('搜索次数:%d\n',T)
        if f(ant_x(bestindex),ant_y(bestindex)) > 0.8
            trap = trap + 1;  % 进入陷阱次数+1
            fprintf('发生大概率事件: 陷入局部极小值,自动再次执行程序!\n\n')
            T = 1;  
            tau_best = zeros(1,times);
            p = zeros(1,ant);
            for i=1:ant
                ant_x(i) = (upper_x-lower_x)*rand() + lower_x;
                ant_y(i) = (upper_y-lower_y)*rand() + lower_y;
                tau(i) = f(ant_x(i),ant_y(i));        
                Macro = zeros(1,ant);
            end
        end
    end
end
hold on;
trap = trap + 1;  
syms x y;
f = 20 + x^2 + y^2 -10*(cos(2*pi*x) + cos(2*pi*y));
fx = diff(f,x);
fy = diff(f,y);
acc = 0.0001;          
study_step = 0.001;    
x = ant_x(bestindex); 
y = ant_y(bestindex);
k = 0; 
fprintf('走出局部极值,梯度下降精确搜索开始(黄线):\n');
while eval(fx)~=0 | eval(fy)~=0 
 ans_tmp = [x,y] - study_step*[eval(fx),eval(fy)];
 acc_tmp = sqrt((ans_tmp(1)-x)^2 + (ans_tmp(2)-y)^2);
 if acc_tmp <= acc
 fprintf('精确极值坐标为:(%.5f,%.5f,%.5f)\n',ans_tmp(1),ans_tmp(2),f_tmp);
        fprintf('迭代次数:%d\n\n',k);
        plot3(ans_tmp(1),ans_tmp(2),f_tmp,'y.');
        hold off
 break;
 end
 x = ans_tmp(1);
 y = ans_tmp(2);
 f_tmp = eval(f);
    plot3(x,y,f_tmp,'y.')
    hold on;
    k = k + 1;  
end
if trap > 0
    fprintf('本模型走出陷阱概率:%.1f%%\n',1/trap*100);
end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图像处理与模式识别研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Matlab代码】蚁群算法解得最大值
clc; clear; f = inline('2.4-(x.^4 + 3*y.^4 - 0.2*cos(3*pi*x) - 0.4*cos(4*pi*y) + 0.6)'); x = -1:0.001:1; y = -1:0.001:1; [X,Y] = meshgrid(x,y); F = f(X,Y); figure(1); mesh(X,Y,F); xlabel('横坐标x'); ylabel('纵坐标y'); zlabel('空间坐标z'); hold on; lower_x = -1; upp
裴来凡
2022/05/28
8420
【Matlab代码】蚁群算法解得最大值
蚁群算法(ACO)MATLAB实现
蚁群算法(ant colony optimization)最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,据此提出了基于信息正反馈原理的蚁群算法。
里克贝斯
2021/05/21
1.3K0
蚁群算法(ACO)MATLAB实现
【Matlab代码】共轭梯度下降和阻尼牛顿下降两种算法解得极值
clc; clear; syms x y r; f = (x+y)^2 + (x+1)^2 + (y+3)^2; syms x_tmp y_tmp; f_tmp = (x_tmp+y_tmp)^2 + (x_tmp+1)^2 + (y_tmp+3)^2; fx = diff(f,x); fy = diff(f,y); grad_f1 = [fx,fy]'; x = -20:0.1:20; y = -15:0.1:15; [X,Y] = meshgrid(x,y); Z = (X+Y).^2 + (X
裴来凡
2022/05/28
3320
【Matlab代码】共轭梯度下降和阻尼牛顿下降两种算法解得极值
蚁群算法和简要matlab来源
从1991由意大利学者 M. Dorigo,V. Maniezzo 和 A. Colorni 通过模拟蚁群觅食行为提出了一种基于群体的模拟进化算法——蚁群优化。极大关注,蚁群算法的特点:
全栈程序员站长
2022/07/18
6320
蚁群算法求函数最大值一
ants = initant(Ant, xl, xu, yl, yu); % 初始化蚁群
mwangblog
2018/12/10
2.1K0
蚁群算法求函数最大值一
蚁群算法 matlab程序(已执行)
下面是解放军信息project大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处。
全栈程序员站长
2021/12/16
4250
蚁群算法规划路径
蚁群算法可以用于路径规划,在本例中,地形矩阵用0表示无障碍物、用1表示有障碍物,机器人从1x1处走到10x10处,使用蚁群算法找最短路径。
mwangblog
2018/12/12
2.3K0
蚁群算法规划路径
蚁群算法(ACO)最短路径规划(MATLAB)
蚁群算法最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,据此提出了基于信息正反馈原理的蚁群算法。
里克贝斯
2021/05/21
2.5K0
蚁群算法(ACO)最短路径规划(MATLAB)
蚁群算法求函数最大值二
functionsants = edgeselection(ants, tau, P0, lamda, xl, xu, yl, yu)
mwangblog
2018/12/10
1.3K0
GPS/INS组合导航系统 的matlab代码分析
此行代码将名为 “ceshi.txt” 的文本文件中的数据导入到 MATLAB 中,并存储在变量 data 中,以便进行后续处理。
全栈若城
2024/02/29
3820
蚁群算法解决旅行商(TSP)问题
在更新信息素的过程中,只有最优路线上的信息素会进行增加操作,且不能超过信息素最大值。
mwangblog
2018/12/13
2.3K0
干货|十分钟快速get蚁群算法(附代码)
之前分享了TSP的动态规划解法,本期来介绍它的另一种解法——蚁群算法。 什么?不知道?次元壁?高大上? 小编接下来这套 素质三连 攻略三连 会帮你十分钟快速搞定蚁群算法是什么、怎么用、注意啥,从零开始突破次元壁!!! * 内容提要: *什么是蚁群算法 *蚁群算法演练 *算法补充笔记 什么是蚁群算法? 蚁群系统(Ant System(AS)或Ant Colony System(ACS))是由意大利学者Dorigo、Maniezzo等人于20世纪90年代首先提出来的。他们在研究蚂蚁觅
用户1621951
2018/04/19
25.6K1
干货|十分钟快速get蚁群算法(附代码)
蚁群算法
蚁群觅食过程中,每只蚂蚁在所走过的路径上均会释放出一种信息素,该信息素随时间的推移逐渐挥发。因此,每条路径上的信息素同时存在正负反馈两种机制。正反馈:蚂蚁每次经过该路径均会释放信息素使得该路径上的信息素浓度增加;负反馈:每条路径上的信息素随时间推移会逐渐挥发。由此,我们可以判断,在起点与终点之间,当相同数量的蚂蚁初始同时经过两条不同的路径时,路径上初始信息素的浓度是相同的;不过,当路径越短时,信息素挥发时间也越短,残留信息素浓度也将越高。随后的蚂蚁将根据路径上残留信息素浓度的大小对路径进行选择 --- 浓度越高,选择概率越大。最终导致信息素浓度越高的路径上蚂蚁的选择数目越多,而更多的蚂蚁也将同时导致该路径上残留信息素浓度越高(即高者越高,低者越低)。因此,在理想情况下,整个蚁群将逐渐向信息素浓度最高的路径(即最短路径)进行转移。
用户3577892
2020/06/12
1.2K0
遗传算法的matlab代码_遗传算法实际应用
(1)初始化。设置进化代数计数器 \(g=0\),设置最大进化代数 \(G\),随机生成 \(NP\) 个个体作为初始群体 \(P(0)\)。
全栈程序员站长
2022/10/01
1.8K0
遗传算法的matlab代码_遗传算法实际应用
逐渐增加样本训练模型实现误差最小且误差值接近1.41%的最小P(误差)值。
Q1_final.m clear all; close all; clc; %% Set-Up: given parameters and validation data % Given parameters n = 2; % number of feature dimensions N_train = [10;100;1000]; % number of training samples N_val = 10000; % nu
裴来凡
2022/05/28
9440
逐渐增加样本训练模型实现误差最小且误差值接近1.41%的最小P(误差)值。
用遗传算法求函数最大值三:主程序和结果
主程序 主程序如下: clear clc popsize = 30; % 种群规模chromlength = 10; % 染色体长度pc = 0.5; % 交叉概率pm = 0.05; % 变异概率maxgen = 20; % 最大迭代数lx = 5; ux = 10; bestfit = zeros(1, maxgen); bestobjvalue = z
mwangblog
2018/10/18
5440
利用matlab实现非线性拟合(补)
之前在群里看有人问过三维拟合的问题。回去思考了一下,感觉和之前的非线性拟合还是有很多共同之处的。所以,这次将之前PSO方法的非线性拟合代码改动了一下,将其更改为适用性更广的高维拟合。
巴山学长
2021/05/08
1.6K0
利用matlab实现非线性拟合(补)
蚁群算法(ACO)旅行商问题(TSP)路径规划MATLAB实现
蚁群算法(ant colony optimization)最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,据此提出了基于信息正反馈原理的蚁群算法。
里克贝斯
2021/05/21
2.4K0
蚁群算法(ACO)旅行商问题(TSP)路径规划MATLAB实现
差分进化算法(DE)求函数最小值
差分进化算法求函数 Z = 3 * cos(X .* Y) + X + Y , -4 <= X <= 4, -4 <= Y <= 4。
mwangblog
2018/11/30
1.9K0
差分进化算法(DE)求函数最小值
基于量子遗传的函数寻优算法MATLAB实现
量子遗传算法就是基于量子计算原理的一种遗传算法。将量子的态矢量表达引入了遗传编码,利用量子逻辑门实现染色体的演化,实现了比常规遗传算法更好的效果。
里克贝斯
2021/05/21
8780
基于量子遗传的函数寻优算法MATLAB实现
相关推荐
【Matlab代码】蚁群算法解得最大值
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文