c11225 2024-04-08 16:28 采纳率: 12.5%
浏览 94
已结题

如何绘制每一代值与迭代次数的图像,遗传算法,MATLAB

%%如何绘制每一代值与迭代次数的图像,遗传算法,MATLAB

objfun=@untitled471;
%自变量个数
n=4;
%A,b线性不等式约束
A=[ ];
b=[];
%Aed,bed线性等式约束
Aed=[];
bed=[];
%lb下限
lb=[200 5 100 10];
%上限
ub=[];
%非线性约束
confun=confun1;
%选项
opts=optimoptions(@ga);
%%种群个体数量(种群大小)
opts.PopulationSize=100;
opts.Display='iter';
opts.MaxGenerations=200;
opts.CrossoverFraction = 0.6;
%opts.EliteCount =20;
[x,fval]=ga(objfun,n,A,b,Aed,bed,lb,ub,confun,opts);
function [c, ceq] = confun1(x)
    %动平台位姿的选取
u1=-100:100:100;
u2=-100:100:100;
u3=500:100:600;
u4=-5:10:5;
u5=-5:10:5;
u6=-1:2:1;
P=[];

for i1=1:1:length(u1)
   for i2=1:length(u2)     
      for i3=1:length(u3)
          for i4=1:length(u4)
             for i5=1:length(u5)
                  for i6=1:length(u6)
                        PK=[u1(i1),u2(i2),u3(i3),u4(i4),u5(i5),u6(i6)];
                       P=cat(1, P, PK);
                  end
              end
          end
       end
   end
end
%%动平台位姿
for t=1:1:length(P)
X=P(t,1);  
Y=P(t,2);
Z=P(t,3);
l=P(t,4);  
m=P(t,5);
n=P(t,6);
p=[X,Y,Z];
%%动定点的位置
%%动平台LJD
p1=[x(1)*cosd(90-x(2)) x(1)*sind(90-x(2)) 0];
p2=[x(1)*cosd(90+x(2)) x(1)*sind(90+x(2)) 0];
p3=[x(1)*cosd(210-x(2)) x(1)*sind(210-x(2)) 0];
p4=[x(1)*cosd(210+x(2))  x(1)*sind(210+x(2)) 0];
p5=[x(1)*cosd(330-x(2))  x(1)*sind(330-x(2)) 0];
p6=[x(1)*cosd(330+x(2))  x(1)*sind(330+x(2)) 0];
%%定平台LJD
B1=[x(3)*cosd(30+x(4))  x(3)*sind(30+x(4)) 0];
B2=[x(3)*cosd(150-x(4)) x(3)*sind(150-x(4)) 0];
B3=[x(3)*cosd(150+x(4)) x(3)*sind(150+x(4)) 0];
B4=[x(3)*cosd(270-x(4)) x(3)*sind(270-x(4)) 0];
B5=[x(3)*cosd(270+x(4)) x(3)*sind(270+x(4)) 0];
B6=[x(3)*cosd(30-x(4))  x(3)*sind(30-x(4)) 0];


%RP = rotz(PZ) * roty(PY) * rotx(PX);% XYZ旋转矩阵
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
 cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
 -sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
