💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
【多机器人路径规划】基于多策略自适应差分正余弦算法多机器人路径规划研究
摘要
随着机器人技术的不断发展,多机器人系统在各种应用场景中显示出巨大的潜力。然而,多机器人路径规划问题一直是研究的难点,特别是在复杂环境中,机器人需要避开静态和动态障碍物,同时完成指定的任务。传统的正弦-余弦算法(SCA)在路径规划问题中表现出一定的局限性,主要因为其单一的更新策略导致解的质量不高。为了克服这一限制,我们提出了一种新的多策略自适应差分正弦-余弦算法(sdSCA),该算法通过引入多种更新策略和自适应机制,显著提高了路径规划问题的求解效率和解的质量。
1. 引言
最近,研究人员使用各种元启发式算法进行了多机器人路径规划的研究。其中一种算法,正弦-余弦算法(SCA),由于单一的更新策略,在路径规划问题中无法产生令人满意的结果。有必要采用多种更新策略,并提高其性能,以解决更广泛的问题。我们提出了一种新的多策略自适应差分正弦-余弦算法(sdSCA),该算法使用一组策略,并允许更频繁地选择策略,从而获得更好的解决方案。因此,SCA对单一策略的依赖性已被消除,它已成为更广泛的问题的更稳定的选择,并且SCA的收敛性得到了改善。首先,在CEC2015基准函数和CEC2020现实优化问题中测试了sdSCA的有效性。sdSCA在这些测试中的表现令人满意。其次,sdSCA被应用于具有静态和动态障碍物的复杂环境中的在线多机器人路径规划。在该路径规划模拟中,与SCA相比,所提出的算法平均提高了42%。它似乎也产生了优于最先进的元启发式算法的结果。
多机器人路径规划是一个复杂的优化问题,涉及多个机器人、障碍物和目标点之间的空间和时间关系。近年来,元启发式算法因其强大的全局搜索能力和灵活性,在多机器人路径规划领域得到了广泛应用。然而,现有的算法如SCA在解决这类问题时仍存在不足,特别是在面对复杂环境和动态变化时。因此,开发一种更高效、更稳定的算法对于推动多机器人系统的应用具有重要意义。
2. 正弦-余弦算法(SCA)概述
SCA是一种基于正弦和余弦函数的元启发式算法,通过模拟正弦和余弦波的运动来更新解的位置。然而,SCA的单一更新策略限制了其在复杂问题中的性能。
3. 多策略自适应差分正弦-余弦算法(sdSCA)
为了克服SCA的局限性,我们提出了sdSCA算法。该算法的主要创新点包括:
- 多种更新策略:引入多种更新策略,使算法能够根据不同的搜索阶段和问题特性选择最合适的策略。
- 自适应机制:通过自适应调整策略的选择频率和参数,提高算法的收敛速度和解的质量。
- 差分进化:结合差分进化算法的思想,通过引入差分变异操作,增强算法的局部搜索能力。
4. 实验验证
为了验证sdSCA算法的有效性,我们进行了以下实验:
- 基准函数测试:在CEC2015基准函数和CEC2020现实优化问题上测试了sdSCA的性能,结果表明sdSCA在大多数情况下优于SCA和其他元启发式算法。
- 多机器人路径规划模拟:在具有静态和动态障碍物的复杂环境中进行了在线多机器人路径规划模拟。实验结果表明,与SCA相比,sdSCA在平均路径长度、碰撞次数和完成时间等方面均有显著提高(平均提高了42%)。此外,sdSCA还表现出优于其他最先进的元启发式算法的性能。
5. 结论与展望
本研究提出了一种新的多策略自适应差分正弦-余弦算法(sdSCA),用于解决多机器人路径规划问题。实验结果表明,sdSCA在复杂环境中具有优异的性能,显著提高了路径规划的质量和效率。未来,我们将进一步探索sdSCA在更多应用场景中的潜力,并优化算法参数和策略选择机制,以进一步提高其性能。
📚2 运行结果
部分代码:
% data of scenario 1
% ===================================================================
totalRobot = 6; % number of robot
robotRadius = ones(1, totalRobot); % radius of robot
robotStart.x = [5 25 45 95 85 95]; % start positions (x) of robots
robotStart.y = [95 10 75 95 40 5]; % start positions (y) of robots
robotGoal.x = [40 25 10 65 40 65]; % goal positions (x) of robots
robotGoal.y = [13 97 55 15 40 75]; % goal positions (y) of robots
totalStatic = 7; % number of static obstacles
staticRadius = [4 3 3 5 4 5 3]; % radius of static obstacles
static.x = [10 25 25 40 35 75 85]; % positions (x) of static obstacles
static.y = [80 90 30 65 25 40 15]; % positions (y) of static obstacles
totalDynamic = 3; % number of dynamic obstacles
dynamicRadius = 1.5 * ones(1, totalDynamic); % radius of dynamic obstacles
dynamicStart.x = [15 55 75]; % start positions (x) of dynamic obstacles
dynamicStart.y = [40 20 90]; % start positions (y) of dynamic obstacles
dynamicGoal.x = [35 50 95]; % goal positions (x) of dynamic obstacles
dynamicGoal.y = [85 50 75]; % goal positions (y) of dynamic obstacles
dynamicVelocity = [0.5 0.45 1.2]; % velocities of dynamic obstacles
axisParameter = 100; % visualization scale (100 x 100)
% ===================================================================
% initial visualization
% ===================================================================
alpha = linspace(0, 2*pi, 100);
set(gcf, 'WindowState', 'maximized');
plt1 = plot(-7,-7,'o','MarkerFaceColor',[0.5 0.5 0.5],'MarkerEdgeColor','k','MarkerSize',12);
hold on;
plt2 = plot(-8,-8,'o','MarkerFaceColor',[0.5 0.7 0.8],'MarkerEdgeColor','k','MarkerSize',12);
plt3 = plot(-9,-9,'o','MarkerFaceColor',[0.1 0.2 0.9],'MarkerEdgeColor','k','MarkerSize',12);
for i = 1 : totalStatic
fill(static.x(i) + staticRadius(i) * cos(alpha), static.y(i) + staticRadius(i) * sin(alpha), [0.5 0.5 0.5]);
end
for i = 1 : totalRobot
plt11(i) = fill(robotStart.x(i) + robotRadius(i) * cos(alpha), robotStart.y(i) + robotRadius(i) * sin(alpha), [0.5 0.7 0.8]);
plt4 = plot(robotGoal.x(i), robotGoal.y(i),'x','MarkerFaceColor','k','MarkerEdgeColor','k','MarkerSize',10,'LineWidth',2);
plt5 = line([robotStart.x(i) robotGoal.x(i)], [robotStart.y(i) robotGoal.y(i)],'Color','black','LineStyle','--');
end
for i = 1 : totalDynamic
plt12(i) = fill(dynamicStart.x(i) + dynamicRadius(i) * cos(alpha), dynamicStart.y(i) + dynamicRadius(i) * sin(alpha), [0.1 0.2 0.9]);
plt6 = plot(dynamicGoal.x(i), dynamicGoal.y(i),'x','MarkerFaceColor','b','MarkerEdgeColor','b','MarkerSize',10,'LineWidth',2);
plt7 = line([dynamicStart.x(i) dynamicGoal.x(i)], [dynamicStart.y(i) dynamicGoal.y(i)],'Color','blue','LineStyle','--');
end
axis equal;
axis([-5 (axisParameter+5) 0 (axisParameter)]);
pause(1);
% ===================================================================
% ideal path distance of robots
% ===================================================================
for i = 1 : totalRobot
ideal_distance(i) = sqrt( ( robotStart.x(i) - robotGoal.x(i) )^2 + ( robotStart.y(i) - robotGoal.y(i) )^2 );
end
% ===================================================================
% optimization control parameters
% ===================================================================
costFunction = @cost_function;
maximumFitness = 1000;
populationSize = 30;
dimension = 2 * totalRobot;
minimumVelocity = 1;
maximumVelocity = 1.5;
minimumTheta = 0;
maximumTheta = 2*pi;
% ===================================================================
% path planning initial setting
% ===================================================================
step = 1;
robotOld.x = robotStart.x;
robotOld.y = robotStart.y;
robotPath.x = [robotOld.x];
robotPath.y = [robotOld.y];
dynamicOld.x = dynamicStart.x;
dynamicOld.y = dynamicStart.y;
dynamicPath.x = [dynamicOld.x];
dynamicPath.y = [dynamicOld.y];
robot_step = zeros(1, totalRobot);
robot_distance = zeros(1, totalRobot);
% ===================================================================
% distances to goals of robots
% ===================================================================
for i = 1 : totalRobot
distanceToGoal(i) = sqrt( ( robotOld.x(i) - robotGoal.x(i) )^2 + ( robotOld.y(i) - robotGoal.y(i) )^2 );
end
stoppingCriteria = max(distanceToGoal);
% ===================================================================
% main loop
% ===================================================================
tic;
while stoppingCriteria > 1
% The robot and dynamic obstacle in the relevant step are deleted so that they are not drawn on top of each other
% ===================================================================
delete(plt11);
delete(plt12);
% ===================================================================
% optimization loop (original SCA)
% ===================================================================
% title('SCA');
% [bestSol, bestCost] = original_sca(maximumFitness, ...
% populationSize, ...
% dimension, ...
% maximumVelocity, ...
% minimumVelocity, ...
% minimumTheta, ...
% maximumTheta, ...
% robotOld, ...
% dynamicOld, ...
% totalRobot, ...
% robotRadius, ...
% robotGoal, ...
% totalStatic, ...
% staticRadius, ...
% static, ...
% totalDynamic, ...
% dynamicRadius, ...
% costFunction);
% ===================================================================
% optimization loop (our proposed sdSCA)
% ===================================================================
title('sdSCA');
[bestSol, bestCost] = proposed_sdsca(maximumFitness, ...
populationSize, ...
dimension, ...
maximumVelocity, ...
minimumVelocity, ...
minimumTheta, ...
maximumTheta, ...
robotOld, ...
dynamicOld, ...
totalRobot, ...
robotRadius, ...
robotGoal, ...
totalStatic, ...
staticRadius, ...
static, ...
totalDynamic, ...
dynamicRadius, ...
costFunction);
% ===================================================================
% total cost
% ===================================================================
cost(step) = bestCost;
% ===================================================================
% motions of robots
% ===================================================================
for i = 1 : totalRobot
bestSol(2*i) = interp1( [minimumVelocity, maximumVelocity], [minimumTheta, maximumTheta], bestSol(2*i) );
distanceToGoal(i) = sqrt( ( robotOld.x(i) - robotGoal.x(i) )^2 + ( robotOld.y(i) - robotGoal.y(i) )^2 );
if distanceToGoal(i) > 1
robotNew.x(i) = robotOld.x(i) + bestSol((2*i)-1) * cos(bestSol(2*i));
robotNew.y(i) = robotOld.y(i) + bestSol((2*i)-1) * sin(bestSol(2*i));
robot_step(i) = robot_step(i) + 1;
robot_distance(i) = robot_distance(i) + sqrt( ( robotNew.x(i) - robotOld.x(i) )^2 + ( robotNew.y(i) - robotOld.y(i) )^2 );
ugd(robot_step(i), i) = sqrt( ( robotNew.x(i) - robotGoal.x(i) )^2 + ( robotNew.y(i) - robotGoal.y(i) )^2 );
end
% visualization
plt11(i) = fill( robotNew.x(i) + robotRadius(i) * cos(alpha), robotNew.y(i) + robotRadius(i) * sin(alpha), [0.5 0.7 0.8] );
line([robotOld.x(i) robotNew.x(i)],[robotOld.y(i) robotNew.y(i)],'Color','red','LineStyle','--');
end
% ===================================================================
% motion of dynamic obstacles
% ===================================================================
for i = 1 : totalDynamic
dynamicDistanceToGoal(i) = sqrt( ( dynamicOld.x(i) - dynamicGoal.x(i) )^2 + ( dynamicOld.y(i) - dynamicGoal.y(i) )^2 );
if dynamicDistanceToGoal(i) > 1
slope(i) = atan2( dynamicGoal.y(i) - dynamicOld.y(i) , dynamicGoal.x(i) - dynamicOld.x(i) );
dynamicNew.x(i) = dynamicOld.x(i) + dynamicVelocity(i) * cos(slope(i));
dynamicNew.y(i) = dynamicOld.y(i) + dynamicVelocity(i) * sin(slope(i));
end
% visualization
plt12(i) = fill( dynamicNew.x(i) + dynamicRadius(i) * cos(alpha), dynamicNew.y(i) + dynamicRadius(i) * sin(alpha), [0.1 0.2 0.9] );
end
pause(0.01);
% ===================================================================
% Updating positions and paths of robots and dynamic obstacles
% ===================================================================
robotOld.x = robotNew.x;
robotOld.y = robotNew.y;
robotPath.x = [robotPath.x; robotNew.x];
robotPath.y = [robotPath.y; robotNew.y];
dynamicOld.x = dynamicNew.x;
dynamicOld.y = dynamicNew.y;
dynamicPath.x = [dynamicPath.x; dynamicNew.x];
dynamicPath.y = [dynamicPath.y; dynamicNew.y];
% ===================================================================
% distances to goals of robots
% ===================================================================
for i = 1 : totalRobot
distanceToGoal(i) = sqrt( ( robotOld.x(i) - robotGoal.x(i) )^2 + ( robotOld.y(i) - robotGoal.y(i) )^2 );
end
stoppingCriteria = max(distanceToGoal);
% ===================================================================
% step count is increased by one
% ===================================================================
step = step + 1;
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
[1] Akay R , Yildirim M Y .Multi-strategy and self-adaptive differential sine-cosine algorithm for multi-robot path planning[J].Expert Systems with Application, 2023, 232(Dec.):120849.1-120849.19.
🌈4 Matlab代码实现
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取