📄 jisuan.pas
字号:
unit jisuan;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,shuru,
ExtCtrls, StdCtrls, Buttons;
type
Tfrmjisuan = class(TForm)
Panel1: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
procedure mubiaozhibianhuan;
procedure xuanzhuanbianhuan;
function findminj(var kk:integer):boolean;
function findmini(var kk:integer):boolean;
{ Public declarations }
end;
var
frmjisuan: Tfrmjisuan;
leixing:String;
implementation
var xianshi1:myarray2;
var juece:array[1..long] of integer; mini,minj:integer;
{$R *.DFM}
procedure Tfrmjisuan.mubiaozhibianhuan;
var i,j:integer;
begin
for j:=0 to 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 tfrmjisuan.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;
{----考察最小目标系数,为负值时返回TRUE并通过全局变量传递minj的值------}
function tfrmjisuan.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;
{------------判断后,找调入变量并通过全局变量传递mini的值-----------}
procedure tfrmjisuan.xuanzhuanbianhuan;
VAR yi:array[1..long] of real;i,j:integer;var xuanzhuan:real;
begin
for i:=1 to long do yi[i]:=0;
juece[mini]:=minj;
xuanzhuan:=A[mini,minj];
for j:=0 to n+m do A[mini,j]:=A[mini,j]/xuanzhuan;
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 Tfrmjisuan.FormCreate(Sender: TObject);
begin
mini:=0;minj:=0;
BitBtn2.Enabled:=false;
BitBtn3.Enabled:=false;
end;
procedure Tfrmjisuan.BitBtn4Click(Sender: TObject);
var i,j:integer;
begin
if xianshi1[0,0]<>nil then
for i:=0 to m+1 do
for j:=0 to m+n+1 do
xianshi1[i,j].Free;
for i:=1 to m+1 do
for j:=0 to n+m do
begin
xianshi1[i,j]:=tedit.Create(self);
xianshi1[i,j].parent:=panel1;
xianshi1[i,j].Width:=40;
xianshi1[i,j].left:=30+j*xianshi1[i,j].Width;
xianshi1[i,j].top:=30+(i-1)*xianshi1[i,j].Height;
xianshi1[i,j].text:=floattostr(A[i,j]);
end;
BitBtn4.Enabled:=false;
BitBtn3.Enabled:=true;
end;
{----------显示标准化结果,控制按钮操作--------------------------------}
procedure Tfrmjisuan.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:=0 to n+m do
begin
xianshi1[i,j]:=tedit.Create(self);
xianshi1[i,j].parent:=panel1;
xianshi1[i,j].Width:=40;
xianshi1[i,j].left:=30+j*xianshi1[i,j].Width;
xianshi1[i,j].top:=30+(i-1)*xianshi1[i,j].Height;
xianshi1[i,j].text:=floattostr(A[i,j]);
end;
BitBtn3.Enabled:=false;
BitBtn2.enabled:=true;
end;
{----------显示初始单纯性表,控制按钮操作----------------------------}
procedure Tfrmjisuan.BitBtn2Click(Sender: TObject);
var i,j:integer;
ziyoujie:string; t:boolean;
ziyouzhi:real;
begin
while findminj(minj) do // 判断最小目标系数是否非负
begin
if findmini(mini) then xuanzhuanbianhuan
else begin showmessage('无最优解'); exit; end;
end;
{------------核心算法,调用了几各自定义函数--------------------}
for i:=1 to m+1 do
for j:=0 to n+m do xianshi1[i,j].free;
for i:=0 to m+1 do
for j:=0 to n+m+1 do
begin
xianshi1[i,j]:=tedit.Create(self);
xianshi1[i,j].parent:=panel1;
xianshi1[i,j].Width:=40;
xianshi1[i,j].left:=30+j*xianshi1[i,j].Width;
xianshi1[i,j].top:=30+i*xianshi1[i,j].Height;
end;
for i:=1 to m+1 do
for j:=1 to n+m do
xianshi1[i,j].text:=floattostr(A[i,j]);
xianshi1[0,0].text:='基';
for i:=1 to m do xianshi1[i,0].text:='x'+inttostr(juece[i]);
xianshi1[m+1,0].Text:='检';
xianshi1[0,n+m+1].text:='b';
for j:=1 to n+m do xianshi1[0,j].text:='x'+inttostr(j);
for i:=1 to m+1 do xianshi1[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 xianshi1[j,0].Text='x'+IntToStr(i) then
begin
ziyoujie:=ziyoujie+xianshi1[j,0].Text+'='+xianshi1[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(xianshi1[m+1,n+m+1].Text)
else
ziyouzhi:=StrToFloat(xianshi1[m+1,n+m+1].Text);
SHOWmessage(ziyoujie+'最优值是:'+FloatToStr(ziyouzhi));
BitBtn2.Enabled:=false;
end;
procedure Tfrmjisuan.BitBtn5Click(Sender: TObject);
begin
frmshuru.close;
end;
procedure Tfrmjisuan.BitBtn1Click(Sender: TObject);
begin
frmshuru.Show;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -