MATLAB代码|蚁群算法|计算二元函数最小值

总述

给了一个蚁群算法,使用MATLAB编程,程序只有一个m文件,便于调试和运行。蚁群优化求函数最小值,在定义域内分布若干个蚂蚁,通过蚁群寻优,获得:

  • 函数在定义域内的最小值,以及:
  • 取到最小值时,自变量的取值

函数形式

待求最小值函数的形式如下:
f ( x ) = x 4 − 0.2 ∗ c o s ( 3 x ⋅ π ) + 0.6 f(x) = x^4 - 0.2 * cos(3x\cdot\pi) + 0.6 f(x)=x4−0.2∗cos(3x⋅π)+0.6

可以根据实际情况修改。

本程序在以上函数、-1~1这段区间内求函数最小值、取最小值时的自变量x取值。

程序运行结果

初始时刻蚁群的分布情况:

优化后的蚁群的分布情况:

根据优化后的蚁群分布,求解最小值为0.4,当x=-0.04263时取到最小值0.415735.

根据实际直观感受,真实值应该为0.4,精度达到 ( 0.415735 − 0.4 ) / 0.4 = 0.0393375 (0.415735-0.4)/0.4=0.0393375 (0.415735−0.4)/0.4=0.0393375,约4%的误差。

源代码

matlab 复制代码
% 蚁群求解一元函数最大值
% 2024-8-4/Ver1
clear;clc;close all;
rng(0);
Ants = 300; %蚂蚁数量
Times = 80; %仿真时长
Rou = 0.9;
P0 = 0.2;
x_lower = -1; %x轴范围下界
x_upper = 1; %x轴范围上界限

%% 随机生成蚁群位置
ant = zeros(Ants, 1);
for i = 1: Ants
    ant(i, 1) = x_lower + (x_upper - x_lower) * rand;
    Tau(i) = F(ant(i, 1));  % 信息素
end

step = 0.05; %网格密度
f = '(x.^4 - 0.2 * cos(3 * pi * x)  + 0.6)';
%% 画图
x= x_lower:step:x_upper;
z = eval(f);
figure;
plot(x,z)
hold on;
plot(ant(:, 1), Tau, 'k*');
fprintf('程序源代码下载链接:https://gf.bilibili.com/item/detail/1105978012');
title('函数形状与初始状态的粒子分布情况');

代码修改指南

下图中的step是定义域内,自变量的取值密度,step越小越精准,相应的计算时间会变长

f和后面的函数F存放待求函数:

将其修改成自己想要的程序以后,可以获得自己想要的值。

定义域修改这里:

如图,即为定义域在-1~1这段范围内,修改起来简单,不做赘述

相关推荐
海棠一号4 分钟前
JAVA理论第五章-JVM
java·开发语言·jvm
草莓熊Lotso33 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM39 分钟前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
海的诗篇_1 小时前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
CV点灯大师1 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl1 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
cccc来财1 小时前
Go中的协程并发和并发panic处理
开发语言·后端·golang
狐凄1 小时前
Python实例题:Python计算线性代数
开发语言·python·线性代数
武子康1 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting
武子康1 小时前
大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现
大数据·人工智能·算法·机器学习·ai·spark-ml·boosting