%----------动平台的6个铰点,在静平台坐标系中的位置矢量---------------------
A1=RP*transpose(p1)+transpose(p);
A2=RP*transpose(p2)+transpose(p);
A3=RP*transpose(p3)+transpose(p);
A4=RP*transpose(p4)+transpose(p);
A5=RP*transpose(p5)+transpose(p);
A6=RP*transpose(p6)+transpose(p);
%--动平台的6个铰点位置矢量,减去,静平台的6个铰点位置矢量,得到每个杆长矢量
L1 = A1 -transpose(B1);
L2 = A2 -transpose(B2);
L3 = A3 -transpose(B3);
L4 = A4 -transpose(B4);
L5 = A5 -transpose(B5);
L6 = A6 -transpose(B6);
%%拉线单位矢量
n1 =L1/norm(L1);
n2 =L2/norm(L2);
n3 =L3/norm(L3);
n4 =L4/norm(L4);
n5 =L5/norm(L5);
n6 =L6/norm(L6);
    % 计算线长
 l1 = norm(L1);
 l2 = norm(L2);
 l3 = norm(L3);
 l4 = norm(L4);
 l5 = norm(L5);
 l6 = norm(L6);
 %%定平台与线向量角度
 v1=[0 0 1]';
 a1=rad2deg(acos(dot(v1, n1) / (norm(v1) * norm(n1))) );
  a2=rad2deg(acos(dot(v1, n2) / (norm(v1) * norm(n2))) );
   a3=rad2deg(acos(dot(v1, n3) / (norm(v1) * norm(n3))) );
    a4=rad2deg(acos(dot(v1, n4) / (norm(v1) * norm(n4))) );
     a5=rad2deg(acos(dot(v1, n5) / (norm(v1) * norm(n5))) );
      a6=rad2deg(acos(dot(v1, n6) / (norm(v1) * norm(n6))) );
      aa1=rad2deg(acos(dot(RP*v1, n1) / (norm(RP*v1) * norm(n1))) );
      aa2=rad2deg(acos(dot(RP*v1, n2) / (norm(RP*v1) * norm(n2))) );
      aa3=rad2deg(acos(dot(RP*v1, n3) / (norm(RP*v1) * norm(n3))) );
      aa4=rad2deg(acos(dot(RP*v1, n4) / (norm(RP*v1) * norm(n4))) );
      aa5=rad2deg(acos(dot(RP*v1, n5) / (norm(RP*v1) * norm(n5))) );
      aa6=rad2deg(acos(dot(RP*v1, n6) / (norm(RP*v1) * norm(n6))) );
      J=[n1  n2  n3  n4  n5  n6  ;
cross(RP*transpose(p1),n1)  cross(RP*transpose(p2),n2) cross(RP*transpose(p3),n3)  cross(RP*transpose(p4),n4)  cross(RP*transpose(p5),n5)  cross(RP*transpose(p6),n6)  ]';
    F=cond(J);
   %%c = [l1; l2; l3; l4; l5; l6] - 700;% 线长大于900的
     % 线长约束条件:100 < l1, l2, ..., l6 < 900
    % 计算线长
    % 线长约束条件
  %c = [l1; l2; l3; l4; l5; l6] - 800;  % 线长大于900的差
  % c = [c; -l1; -l2; -l3; -l4; -l5; -l6] + 100;
    c = [ a1; a2; a3; a4; a5; a6;]-45;
      c = [c;-F]+1;
    ceq = [];  % 暂无等式约束

end
end
function[w]=untitled471(x)
%动平台位姿的选取
u1=-100:100:100;
u2=-100:100:100;
u3=500:100:700;
u4=-10:10:10;
u5=-10:10:10;
u6=-10:10:10;
P=[];
for i1=1:1:length(u1)
   for i2=1:length(u2)     
      for i3=1:length(u3)
          for i4=1:length(u4)
             for i5=1:length(u5)
                 for i6=1:length(u6)
                        PK=[u1(i1),u2(i2),u3(i3),u4(i4),u5(i5),u6(i6)];
                       P=cat(1, P, PK);
                 end
              end
          end
       end
   end
end
TT=0;w=0;
for t=1:1:length(P)
X=P(t,1);  
Y=P(t,2);
Z=P(t,3);
l=P(t,4);  % 相对静平台的恣态
m=P(t,5);
n=P(t,6);
p=[X,Y,Z];
%%动定点的位置
%%动平台LJD
p1=[x(1)*cosd(90-x(2)) x(1)*sind(90-x(2)) 0];
p2=[x(1)*cosd(90+x(2)) x(1)*sind(90+x(2)) 0];
p3=[x(1)*cosd(210-x(2)) x(1)*sind(210-x(2)) 0];
p4=[x(1)*cosd(210+x(2))  x(1)*sind(210+x(2)) 0];
p5=[x(1)*cosd(330-x(2))  x(1)*sind(330-x(2)) 0];
p6=[x(1)*cosd(330+x(2))  x(1)*sind(330+x(2)) 0];
%%定平台LJD
B1=[x(3)*cosd(30+x(4))  x(3)*sind(30+x(4)) 0];
B2=[x(3)*cosd(150-x(4)) x(3)*sind(150-x(4)) 0];
B3=[x(3)*cosd(150+x(4)) x(3)*sind(150+x(4)) 0];
B4=[x(3)*cosd(270-x(4)) x(3)*sind(270-x(4)) 0];
B5=[x(3)*cosd(270+x(4)) x(3)*sind(270+x(4)) 0];
B6=[x(3)*cosd(30-x(4))  x(3)*sind(30-x(4)) 0];

%RP = rotz(PZ) * roty(PY) * rotx(PX);% XYZ旋转矩阵
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
 cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
 -sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
%----------动平台的6个铰点,在静平台坐标系中的位置矢量---------------------
A1=RP*transpose(p1)+transpose(p);
A2=RP*transpose(p2)+transpose(p);
A3=RP*transpose(p3)+transpose(p);
A4=RP*transpose(p4)+transpose(p);
A5=RP*transpose(p5)+transpose(p);
A6=RP*transpose(p6)+transpose(p);
%--动平台的6个铰点位置矢量,减去,静平台的6个铰点位置矢量,得到每个杆长矢量
L1 = A1 -transpose(B1);
L2 = A2 -transpose(B2);
L3 = A3 -transpose(B3);
L4 = A4 -transpose(B4);
L5 = A5 -transpose(B5);
L6 = A6 -transpose(B6);

%-----------求模,得到每个杆的杆长-----------
%-----------求模,得到每个杆的杆长-----------------------------------------
n1 =L1/norm(L1);
n2 =L2/norm(L2);
n3 =L3/norm(L3);
n4 =L4/norm(L4);
n5 =L5/norm(L5);
n6 =L6/norm(L6);
J=[n1  n2  n3  n4  n5  n6  ;
cross(RP*transpose(p1),n1)  cross(RP*transpose(p2),n2) cross(RP*transpose(p3),n3)  cross(RP*transpose(p4),n4)  cross(RP*transpose(p5),n5)  cross(RP*transpose(p6),n6)  ]';
gg=cond(J);
w=w+gg;
TT=TT+1;
end
end


```

  • 写回答

21条回答 默认 最新

  • 檀越@新空间 2024-04-08 16:28
    关注
    获得0.45元问题酬金

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    要绘制每一代值与迭代次数的图像,需要对遗传算法进行调整,使其在每一代迭代后输出当前的最佳值。同时,需要在MATLAB中编写代码以收集每一代的最佳值,并将其绘制成图表。

    以下是实现该目标的步骤:

    1. 修改遗传算法的选项:

      • 设置输出每一代的最佳值
      • 调整迭代次数
      • 调整种群大小、交叉分数等参数
    2. 编写MATLAB代码以收集每一代的最佳值,并将其绘制成图表

    以下是修改后的MATLAB代码示例:

    objfun=@untitled471;
    % 自变量个数
    n=4;
    % A,b线性不等式约束
    A=[ ];
    b=[];
    % Aed,bed线性等式约束
    Aed=[];
    bed=[];
    % lb下限
    lb=[200 5 100 10];
    % 上限
    ub=[];
    % 非线性约束
    confun=confun1;
    % 选项
    opts=optimoptions(@ga);
    
    % 修改遗传算法的选项
    opts.OutputFcns = @output; % 设置输出函数为output
    opts.PopulationSize=100;
    opts.MaxGenerations=200;
    opts.CrossoverFraction = 0.6;
    
    [x,fval]=ga(objfun,n,A,b,Aed,bed,lb,ub,confun,opts);
    
    function [state,options,optchanged] = output(options,state,flag)
        persistent bestValues;
        if strcmp(flag, 'init')
            bestValues = [];
        elseif strcmp(flag, 'iter')
            bestValues = [bestValues; state.Best];
        end
        optchanged = false;
    end
    
    % 绘制每一代值与迭代次数的图像
    figure;
    plot(1:length(bestValues), bestValues, '-o');
    xlabel('Iteration');
    ylabel('Best Objective Value');
    title('Convergence of Genetic Algorithm');
    

    在这个例子中,我们通过opts.OutputFcns指定了输出函数为output,并编写了output函数来收集每一代的最佳值。最后,利用MATLAB的绘图功能绘制了每一代值与迭代次数的图像。

    总结:

    1. 修改遗传算法的选项,设置输出函数为output,调整迭代次数、种群大小等参数。
    2. 编写output函数来收集每一代的最佳值,并在遗传算法迭代过程中调用该函数。
    3. 利用MATLAB绘图功能绘制每一代值与迭代次数的图像。
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 赞助了问题酬金15元 4月8日
  • 创建了问题 4月8日