⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comp_2.pas

📁 机械优化设计中的复合型法
💻 PAS
字号:
unit comp_2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm2 = class(TForm)
    GroupBox1: TGroupBox;
    cp: TButton;
    qx: TButton;
    sd: TSaveDialog;
    jgxs: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure cpClick(Sender: TObject);
    procedure qxClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  procedure sjxs_1;
  procedure sjxs_2;
  Procedure comp;
  procedure xcente;
  procedure pricom;
  procedure fxsegu;
  function rmd() : real;

implementation

uses comp_1, comp_0, comp_FGH;

{$R *.DFM}

procedure TForm2.FormCreate(Sender: TObject);
begin
   Form2.Left :=50;
   Form2.Top :=50;
end;

procedure TForm2.cpClick(Sender: TObject);
begin
  if sd.Execute then
  begin
    if fileexists(sd.filename) then
    begin
      if application.MessageBox('您确认要覆盖此文件吗?','警告',MB_YESNO)=idyes then
        form1.WriteDataToFile(sd.filename);
    end
    else
    begin
      form1.WriteDataToFile(sd.filename);
    end;
    if application.MessageBox('要返回吗?','提示',MB_YESNO)=idyes then
      Form2.Close;
  end;
end;

procedure TForm2.qxClick(Sender: TObject);
begin
  Form2.Close;
end;

//=================优化算法程序=============================
procedure comp;                    // 主程序
var p1,i,j,temp1:integer;
    sdx,phi:real;
label here;
begin
  with form1.comple do begin
    temp1:=0;
    FFX;fx00:=fx;
