群体优化算法----人工蜂群优化算法应用于路径规划(机器人避开平面障碍寻找最短路线)

本文主要是介绍群体优化算法----人工蜂群优化算法应用于路径规划(机器人避开平面障碍寻找最短路线),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

人工蜂群优化算法(Artificial Bee Colony Algorithm, ABC)是由Dervis Karaboga在2005年提出的一种模拟蜜蜂觅食行为的优化算法。该算法基于蜜蜂群体的分工合作和信息交流机制,通过模拟蜜蜂寻找食物源的过程来解决优化问题。ABC算法因其简单、灵活和有效的特点,被广泛应用于各类优化问题,如函数优化、数据挖掘、路径规划等

概念

ABC算法主要模拟了三类蜜蜂的行为:雇佣蜂、观察蜂和侦查蜂。

雇佣蜂(Employed Bees):负责在食物源附近进行局部搜索,并将食物源的信息传递给观察蜂。
观察蜂(Onlooker Bees):在蜂巢中通过观察雇佣蜂的舞蹈选择食物源进行进一步搜索。
侦查蜂(Scout Bees):负责在全局范围内随机搜索新的食物源,以替代那些被淘汰的食物源。

步骤

初始化:在搜索空间内随机生成若干个食物源(即解),并计算其适应度值。
雇佣蜂阶段:
每只雇佣蜂在其对应的食物源附近随机选择一个新的解。
计算新解的适应度值,如果新解优于当前解,则更新当前解。
观察蜂阶段:
观察蜂根据雇佣蜂的舞蹈(适应度值)选择食物源,进行局部搜索。
与雇佣蜂阶段类似,计算新解的适应度值并进行更新。
侦查蜂阶段:
对于那些长时间未被改进的食物源,由侦查蜂进行全局随机搜索,以寻找新的潜在食物源。
终止条件:重复上述步骤直到满足终止条件(如达到最大迭代次数或满足精度要求)。

本文示例

模拟了机器人在一个二维平面内的路径规划问题,目标是找到一条最优路径,使得机器人能够从起点移动到终点,避开障碍物

路径规划问题定义

假设一个二维平面中有若干障碍物,机器人需要从起点(Start)移动到终点(Goal),避开所有障碍物,找到一条最短路径

代码

clc;
clear;% 参数设置
numBees = 50; % 蜂群规模(食物源数量)
maxIter = 1000; % 最大迭代次数
limit = 100; % 限制参数,用于判断是否需要启用侦查蜂
dim = 2; % 问题维度
numObstacles = 10; % 障碍物数量
mapSize = [100, 100]; % 地图大小% 起点和终点位置
startPoint = [10, 10];
endPoint = [90, 90];% 障碍物位置
obstacles = rand(numObstacles, 2) .* repmat(mapSize, numObstacles, 1);% 初始化食物源
foodSources = rand(numBees, dim) .* repmat(mapSize, numBees, 1);
fitness = calculateFitness(foodSources, startPoint, endPoint, obstacles, mapSize);
trials = zeros(numBees, 1);% 绘制地图
figure;
hold on;
axis([0 mapSize(1) 0 mapSize(2)]);
plot(startPoint(1), startPoint(2), 'go', 'MarkerSize', 10, 'MarkerFaceColor', 'g');
plot(endPoint(1), endPoint(2), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');
for i = 1:numObstaclesplot(obstacles(i, 1), obstacles(i, 2), 'ks', 'MarkerSize', 10, 'MarkerFaceColor', 'k');
end% 主循环
for iter = 1:maxIter% 雇佣蜂阶段for i = 1:numBeesk = randi([1, dim]);phi = rand * 2 - 1;newSolution = foodSources(i, :);newSolution(k) = foodSources(i, k) + phi * (foodSources(i, k) - foodSources(randi([1, numBees]), k));newFitness = calculateFitness(newSolution, startPoint, endPoint, obstacles, mapSize);if newFitness < fitness(i)foodSources(i, :) = newSolution;fitness(i) = newFitness;trials(i) = 0;elsetrials(i) = trials(i) + 1;endend% 观察蜂阶段prob = fitness / sum(fitness);for i = 1:numBeesif rand < prob(i)k = randi([1, dim]);phi = rand * 2 - 1;newSolution = foodSources(i, :);newSolution(k) = foodSources(i, k) + phi * (foodSources(i, k) - foodSources(randi([1, numBees]), k));newFitness = calculateFitness(newSolution, startPoint, endPoint, obstacles, mapSize);if newFitness < fitness(i)foodSources(i, :) = newSolution;fitness(i) = newFitness;trials(i) = 0;elsetrials(i) = trials(i) + 1;endendend% 侦查蜂阶段for i = 1:numBeesif trials(i) > limitfoodSources(i, :) = rand(1, dim) .* mapSize;fitness(i) = calculateFitness(foodSources(i, :), startPoint, endPoint, obstacles, mapSize);trials(i) = 0;endend% 绘制当前最优路径[bestFitness, bestIndex] = min(fitness);bestSolution = foodSources(bestIndex, :);plotPath(startPoint, bestSolution, endPoint, obstacles);drawnow;
end% 计算适应度函数
function fitness = calculateFitness(solutions, startPoint, endPoint, obstacles, mapSize)numSolutions = size(solutions, 1);fitness = zeros(numSolutions, 1);for j = 1:numSolutionssolution = solutions(j, :);path = [startPoint; solution; endPoint];pathLength = 0;for i = 1:(size(path, 1) - 1)pathLength = pathLength + norm(path(i, :) - path(i + 1, :));endfor i = 1:size(obstacles, 1)if min(sqrt(sum((path - obstacles(i, :)).^2, 2))) < 5pathLength = pathLength + 10000; % 惩罚因子endendfitness(j) = pathLength;end
end% 绘制路径
function plotPath(startPoint, solution, endPoint, obstacles)path = [startPoint; solution; endPoint];plot(path(:, 1), path(:, 2), 'b-o');plot(startPoint(1), startPoint(2), 'go', 'MarkerSize', 10, 'MarkerFaceColor', 'g');plot(endPoint(1), endPoint(2), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');for i = 1:size(obstacles, 1)plot(obstacles(i, 1), obstacles(i, 2), 'ks', 'MarkerSize', 10, 'MarkerFaceColor', 'k');end
end

效果

在这里插入图片描述

说明

初始化部分:

设置蜂群规模、最大迭代次数等参数。
定义地图大小、起点和终点的位置,以及障碍物的位置。
初始化食物源(即路径中的中间点)和计算初始适应度。

主循环部分:
雇佣蜂阶段:雇佣蜂在当前食物源附近进行局部搜索,并根据适应度值决定是否更新食物源。
观察蜂阶段:观察蜂根据雇佣蜂的舞蹈(适应度值)选择食物源进行进一步搜索。
侦查蜂阶段:对长时间未被改进的食物源进行全局随机搜索,以寻找新的潜在食物源。
实时绘制当前最优路径,以便观察算法的收敛过程。

适应度函数:
计算路径的总长度作为适应度值,同时对路径经过障碍物的情况进行惩罚,以避免路径穿越障碍物。

路径绘制:
绘制当前最优路径、起点、终点和障碍物,以便观察路径规划的效果

这篇关于群体优化算法----人工蜂群优化算法应用于路径规划(机器人避开平面障碍寻找最短路线)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029443

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease