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

📄 rand_2.pas

📁 机械优化设计中的约束随机法
💻 PAS
字号:
unit rand_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;
    Memo1: TMemo;
    GroupBox2: TGroupBox;
    jgxs: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure cpClick(Sender: TObject);
    procedure qxClick(Sender: TObject);
    procedure sb1Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  procedure sjxs_1;
  procedure sjxs_2;
  Procedure RANDIR;
  procedure xran;
  procedure sran;
  procedure sfeas;

  function rmd() : real;

implementation

uses rand_0, rand_1, rand_fgh ;

//var sss:string;

{$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 TForm2.sb1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
var
  j,k : integer;
begin
  k := 0;
  jgxs.SetFocus;
  if scrollpos > 1 then
  for j := 1 to scrollpos do
    k := k+length(jgxs.Lines.Strings[j-1])+2
  else  k := 0;
  jgxs.SelStart := k;
end;


//=================优化算法程序=============================
Procedure RANDIR;   //开始计算
var ii,kk :integer;
    tmp107,tmp113,tmp116 : integer;
begin
    with form2.jgxs.lines do
    begin

  with form1.hfgd do
  begin
    rm := 2657863.0;
    xran;
    ffx;
    f0 := fx;

    tmp107:=107;
    repeat
      th:=t0;
      sfeas;
      ffx;
      fl:=fx;

      tmp113:=113;
      repeat
        th:=1.3*th;
        for ii:=1 to n do x[ii]:=x[ii]+th*sf[ii];
        ggx;
        for kk:=1 to kg do if (gx[kk]>=1e-15) then begin tmp113:=999; break; end;
        if tmp113=113 then
        begin
          FFX;
          if (fx > fl) then
            tmp113:=999
          else
            fl:=fx;
        end;
        if (th>1e15) then tmp113:=999;
//Add('113 目标函数值 F(X)= '+floattostr(FL)+'   步长 TH = '+floattostr(th));
      until tmp113=999;
      
      tmp116:=116;
      repeat
        for ii:=1 to n do x[ii]:=x[ii]-th*sf[ii];
        th:=0.7*th;
        for ii:=1 to n do x[ii]:=x[ii]+th*sf[ii];
        ggx;
        for kk:=1 to kg do
          if(gx[kk]>=1e-15) then begin tmp116:=116; break; end
                            else tmp116:=777;
        if tmp116=777 then
        begin
          FFX;
          if (fx > fl) then
             tmp116:=116
          else
             tmp116:=999;
        end;
        if (th<1e-15) then tmp116:=999;

//Add('116 目标函数值 F(X)= '+floattostr(FL)+'   步长 TH = '+floattostr(th));

      until (tmp116=999);

      if (abs(f0-fx)<(abs(f0)*eps+eps)) then tmp107:=999
      else begin
             ITE := ITE+1;
             f0:=fx;
           end;

    IF (ITE=1) or (ITE = ((ITE div 10)*10)) THEN
    BEGIN
      Add('   设计变量迭代点 X:'+'                           迭代次数  ITE = '+inttostr(ITE));
      for ii := 1 to n do Add(#9+#9+#9+'X['+inttostr(ii)+']= '+formatfloat('0.000000E+00',XL[ii]));
      Add('  -----------------------------------------------------------------------------');
      Add('   目标函数值 F(X)= '+floattostr(FL));
      Add('  -----------------------------------------------------------------------------');
   END;

    until (tmp107=999);
 end;
   end;
end;

function rmd() : real;   //计算随机数
var
   rm35,rm36,rm37  : real;
begin
   with form1.hfgd 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 xran;  //产生可行的初始点
var
  ii,temp,kk:integer;qq:real;
begin
  with form1.hfgd do
  begin
    temp:=0;
    repeat
      ggx;
      for ii:=1 to kg do
      begin
        if (gx[ii]>=0) then
        begin
          for kk:=1 to n do
          begin qq:=random; x[kk]:=bl[kk]+qq*(bu[kk]-bl[kk]); end;
          temp:=1;
          break;
        end
        else
          temp:=0;
        if(temp=1) then break;
      end;
    until temp=0;
  end;
end;

procedure sran;  //产生随机方向
var
  ii,kk:integer;qq,rqu:real;
begin
  with form1.hfgd do
  begin
    rqu:=0;
    for ii:=1 to n do begin qq:=rmd(); sr[ii]:=2.0*qq-1.0; rqu:=rqu+sr[ii]*sr[ii]; end;
    for kk:=1 to n do sr[kk]:=sr[kk]/sqrt(rqu);
  end;
end;

procedure sfeas; //由初始点按最优方向迭代一轮
var ii,kk,jj,temp,temp1:integer;x0:arr1;
begin
  with form1.hfgd do
  begin
    for ii:=1 to n do begin x0[ii]:=x[ii];xl[ii]:=x[ii];end;
    fl:=f0;
    temp:=1;temp1:=1;
    repeat
      for kk:=1 to nsr do
      begin
        sran;
        for ii:=1 to n do x[ii]:=x0[ii]+th*sr[ii];
        ggx;
        for jj:=1 to kg do
        begin
          if (gx[jj]>=1e-15)then  begin temp:=1;  break;  end
                            else  temp:=0;
        end;
        ffx;
        if(fx<fl)and(temp=0) then
        begin
          fl:=fx;
          temp1:=0;
          for ii:=1 to n do begin  sf[ii]:=sr[ii];  xl[ii]:=x[ii];  end;
        end;
      end;
      for ii:=1 to n do x[ii]:=xl[ii];
      th:=0.9*th;
    until (temp1=0)and(temp=0);         //((th<1e-7)or((fl-f0)>=1e-15));
  end;
end;


//===========================================================================
procedure sjxs_1;
var
   ii : integer;
   jg:array[1..400] of string;
begin
  with form1.hfgd do
  begin
    jg[1]:=floattostr(n);
    jg[2]:=floattostr(kg);
    jg[3]:=floattostr(NSR);
    jg[4]:=floattostr(T0);
    jg[5]:=floattostr(EPS);
  with form2.jgxs.lines do
  begin
    clear;
    add('                          常用优化方法 ——约束随机法');
    add('                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^');
    add('                                                                               ');
    add('一、初始数据');
    add('===============================================================================');
    Add('   设计变量个数     N = '+jg[1]+'           不等式约束个数  KG = '+jg[2]);
    Add('  -----------------------------------------------------------------------------');
    Add('   随机方向个数   NSR = '+jg[3]);
    Add('  -----------------------------------------------------------------------------');
    Add('   初始步长        T0 = '+jg[4]+'          收敛精度     EPS = '+jg[5]);
    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;

    add('-------------------------------------------------------------------------------');
    add('                                                              ');
    add('二、计算过程__数据');
    add('===============================================================================');


   end;
   end;
end;

//99999999999999999999999999999999999999999999999999999999999999999
procedure sjxs_2;
var
   ii : integer;
   jg:array[1..400] of string;
begin
  with form1.hfgd 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',XL[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 + -