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

📄 unit2.pas

📁 delphi编译的运筹学单纯形法 操作方便
💻 PAS
字号:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    procedure mbzbh;
  function findminj(var kk:integer):boolean;
   function findmini(var kk:integer):boolean;
    procedure FormCreate(Sender: TObject);
    procedure xzbh;
    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
 leixing:string;
implementation
uses Unit1;
  var
    fact:array2;
    juece:array[1..long]of integer;mini,minj:integer;
{$R *.dfm}
procedure Tform2.mbzbh;
var i,j:integer;
begin
for j:=0to n+m do a[m+1,j]:=0;
for i:=1 to m do
  for j:=0 to n+m do
     a[m+1,j]:=a[m+1,j]-a[i,j];
end;
function  Tform2.findminj(var kk:integer):boolean;
var min:real;j,k:integer;
begin
min:=a[m+1,1];
k:=1;
for j:=1 to n+m do
 if min>a[m+1,j] then
    begin
      min:=a[m+1,j];
      k:=j;
    end;
  if min<0 then
    begin
      result:=true;kk:=k;
    end
  else result:=false;
end;
function Tform2.findmini(var kk:integer):boolean;
var i,k:integer;minb:real;
begin
minb:=0;i:=1;k:=0;
while i<=m do
begin
  if a[i,minj]>0 then
      begin
        minb:=a[i,0]/a[i,minj];
         k:=i;
      end;
  if minb>0 then break;
  inc(i);
end;
if i>m+1 then result:=false else
   begin
     result:=true;
     for i:=1 to m do
       if(a[i,minj]>0) and (a[i,0]/a[i,minj]<minb) then
         begin
            minb:=a[i,0]/a[i,minj];
            k:=i;
         end;
    kk:=k;
   end;
end;
procedure Tform2.xzbh;
var
 yi:array[1..long]of real;
 i,j:integer;
 xz:real;
 begin
   for i:=1 to long do yi[i]:=0;
   juece[mini]:=minj;
   xz:=a[mini,minj];
   for j:=0 to m+n do
     a[mini,j]:=a[mini,j]/xz;
   for i:=1 to m+1 do
    begin
      yi[i]:=a[i,minj];
      if(abs(a[i,minj])<>0)and (i<>mini) then
      for j:=0 to n+m do a[i,j]:=a[i,j]-a[mini,j]*yi[i];

    end;
 end;

 

procedure TForm2.FormCreate(Sender: TObject);
begin
mini:=0;minj:=0;
bitbtn2.Enabled:=false;
bitbtn3.Enabled:=false;
end;

procedure TForm2.BitBtn5Click(Sender: TObject);
begin
form2.Close;
end;

procedure TForm2.BitBtn4Click(Sender: TObject);
var i,j:integer;
begin
if fact[0,0]<>nil then
  for i:=0 to m+1 do
    for j:=0 to m+n+1 do
      fact[i,j].Free;
for i:=1 to m+1 do
  for j:=0 to n+m do
     begin
       fact[i,j]:=tedit.Create(self);
       fact[i,j].Parent:=panel1;
       fact[i,j].Width:=40;
       fact[i,j].Left:=30+j*fact[i,j].Width;
       fact[i,j].Top:=30+(i-1)*fact[i,j].Height;
       fact[i,j].Text:=floattostr(a[i,j]);
     end;
bitbtn4.Enabled:=false;
bitbtn3.Enabled:=true;
end;



procedure TForm2.BitBtn3Click(Sender: TObject);
var i,j:integer;
begin
for i:=1 to m do
begin
  juece[i]:=n+i;
  a[i,n+i]:=1;

end;
for i:=1 to m+1 do
for j:=0to n+m do
begin
  fact[i,j]:=tedit.Create(self);
  fact[i,j].Parent:=panel1;
  fact[i,j].Width:=40;
  fact[i,j].Left:=30+j*fact[i,j].Width;
  fact[i,j].Top:=30+(i-1)*fact[i,j].Height;
  fact[i,j].Text:=floattostr(a[i,j]);
end;
 bitbtn3.Enabled:=false;
 bitbtn2.Enabled:=true;
end;
                                                      

procedure TForm2.BitBtn2Click(Sender: TObject);
var i,j:integer;
   ziyoujie:string;
   t:boolean;
   ziyouzhi:real;
begin
while findminj(minj) do
 begin
   if findmini(mini) then xzbh
   else begin
     showmessage('无最优解');
     exit;
     end;
 end;
for i:=1 to m+1 do
   for j:=0 to m+n do
 fact[i,j].Free;
for i:=0 to m+1 do
  for j:=0 to m+n+1 do
 begin
  fact[i,j]:=tedit.Create(self);
  fact[i,j].Parent:=panel1;
  fact[i,j].Width:=40;
  fact[i,j].Left:=30+j*fact[i,j].Width;
  fact[i,j].Top:=30+i*fact[i,j].Height;

 end;
for i:=1 to m+1 do
  for j:=1 to n+m do
    fact[i,j].Text:=floattostr(a[i,j]);
fact[0,0].Text:='基';
for i:=1 to m do fact[i,0].Text:='x'+inttostr(juece[i]);
fact[m+1,0].Text:='检';
fact[0,n+m+1].Text:='b';
for j:=1 to n+m do
  fact[0,j].Text:='x'+inttostr(j);
for i:=1 to m+1  do
  fact[i,n+m+1].Text:=floattostr(a[i,0]);
ziyoujie:='最优解是:'+#13;
for i:=1 to n do
 begin
   t:=false;
   for j:=1 to m do
     if fact[j,0].Text='x'+inttostr(i) then
       begin
         ziyoujie:=ziyoujie+fact[j,0].Text+'='+fact[j,m+n+1].Text+#13;
         t:=true;
         break;
       end;
       if not t then
        ziyoujie:=ziyoujie+'x'+inttostr(i)+'=0'+#13;

 end;
if leixing='min' then
  ziyouzhi:=-1*strtofloat(fact[m+1,n+m+1].text)
else
  ziyouzhi:=strtofloat(fact[m+1,n+m+1].text);
showmessage(ziyoujie+'最优值是:'+floattostr(ziyouzhi));
bitbtn2.Enabled:=false;

end;


end.

⌨️ 快捷键说明

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