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

📄 shuru.pas

📁 用delphi语言实现运筹学通用单纯形程序-大M法
💻 PAS
字号:
unit shuru;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Buttons;
 const long=251;//定义常量控制数组长度
 const MM=10000;//定义一个比已知数都大的数,作为人工变量的系数
                //定义为MM是为了避免变量名的重复
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 }
  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;//存放决策变量
   z:real;//目标函数值
   s,r:Integer;//主元列号和行号
   //分别保存常数项、原目标函数、人工目标函数
{----定义几个全局变量,实现数据传递------------------------------}
implementation
 {$R *.DFM}
uses jisuan;//调用jisuan单元的数据
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
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
  leixing:='Max'
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 //需要加入人工变量、加入大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 Tfrmshuru.FormCreate(Sender: TObject);
begin
 BitBtn2.Enabled:=false;
 //将下一步按钮的可操作性设为false
end;

end.

⌨️ 快捷键说明

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