here:
    pricom;
    with form2.jgxs.lines do
    begin
      add('-------------------------------------------------------------------------------');
      add('                                                              ');
      add('二、计算过程__数据');
      add('===============================================================================');
    end;
    repeat
      ITE := ITE+1;
      fxsegu;
      lh:=1;
      for i:=1 to n do xh[i]:=xcom[i,lh];
      fxh:=fxk[lh];
      LL:=kfh;
      xcente;
      ggx;
      for i:=1 to n do x0[i]:=x[i];
      for j:=1 to kg do
        if gx[j]>0.0 then begin  temp1:=1; break; end
                     else temp1:=0;
      if temp1=1 then
        for i:=1 to n do
        begin  x[i]:=xl[i];bl[i]:=xl[i];bu[i]:=x0[i];goto here;  end;
      FFX; fx0:=fx; phi:=1.3;
      repeat
        repeat
          for i:=1 to n do begin  xr[i]:=x0[i]+phi*(x0[i]-xh[i]);x[i]:=xr[i];  end;
          ggx;
          for j:=1 to kg do
            if gx[j]>0.0 then  begin  temp1:=1;phi:=0.5*phi; break; end
                         else  temp1:=0;
        until (temp1=0);
        FFX;  fxr:=fx;
        if(fxr>fxh) then phi:=0.5*phi;
      until (fxr<=fxh);
      for i:=1 to n do xcom[i,lh]:=xr[i];
      fxk[lh]:=fxr;
      fxsegu;
      for p1:=1 to n do xl[p1]:=xcom[p1,kfh];
      fxl:=fxk[kfh];

    IF (ITE=1) or (ITE = ((ITE div 10)*10)) THEN
    BEGIN
    with form2.jgxs.lines do
    begin
      Add('   复合形迭代次数   ITE = '+inttostr(ITE));
      Add('  -----------------------------------------------------------------------------');
      Add('   设计变量迭代点 X:');
      for i := 1 to n do Add(#9+#9+#9+'X['+inttostr(i)+']= '+formatfloat('0.000000E+00',XL[i]));
      Add('  -----------------------------------------------------------------------------');
      Add('   目标函数值 F(X)= '+floattostr(FXL));
      Add('  -----------------------------------------------------------------------------');
   end;
   END;

      sdx:=0.0;
      for p1:=1 to Kfh-1 do sdx:=sdx+(fxl-fxk[p1])*(fxl-fxk[p1]);
      sdx:=sqrt(sdx/(Kfh-1));
    until (sdx<=eps);
    for i:=1 to n do x[i]:=xcom[i,kfh];
    fx:=fxk[kfh];
    ggx;
  end;
end;

function rmd() : real;
var
   rm35,rm36,rm37 :real;
begin
  with form1.comple do begin
    rm35:=exp(35.0*ln(2.0));
    rm36:=2.0*rm35;
    rm37:=2.0*rm36;
    rm:=5.0*rm;
    if rm>=rm37 then rm:=rm-rm37;
    if rm>=rm36 then rm:=rm-rm36;
    if rm>=rm35 then rm:=rm-rm35;
    rmd:=rm/rm35;
  end;
end;

procedure fxsegu;
var ii,kl,lp,lp1,kk:integer;w:real;
begin
  with form1.comple do begin
    for kk:=1 to kfh-1 do
    begin
      KL:=kfh-kk;
      for lp:=1 to KL do
      begin
        lp1:=lp+1;
        if(fxk[lp] <= fxk[lp1]) then
        begin
          w:=fxk[lp]; fxk[lp]:=fxk[lp1]; fxk[lp1]:=w;
          for ii:=1 to n do
          begin
            x[ii]:=xcom[ii,lp]; xcom[ii,lp]:=xcom[ii,lp1];
            xcom[ii,lp1]:=x[ii];
          end;
        end;
      end;
    end;
  end;
end;

procedure xcente;
var ii,kk:integer;xs:real;
begin
  with form1.comple do begin
    for ii:=1 to n do
    begin
      xs:=0.0;
      for kk:=1 to LL do if (kk<>LH) then xs:=xs+xcom[ii,kk];
      if(LH<=0) then x[ii]:=xs/LL else x[ii]:=xs/(LL-1);
    end;
  end;
end;

//==================
procedure pricom;
//==================
var
  p1,p2,p3,p4,p5,LL1,temp1:integer;
  q:real;
begin
with form1.comple do begin
   ggx;
repeat
    temp1:=0;
    for p1:=1 to kg do
    begin
    if(gx[p1]>0) then
      begin
        for p2:=1 to n do
          begin
            q:=rmd(); x[p2]:=bl[p2]+q*(bu[p2]-bl[p2]);
            temp1:=1;
          end;
          ggx;break;
      end;
    end;
until (temp1=0);
   for p1:=1 to n do xcom[p1,1]:=x[p1];
   for p1:=2 to kfh do for p2:=1 to n do
     begin
        q:=rmd(); xcom[p2,p1]:=bl[p2]+q*(bu[p2]-bl[p2]);
     end;
   LH:=0;
   for p1:=1 to Kfh-1 do
     begin
      LL:=p1; xcente; //ggx;
      for p2:=1 to n do x0[p2]:=x[p2];fx0:=fx;
      LL1:=LL+1;
      for p2:=1 to n do x[p2]:=xcom[p2,LL1];
      ggx;
      repeat
//        ggx;
        temp1:=0;
        for p3:=1 to kg do
          begin
          if gx[p3]>0.0 then
            begin
              temp1:=1;
              break;
            end;
          end;
        if temp1=1 then
         begin
          for p4:=1 to n do
            begin
              x[p4]:=x0[p4]+0.5*(x[p4]-x0[p4]);
            end;
          ggx;
         end;
      until (temp1=0);
       for p5:=1 to n do xcom[p5,LL1]:=x[p5];
     end;
   for p1:=1 to Kfh do
     begin
       for p2:=1 to n do x[p2]:=xcom[p2,p1];
 {      ggx;
       for p2:=1 to kg do
       if gx[p2]>0.0 then temp1:=1
         else temp1:=0;
}
       FFX;
       fxk[p1]:=fx;
     end;
end;
end;


//========================================================================
//========================================================================
//===========================================================================
procedure sjxs_1;
var
   ii : integer;
   jg:array[1..400] of string;
begin
  with form1.comple do
  begin
    jg[1]:=floattostr(n);
    jg[2]:=floattostr(kg);
    jg[3]:=floattostr(kfh);
    jg[4]:=floattostr(EPS);
  with form2.jgxs.lines do
  begin
    clear;
    add('                          常用优化方法 ——复合形法   惩罚函数法 ');
    add('                          ^^^^^^^^^^^^^^^^^^^^^^^^^^ ');
    add('                                                                               ');
    add('一、初始数据');
    add('===============================================================================');
    Add('   设计变量个数     N = '+jg[1]);
    Add('  -----------------------------------------------------------------------------');
    Add('   不等式约束个数  KG = '+jg[2]+'       复合形顶点个数      K = '+jg[3]);
    Add('  -----------------------------------------------------------------------------');
    Add('   收敛精度       EPS = '+jg[4]);
    Add('  -----------------------------------------------------------------------------');

    Add('   设计变量初始点 X0:');
    for ii := 1 to n do Add(#9+#9+#9+'X['+inttostr(ii)+']='+floattostr(x[ii]));
    Add('  -----------------------------------------------------------------------------');
    Add('   设计变量下界 BL:');
    for ii := 1 to n do Add(#9+#9+#9+'BL['+inttostr(ii)+']='+floattostr(BL[ii]));
    Add('  -----------------------------------------------------------------------------');

    Add('   设计变量上界 BU:');
    for ii := 1 to n do Add(#9+#9+#9+'BU['+inttostr(ii)+']='+floattostr(BU[ii]));
    Add('  -----------------------------------------------------------------------------');

    Add('   初始点目标函数值 F(X0)= '+floattostr(FX));
    if kg>0 then
    begin
    Add('  -----------------------------------------------------------------------------');
    Add('   初始点处的不等约束函数值 G(X0):');
    for ii := 1 to kg do Add(#9+#9+#9+#9+'GX['+inttostr(ii)+']= '+formatfloat('0.000000E+00',GX[ii]));
    end;

   end;
   end;
end;




//99999999999999999999999999999999999999999999999999999999999999999
procedure sjxs_2;
var
   ii : integer;
   jg:array[1..400] of string;
begin
  with form1.comple do
  begin
    jg[1]:=inttostr(ITE);
    jg[2]:=inttostr(NFX);
  with form2.jgxs.lines do
  begin
    add('                                                                               ');
    add('三、优化结果__数据');
    add('===============================================================================');
    Add('   复合形迭代次数   ITE = '+jg[1]+'     目标函数计算次数     IFX = '+jg[2]);
    Add('  -----------------------------------------------------------------------------');
    Add('   设计变量最优点 X*:');
    for ii := 1 to n do Add(#9+#9+#9+'X['+inttostr(ii)+']= '+formatfloat('0.000000E+00',X[ii]));

    Add('  -----------------------------------------------------------------------------');
    Add('   最优值 F(X*)= '+floattostr(FX));

    if kg>0 then
    begin
    Add('  -----------------------------------------------------------------------------');
    Add('   最优点处的不等约束函数值 G(X*):');
    for ii := 1 to kg do Add(#9+#9+#9+#9+'GX['+inttostr(ii)+']= '+formatfloat('0.000000E+00',GX[ii]));
    end;

    Add('-------------------------------------------------------------------------------');
    Add('--- STOP --- ');
  end;
end;
end;





end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -