1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
爬山法是一种优化算法,其一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)。假定所求问题有多个参数,我们在通过爬山法逐步获得最优解的过程中可以依次分别将某个参数的值增加或者减少一个单位。
爬山法是指经过评价当前的问题状态后,限于条件去增加这一状态与目标状态的差异,经过迂回前进,最终达到解决问题的总目标。就如同爬山一样,为了到达山顶,有时不得不先上矮山顶,然后再下来,这样翻越一个个的小山头,直到最终达到山顶。可以说,爬山法是一种"以退为进"的方法,往往具有"退一步进两步"的作用,后退乃是为了更有效地前进。爬山法也叫逐个修改法、瞎子摸象法。
解多变量无约束最优化问题的一类方法。有的书上称直接法或直接搜索法,是通过点的直接移动产生的目标值有所改善的点,经过这样的移动,逐步到达使目标函数最优的点。如果我们把目标函数的几何图形看成一个山峰,那么点的直接移动就像人在爬山,选择方向,逐步向山顶移动。可分为轴向搜索法、单纯形调优法、Powell法等。轴向搜索法是以沿坐标轴方向移动为基础的搜索方法,在进行每一轮沿坐标轴方向搜索时,是从一参考点出发,依次沿平行于各个坐标轴方向连续作对应的目标函数值改进的搜索移动,并以最后获得的点作为下一轮迭代点。同时,为提高求解的效率.还要采取某些加快收敛的措施。
问题求解的过程就是努力沟通问题的起始状态和目标状态之间的联系链条,由起始状态出发,逐步向目标推移、逼近的过程。在思维课题的求解活动中,人们几乎总是一直关注着所要达到的最终目标,试图不断地向目标逼近。这就像在登山活动中运动员时刻把顶峰放在心目之中,力图接近它、占领它一样。在解决思维课题时,我们经常自觉或不自觉地运用着能够尽量向目标靠拢的方法。这也就是通常所说的爬山法。
爬山法与中途点法是彼此接近的方法。中途点法在实质上也就是通过一个个的中途点而向最终目标逼近的方法。同时,在问题求解活动中,这两种方法也是紧密相联.可以配合使用的。比如,有一个数学问题,要求决定两个量v,u之间的关系。我们可以把求出包含v,u的关系式(其中可以含有其他未知量)和求出只包含v,u和已知量的关系式作为两个中途点,把整个求解过程区分为三个小阶段。在每个小阶段中又可分别应用爬山法来进行试探。在第一阶段中,那些能够得出同时把v,u包括进去的关系式的步骤将被看做是较优的步骤;而能够得出既把v,u同时包含在内,又含有最少的其他未知量,并且显得比较简单.对其他未知量容易加以分离、代换和消除的关系式的步骤就是最优步骤。在第二阶段中,那些能够消除其他未知量个数最多的步骤将是最优步骤。把爬山法同中途点法结合起来运用,可以更好地发挥它们的作用。
3.MATLAB核心程序
improvement = 0;
iteration = iteration + 1;
trajectory1x(iteration) = A.position(1);
trajectory1y(iteration) = A.position(2);
trajectory2(iteration) = A.cost;
Neighbours = HC(A , stepSize, lb, ub);
for k = 1 : length(Neighbours)
B = Neighbours( k );
if B.cost > A.cost
improvement = 1;
A.cost = B.cost;
A.position = B.position;
end
end
end
figure
subplot(1,2,1)
x = lb(1):stepSize(1):ub(1);
y = lb(2):stepSize(2):ub(2);
[x_new , y_new] = meshgrid(x,y);
for i = 1: length(x)
for j = 1 : length(y)
X = [x_new(i,j) , y_new(i,j)];
z_new(i,j) = objectiveFunction(X);
end
end
surfc(x_new, y_new, z_new)
hold on
xlabel('p1')
ylabel('p2')
zlabel('cost')
shading interp
box on
for k = 1 : length(trajectory2);
traj_final_x(k) = trajectory1x(k);
traj_final_y(k) = trajectory1y(k);
traj_final_z(k) = trajectory2(k);
end
plot3(traj_final_x,traj_final_y,traj_final_z, 'g-', 'lineWidth' , 1)
plot3(initial(1),initial(2),cost_initial,'-bs',...
'LineWidth',1,...
'MarkerSize',8,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.0,0.0]);
plot3(traj_final_x(end),traj_final_y(end),traj_final_z(end),'-bs',...
'LineWidth',1,...
'MarkerSize',8,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.0,0.0]);
subplot(1,2,2)
hold on
pcolor(x_new, y_new, z_new)
view(0,90)
plot(traj_final_x,traj_final_y, 'g-', 'lineWidth' , 1)
plot(initial(1),initial(2),'-bs',...
'LineWidth',1,...
'MarkerSize',8,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.0,0.0]);
plot(traj_final_x(end),traj_final_y(end),'-bs',...
'LineWidth',1,...
'MarkerSize',8,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.0,0.0]);
shading interp
yy=trajectory2;
figure
plot(1:10:iteration,yy(1:10:iteration) ,'-bs',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.0,0.0]);
xlabel('Iteration')
ylabel('Cost')
x1=trajectory1x;
y1=trajectory1y;
figure
plot(1:10:iteration,x1(1:10:iteration) ,'-bs',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.0,0.0]);
hold on
plot(1:10:iteration,y1(1:10:iteration),'-r>',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.9,0.0]);
legend('X轴轨迹','Y轴轨迹');
xlabel('Iteration')
ylabel('轨迹')