📄 unit1.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 + -