?? shuru.pas
字號:
unit shuru;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Buttons;
const long=250;//定義常量控制數組長度
type
Tfrmshuru = class(TForm)
panel2: TPanel;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
RadioGroup1: TRadioGroup;
BitBtn1: TBitBtn;
Memo1: TMemo;
Label3: TLabel;
BitBtn2: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
//function useman(opt:array of Integer):boolean;
end;
type myarray=array[1..long] of array[1..long] of real;
type myarray2=array[0..long] of array[0..long] of tedit;
{----------自定義兩種類型,供輸入數據和數組計算使用-------------}
var
frmshuru: Tfrmshuru;
m:Integer;//約束條件個數
n:Integer;//變量個數
leixing:string;//目標函數類型
ziyou:integer;//松弛變量個數
man:Integer;//人工變量個數
A:myarray;//系數矩陣
opt:array[1..long] of integer;//操作符 0、-1、1 表示等于、小于、大于
b,c,d:array[1..long] of real;
juece:array[1..long] of integer;
w:real;//人工目標函數值
z:real;//最終目標函數值
s,r:Integer;//主元列號和行號
//分別保存常數項、原目標函數、人工目標函數
{----定義幾個全局變量,實現數據傳遞------------------------------}
implementation
{$R *.DFM}
uses jisuan1,jisuan2;
var shuru1:myarray2; //輸入框
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 Tfrmshuru.BitBtn1Click(Sender: TObject);
var i,j:integer;
x0,y0:Integer;//定位輸入框起點位置
begin
if (edit1.text<>'') and (edit2.text<>'') then
begin
try
for i:=1 to m+1 do
for j:=1 to n+2 do
shuru1[i,j].free;
//釋放原有文本框
finally
m:=0;n:=0;
m:=strtoint(edit1.text);
n:=strtoint(edit2.text);//輸入不等式約束條件個數m:
leixing:=RadioGroup1.Items[RadioGroup1.ItemIndex];
if m>6 then
panel2.Height:=panel2.Height+28*(m-6)
else panel2.Height:=290;
if n>6 then
panel2.Width:=panel2.Width+40*(n-6)
else panel2.Width:=359;
frmshuru.Height:=panel2.Height+Label3.Height+Memo1.Height;
frmshuru.Width:=panel2.Width+Panel1.Width;
frmshuru.Top:=(Screen.Height-frmshuru.Height) div 2;
frmshuru.Left:=(Screen.Width-frmshuru.Width) div 2;
{----------動態調整面板的高和寬,窗體的大小和位置--------------}
x0:=(panel2.Width-(n+2)*40) div 2;
y0:=(panel2.Height-(m+1)*28) div 2;
{----------控制輸入框的位置,使其居于面板中間------------------}
frmshuru.AutoSize:=False;//防止窗體抖動
for i:=1 to m+1 do
for j:=1 to n+2 do
begin
shuru1[i,j]:=tedit.Create(self);
shuru1[i,j].parent:=panel2;
shuru1[i,j].Width:=40;
shuru1[i,j].left:=x0+(j-1)*shuru1[i,j].Width;
shuru1[i,j].top:=y0+(i-1)*shuru1[i,j].Height;
end;
end;
shuru1[1,1].SetFocus;
BitBtn2.Enabled:=true;
frmshuru.AutoScroll:=((Screen.Width-frmshuru.Width<20) or (Screen.Height-frmshuru.Height<50));
{----------控制界面--------------------------------------------------}
end
else showmessage('輸入條件不完善,請補充');
end;
procedure Tfrmshuru.BitBtn2Click(Sender: TObject);
var i,j:integer;
begin
w:=0;
for i:=1 to long do
begin
for j:=1 to long do A[i,j]:=0;
b[i]:=0;
opt[i]:=0;
c[i]:=0;
d[i]:=0;
end;
{---------------初始化變量---------------------------------------}
for i:=1 to m do
begin
if shuru1[i,n+2].text<>'' then b[i]:=strtofloat(shuru1[i,n+2].text);
if shuru1[i,n+1].text<>'' then opt[i]:=strtoint(shuru1[i,n+1].text);
for j:=1 to n do
if shuru1[i,j].text<>'' then
A[i,j]:=strtofloat(shuru1[i,j].text);
end;
for j:=1 to n do
if shuru1[m+1,j].Text<>'' then
c[j]:=StrToFloat(shuru1[m+1,j].Text);
{------------給限定向量、操作符、系數矩陣、目標函數系數賦初值----}
if RadioGroup1.Items[RadioGroup1.ItemIndex] = 'Max' then
begin
for j:=1 to n do c[j]:=-c[j];
leixing:='Max';
end
else leixing:='Min';
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 //需要加入人工變量、調用第一階段程序
begin
ShowMessage('需要加入人工變量,進入第一階段求解');
frmjisuan1.Show;
frmjisuan1.BitBtn3.Enabled:=true;
end
else //不需要加入人工變量、直接調用第二階段程序
begin
ShowMessage('不需要加入人工變量,直接進入第二階段求解');
for j:=1 to n do
d[j]:=c[j];
frmjisuan2.show;
frmjisuan2.BitBtn1.Enabled:=True;
frmjisuan2.BitBtn4.Enabled:=true;
end;
end;
procedure Tfrmshuru.FormCreate(Sender: TObject);
begin
BitBtn2.Enabled:=false;
//將下一步按鈕的可操作性設為false
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -