📄 jisuan2.pas
字号:
unit jisuan2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,shuru,
ExtCtrls, StdCtrls, Buttons;
type
Tfrmjisuan2 = class(TForm)
Panel1: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
procedure xianshi;
{ Public declarations }
end;
var
frmjisuan2: Tfrmjisuan2;
implementation
uses jisuan1;
var xianshi1:myarray2;
{$R *.DFM}
procedure tfrmjisuan2.xianshi;
var i,j:Integer;
x0,y0:Integer;//控制输入框的位置
begin
for i:=0 to frmjisuan2.Panel1.ComponentCount-1 do
frmjisuan2.Panel1.Components[i].Free;
{--------------释放原有文本框---------------------------------------}
x0:=(panel1.Width-(n+ziyou+man+2)*40) div 2;
y0:=(panel1.Height-(m+1)*28) div 2;
for i:=0 to m+1 do
for j:=0 to n+ziyou+man+1 do
begin
xianshi1[i,j]:=tedit.Create(self);
xianshi1[i,j].parent:=frmjisuan2.Panel1;
xianshi1[i,j].Width:=40;
xianshi1[i,j].left:=x0+j*xianshi1[i,j].Width;
xianshi1[i,j].top:=y0+i*xianshi1[i,j].Height;
end;
{-------------- 创建新的文本框---------------------------------------}
for i:=1 to m do
for j:=1 to n+ziyou+man do
xianshi1[i,j].text:=FormatFloat('0.####',A[i,j]);
//显示系数矩阵
xianshi1[0,0].text:='基';
for i:=1 to m do
xianshi1[i,0].text:='x'+inttostr(juece[i]);//显示基变量
//注意m值的改变
xianshi1[m+1,0].Text:='检';
for j:=1 to n+ziyou+man do
xianshi1[m+1,j].Text:=FormatFloat('0.#####',d[j]);
//显示目标函数
xianshi1[0,n+ziyou+man+1].text:='b';
for j:=1 to n+ziyou+man do
xianshi1[0,j].text:='x'+inttostr(j);//表头位置,变量名
for i:=1 to m do
xianshi1[i,n+ziyou+man+1].Text:=FormatFloat('0.####',b[i]);
//最后一列显示检验数
xianshi1[m+1,n+ziyou+man+1].Text:=FormatFloat('0.####',w);
//目标函数值
{---------自定义过程,显示表格迭代结果--------------------------}
end;
procedure Tfrmjisuan2.FormCreate(Sender: TObject);
begin
BitBtn2.Enabled:=false;
end;
procedure Tfrmjisuan2.BitBtn4Click(Sender: TObject);
var i,j:integer;
temp:real;//保留乘积因子
begin
for i:=1 to m do
begin
temp:=d[juece[i]];
for j:=1 to n+ziyou+man do
d[j]:=d[j]-temp*A[i,j];
w:=w-temp*b[i];
end;//更新目标函数和限定限量
xianshi;
BitBtn4.Enabled:=false;
BitBtn2.Enabled:=true;
end;
{----------显示标准化结果,控制按钮操作--------------------------------}
procedure Tfrmjisuan2.BitBtn5Click(Sender: TObject);
begin
frmshuru.close;
//终止程序运行
end;
procedure Tfrmjisuan2.BitBtn1Click(Sender: TObject);
begin
frmshuru.Show;
//返回到数据输入窗口,修改或更新初始数据
end;
procedure Tfrmjisuan2.BitBtn2Click(Sender: TObject);
var i,j:Integer;
ziyoujie:string;//字符串形变量,显示最优解
t:Boolean;//表示变量是否为基变量
label 1;//定义标签,控制循环
begin
1:if not puanduan_d then // 判断目标函数系数有无负值
begin //目标函数系数有负值,选取主元进行新一轮的迭代
s:=find_s;//寻找主列。调用自定义函数
if puanduan_r(s) then //判断主列,有无正值
begin //有,则选取主行,进行新一轮的迭代
r:=find_r(s); //调用自定义函数,寻找主行
diedai; //旋转变换,得到新的单纯形表
goto 1; //重新判断
end
else//主列元素,无正值,则原线性规划为无界解
begin
xianshi;
showmessage('无界解');
exit;
end;
end
else //目标函数系数全部非负
begin
xianshi;//显示最终单纯形表
end;
{----------完成表格的迭代变换,生成最终单纯形表----------------------}
ziyoujie:='最优解:'+#13; //初始化变量
z:=0;
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:=ziyoujie+xianshi1[j,0].Text+'='+xianshi1[j,n+ziyou+man+1].Text+#13;
t:=true;
break;
end;
if not t then//变量不在基变量中,则其值为0
ziyoujie:=ziyoujie+'x'+IntToStr(i)+'=0'+#13;//累加最优解
end;
z:=StrToFloat(xianshi1[m+1,n+ziyou+man+1].Text);
if leixing='Min' then z:=-z;
ShowMessage(ziyoujie+'最优值:'+FormatFloat('0.####',z));
{----------------显示最优解和最优值--------------------------------------}
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -