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