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

📄 unit1.pas

📁 用delphi语言实现运筹学资源分配问题程序
💻 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 + -