📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, StdCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Panel3: TPanel;
Button1: TButton;
Button2: TButton;
Label3: TLabel;
StringGrid1: TStringGrid;
Panel4: TPanel;
Button3: TButton;
Button4: TButton;
Label4: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type array2=array[1..99,0..99] of real; //声明的二维实型数组类型
type array2i=array[1..99,0..99] of integer; //声明的二维整型数组类型
type array1=array[1..99] of integer; //声明的一维整型数组类型
var
Form1: TForm1;
sb:integer; //总的设备台数
gc:integer; //总的工厂数
g:array2; //存放盈利矩阵
f:array2; //方案的盈利
d:array2i; //在某一阶段某一后续总分配量下的该阶段的最优分配置值
xs:array1; //最终得到的各阶段的最优分配值
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.Text:='';
edit2.Text:='';
end;
//清空输入框
procedure TForm1.Button3Click(Sender: TObject);
var
i,j:integer;
begin
for i:=1 to gc do
for j:=0 to sb do
g[i,j]:=strtofloat(stringgrid1.cells[j+1,i]);
end;
//读取输入的工厂与设备台数之间盈利关系表
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
sb:=strtoint(edit1.Text); //总的设备台数
gc:=strtoint(edit2.Text); //总的工厂数
stringgrid1.RowCount:=gc+1;
stringgrid1.ColCount:=sb+2;
for j:=1 to sb+1 do
stringgrid1.Cells[j,0]:=inttostr(j-1);
for i:=1 to gc do
stringgrid1.Cells[0,i]:='A'+inttostr(i);
//填写输入框的提示边框
end;
procedure TForm1.Button4Click(Sender: TObject);
var
i,j,x,z,kx:integer;
su:integer; //逆推后,从第1到第J阶段总的最优分配值之和
im:integer; //临时循环变量
ky:integer; //逆推后,从第J到第gc阶段总的最优分配值之和
xs:array1; //逆推后,第J阶段最优分配值
begin
for x:=0 to sb do
begin
f[gc,x]:=g[gc,x];
d[gc,x]:=x;
end;
//对最后一个工厂,即第一个阶段进行赋值
for i:=gc-1 downto 1 do
begin
x:=0;
f[i,x]:=g[i,0]+f[i+1,0];
d[i,x]:=0;
//对每个阶段,当后续分配总量为0时,进行赋值
for x:=1 to sb do
begin
f[i,x]:=g[i,0]+f[i+1,x];
d[i,x]:=0;
//首先进行初始化
for z:=1 to x do
begin
kx:=x-z;
if g[i,z]+f[i+1,kx]>f[i,x] then //对后续分配总量一定时求其中最优的该阶段分配量
begin
f[i,x]:=g[i,z]+f[i+1,kx];
d[i,x]:=z;
end;
end;
end;
end;
//求解完毕
////////////////////////////////进行最优方案确定
xs[1]:=d[1,sb];
for i:=1 to gc do
begin
su:=0;
im:=i-1;
for j:=1 to im do
su:=su+xs[j]; //su是逆推时的1-j阶段分配量之和
ky:=sb-su;
xs[i]:=d[i,ky]; //对应求出该阶段的最优分配量
label4.caption:='最大盈利为:'+floattostr(f[1,sb])+#13+'设备的最佳分配方案是:'+#13;
for j:=1 to gc do
label4.caption:=label4.caption+'工厂A'+inttostr(j)+'分配'+inttostr(xs[j])+'台'+#13;
//输出最优方案
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -