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

📄 unit1.pas

📁 很好运筹学的DEOPHI原代码.包括动态规划,原始单纯形法,对策论,决策论等
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Grids, Buttons;
 const long=99;//定义常量控制数组长度
 const MM=10000;//定义一个比已知数都大的数,作为人工变量的系数
                //定义为MM是为了避免变量名的重复
type
  TForm1 = class(TForm)
    Panel2: TPanel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Panel3: TPanel;
    Label5: TLabel;
    StringGrid1: TStringGrid;
    BitBtn3: TBitBtn;
    Panel1: TPanel;
    Label1: TLabel;
    Panel4: TPanel;
    BitBtn5: TBitBtn;
    BitBtn6: TBitBtn;
    StringGrid5: TStringGrid;
    Label8: TLabel;
    Panel5: TPanel;
    Panel6: TPanel;
    Label6: TLabel;
    StringGrid4: TStringGrid;
    Label9: TLabel;
    StringGrid3: TStringGrid;
    Label4: TLabel;
    StringGrid2: TStringGrid;
    Panel7: TPanel;
    Edit3: TEdit;
    Label7: TLabel;
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);

    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type array2=array[1..99,1..99] of real;
type array1=array[1..99] of real;
type array10=array[1..99] of integer;


var
  Form1: TForm1;
  i,j,k,l,m,n,m0,n0,p:integer;
  a,ini:array2;//ini矩阵中存放原始数据,a中存放处理成线性规划模型后的数据。
  b,c,d,jie:array1;//b存放线性规划模型不等式右边的常数项数据,c存放目标函数系数数据,
                   //d存放,jie存放最后的解集数据。
  opt:array10; //存放不等式符号数据。

   leixing:string;//目标函数类型
   ziyou:integer;//松弛变量个数
   man:Integer;//人工变量个数
   juece:array[1..long] of integer;//存放决策变量
   z:real;//目标函数值
   s,r:Integer;//主元列号和行号
implementation

{$R *.dfm}
uses jisuan;
function  useman:Boolean;
var i:Integer;
begin
  Result:=False; //赋初值
  for i:=1 to m do
    if  opt[i]>-1 then //判断有无非小于情况
      begin
        Result:=true;
        break;
      end;
end;
{-------------判断是否需要加入人工变量--------------------------}
procedure  biaozhunhua;
begin
form1.Hide;
for i:=1  to  m do
  if  b[i]<0  then      //使右边非负
   begin
    opt[i]:=-opt[i];
    for  j:=0  to n do A[i,j]:=-A[i,j];
   end;
{------------------------标准化处理------------------------------}
if useman then //需要加入人工变量、加入大M
  begin
    ShowMessage('需要加入人工变量和大M');
    for j:=1 to n do
      d[j]:=c[j];
    frmjisuan.Show;
    frmjisuan.BitBtn3.Enabled:=true;
  end
else   //不需要加入人工变量
  begin
    ShowMessage('不需要加入大M');
    for j:=1 to n do
      d[j]:=c[j];
    frmjisuan.show;
    frmjisuan.BitBtn3.Enabled:=True;
  end;

end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  edit1.Text:='';
  edit2.Text:='';
  //清空文本框。
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  m:=strtoint(edit1.text);
  n:=strtoint(edit2.Text);
  m0:=m;
  n0:=n;
  stringgrid1.RowCount:=m+1;
  stringgrid1.ColCount:=n+1;
  stringgrid2.colcount:=m+1;
  stringgrid3.ColCount:=n+1;
  stringgrid2.Cells[0,1]:='X';
  stringgrid3.Cells[0,1]:='Y';
  stringgrid4.RowCount:=m+3;
  stringgrid4.ColCount:=n+4;
  stringgrid5.RowCount:=n+3;
  stringgrid5.ColCount:=m+4;
  for i:=1 to m do
  begin
    stringgrid1.Cells[0,i]:='α'+inttostr(i);
    stringgrid2.Cells[i,0]:='x'+inttostr(i);
  end;
  for j:=1 to n do
  begin
    stringgrid1.Cells[j,0]:='β'+inttostr(j);
    stringgrid3.Cells[j,0]:='y'+inttostr(j);
  end;
  for i:=1 to m do
  begin
      stringgrid2.cells[i,1]:='';
      stringgrid3.cells[i,1]:='';
  end;
  //在各个stringgrid的边框上写上标题。
  stringgrid2.Refresh;
  stringgrid3.Refresh;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  for i:=1 to m  do
    for j:=1 to n do
      ini[i,j]:=strtofloat(stringgrid1.cells[j,i]);
               //将stringgrid中所输入的矩阵数据映射到二维数组ini中

end;


procedure TForm1.BitBtn5Click(Sender: TObject);//求解X
begin
  p:=1;
  m:=m0;
  n:=n0;
  for i:=1 to n  do
    for j:=1 to m do
      a[i,j]:=ini[j,i];    //前n行m列a与ini相同
  for i:=1 to n  do
    a[i,m+1]:=-1;   //将第m+1列的元素(从1到n)赋为-1
  for j:=1 to m do
    a[n+1,j]:=1;    //将第n+1行的元素(从1到m)赋为1
  a[n+1,m+1]:=0;    //将第n+1行m+1列的元素赋为0
  //求X的线性规划模型数据已存放至a中.(要求最大)

  for i:=1 to n do
    opt[i]:=1;
  opt[n+1]:=0;

  for i:=1 to n do
    b[i]:=0;
  b[n+1]:=1;

  for j:=1 to m do
    c[j]:=0;
  c[m+1]:=1;
  //将对应数据再分别存至对应数组中。

  for i:=1 to n+1 do
    for j:=1 to m+1 do
      stringgrid5.Cells[j,i]:=floattostr(a[i,j]);
  for i:=1 to n+1 do
  begin
    stringgrid5.Cells[m+2,i]:=inttostr(opt[i]);
    stringgrid5.Cells[m+3,i]:=floattostr(b[i]);
  end;
  for j:=1 to m+1 do
    stringgrid5.Cells[j,n+2]:=floattostr(c[j]);
  stringgrid5.Refresh;
  //在stringgrid5中显示求X的线性规划模型。
  m:=m+1;
  n:=n+1;
  //在求解之前,要对参数进行重新赋值。因m,n是原始行列,不是规划后的行列
  leixing:='Max';  //求X,类型是MAX
  biaozhunhua;     //执行biaozhunhua过程,进行求解。

end;

procedure TForm1.BitBtn6Click(Sender: TObject); //求解Y,不再注释。(类型为MIN)
begin
  p:=2;
  m:=m0;
  n:=n0;
  for i:=1 to m  do
    for j:=1 to n do
      a[i,j]:=ini[i,j];
  for i:=1 to m  do
    a[i,n+1]:=-1;
  for j:=1 to n do
    a[m+1,j]:=1;
  a[n+1,m+1]:=0;


  for i:=1 to m do
    opt[i]:=-1;
  opt[m+1]:=0;

  for i:=1 to m do
    b[i]:=0;
  b[m+1]:=1;

  for j:=1 to n do
    c[j]:=0;
  c[n+1]:=1;


  for i:=1 to m+1 do
    for j:=1 to n+1 do
      stringgrid4.Cells[j,i]:=floattostr(a[i,j]);
  for i:=1 to m+1 do
  begin
    stringgrid4.Cells[n+2,i]:=inttostr(opt[i]);
    stringgrid4.Cells[n+3,i]:=floattostr(b[i]);
  end;
  for j:=1 to n+1 do
    stringgrid4.Cells[j,m+2]:=floattostr(c[j]);
  stringgrid4.Refresh;

m:=m+1;
n:=n+1;
leixing:='Min';
biaozhunhua;
end;

end.

⌨️ 快捷键说明

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