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

📄 unit1.~pas

📁 用delphi语言实现运筹学生产与存贮问题程序
💻 ~PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Panel3: TPanel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Button2: TButton;
    StringGrid1: TStringGrid;
    Label4: TLabel;
    Label5: TLabel;
    Button3: TButton;
    Button4: TButton;
    Panel4: TPanel;
    Label6: TLabel;
    Button5: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type array2r=array of array of real;
type array2i=array of array of integer;
type array1i=array of integer;
type array1r=array of real;
//动态定义四种数组类型
var
  Form1: TForm1;
  n:integer;   //阶段数或时期数
  kk:real;     //每批产品的固定投资
  m:integer;   //每个时期的最大生产能力
  a:array1r;   //单位产品在每个时期的成本
  cun:array1r; //单位产品在每个时期的存储费用
  d:array1i;   //每个时期的产品需求量
  x:array2i;   //每个时期的产品生产量
  v:array2i;   //每个时期的产品库存量
const
  shangxian=10000;  //定义的相当于无穷大的数

implementation
uses math;     //引用math单元中的函数min()和power()
{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  edit1.Text:='';
  edit2.Text:='';
  edit3.Text:='';
end;
//清空三个文本输入框

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
begin
  n:=strtoint(edit1.Text);      //阶段数或时期数
  kk:=strtofloat(edit2.Text);   //每批产品的固定投资
  m:=strtoint(edit3.Text);      //每个时期的最大生产能力
  stringgrid1.RowCount:=4;
  stringgrid1.ColCount:=n+1;
  stringgrid1.Cells[0,1]:='单位成本';
  stringgrid1.Cells[0,2]:='单位存储费';
  stringgrid1.Cells[0,3]:='产品需求量';
  for j:=1 to n do
    stringgrid1.Cells[j,0]:='时期'+inttostr(j);
  for i:=1 to 3 do
    for j:=1 to n do
      stringgrid1.Cells[j,i]:='';
  //完善输入控件stringgrid1的边框文字提示
  SetLength(a,n+1);
  SetLength(cun,n+1);
  SetLength(d,n+1);
  SetLength(x,n+1,m+1);
  SetLength(v,n+1,m+1);
  //设定各动态数组的长度
end;

procedure TForm1.Button5Click(Sender: TObject);
var
  i,j:integer;
begin
  for i:=1 to 3 do
    for j:=1 to n do
      stringgrid1.Cells[j,i]:='';
end;
//清空输入控件stringgrid1的文字

procedure TForm1.Button3Click(Sender: TObject);
var
  j:integer;
begin
  for j:=1 to n do
  begin
    a[j]:=strtofloat(stringgrid1.Cells[j,1]);    //单位产品在每个时期的成本
    cun[j]:=strtofloat(stringgrid1.Cells[j,2]);  //单位产品在每个时期的存储费用
    d[j]:=strtoint(stringgrid1.Cells[j,3]);      //每个时期的产品需求量
  end;
end;
//读取输入控件stringgrid1中的数据

function ck(c1:real;c2:real;c3:integer):real ;
begin
  if c3=0 then ck:=0
  else if c3>m then  ck:=power(1000,1000)  //如生产量超过最大产量,则认为生产成本为无穷大
  else ck:=c1+c2*c3;  //生产成本=固定成本+单成本×生产量
end;
//自定义的函数,用以求在第K时期的生产成本

function hk(h1:real;h2:integer):real ;
begin
      hk:=h1*h2;
end;
//自定义的函数,用以求第K时期末的库存费用=单品库存费×库存量

function minx(m1:array1i;m2:integer):integer ;
var
  i:integer;
  temp:integer;
begin
  temp:=0;
  for i:=m2+1 to n do
    temp:=temp+d[i];
  if temp<m-d[m2] then minx:=temp
  else minx:=m-d[m2];
end;
//自定义的函数,用以求每个时期库存量的上限min(∑di,m-di)   (下限均为0)

procedure TForm1.Button4Click(Sender: TObject);
var
  k:integer;     //具体的时期
  i,j:integer;
  f:array2r;     //总成本(动态定义的数组)
label 1;
label 2;
//过程中使用的两个与goto配套使用的标签

begin
  SetLength(f,n+1,m+1);  //设定总成本数组的长度
//////////////////////////////////
  k:=1;
  for j:=minx(d,1)+1 to m do
  begin
    f[1,j]:=shangxian;
    v[1,j]:=j;
    x[1,j]:=0;
  end;
  for j:=0 to minx(d,1) do
  begin
    v[1,j]:=j;
    x[1,j]:=min(v[1,j]+d[1],m);
    f[1,j]:=ck(kk,a[1],x[1,j])+hk(cun[1],v[1,j]);
  end;
/////////////////初始化第一阶段的数据

/////////////////开始求解各阶段数据
  for k:=2 to n do
  begin
    if k=n then
    begin
      j:=0;     //因第n阶段末的最终库存量为0
      goto 1;
    end
    else
    begin
      for j:=minx(d,k)+1 to m do
      begin
        f[k,j]:=shangxian;
        v[k,j]:=j;
        x[k,j]:=0;
      end;
      //对不可能的库存量数进行赋值

      for j:=0 to minx(d,k) do   //针对不同的库存量分别求解
1:    begin
        v[k,j]:=j;
        x[k,j]:=0;
        f[k,j]:=ck(kk,a[k],0)+hk(cun[k],v[k,j])+f[k-1,v[k,j]+d[k]-0];
        //先初始化数据,首先假定生产量为0时取得最小总成本

         for i:=1 to min(v[k,j]+d[k],m) do //针对相同的库存量,不同的生产量进行求解
         if ck(kk,a[k],i)+hk(cun[k],v[k,j])+f[k-1,v[k,j]+d[k]-i]<f[k,j] then
         begin
           f[k,j]:=ck(kk,a[k],i)+hk(cun[k],v[k,j])+f[k-1,v[k,j]+d[k]-i];
           x[k,j]:=i;
         end;
         //确定某一具体阶段、具体库存量时使总成本最小的生产量和对应的总成本
         if k=n then goto 2;  //若求解完毕则跳出进行输出操作
       end;
     end;
  end;
//////////////////各阶段生产量、库存量、最小总成本都已求出

///////////////////////////输出最小总成本和最优方案(包括各阶段的生产量和库存量)
2:k:=n;
  j:=0;
  label6.Caption:='最小总成本为:'+floattostr(f[n,0])+#13+'各个时期的最优生产决策为:'+#13
                  +'第'+inttostr(n)+'个时期的生产量为:'+inttostr(x[n,0])+#13
                  +'第'+inttostr(n)+'个时期的库存量为:'+inttostr(j)+#13;
  for k:=n downto 2 do
  begin
    label6.Caption:=label6.Caption+'第'+inttostr(k-1)+'个时期的生产量为:'+inttostr(x[k-1,v[k,j]+d[k]-x[k,j]])+#13;
    j:=v[k,j]+d[k]-x[k,j];
    label6.Caption:=label6.Caption+'第'+inttostr(k-1)+'个时期的库存量为:'+inttostr(j)+#13;
  end;
  /////////////////////输出完毕
end;

end.

⌨️ 快捷键说明

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