?? unit2.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 + -