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

📄 jisuan.pas

📁 线形规划代码:包括单纯形法,对偶形法,
💻 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 + -