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

📄 unit3.pas

📁 交通运输当中的OD流量中OD矩阵的求解
💻 PAS
字号:
unit Unit3;

interface

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

type
  TForm3 = class(TForm)
    memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
   i,j,k,h,l:integer;
   b:array[1..8]of integer;
   a:array[1..8]of integer;
   x:array[1..8,1..8]of integer;
   x0:array[1..8,1..8]of integer;
   y:array[1..8,1..8]of integer;
   n:array[1..8]of integer;
   one:array[1..8]of integer;
   Myfile:TextFile;
   tempstr:string;
   list1:TStringList;
begin
   label1.Visible:=true;
   label1.caption:='i 进口进入干线,在 j 出口前仍在干线上的车辆数y[i,j]';
   for i:=1 to 8 do
      for j:=1 to 8 do
          x[i,j]:=0;
   x[1,2]:=1;x[1,3]:=1;x[1,4]:=1;x[1,5]:=1;x[1,6]:=1;x[1,7]:=1;x[1,8]:=1;
   x[2,4]:=1;x[2,5]:=1;x[2,6]:=1;x[2,7]:=1;x[2,8]:=1;
   x[3,4]:=1;x[3,5]:=1;x[3,6]:=1;x[3,7]:=1;x[3,8]:=1;
   x[4,6]:=1;x[4,7]:=1;x[4,8]:=1;
   x[5,6]:=1;x[5,7]:=1;x[5,8]:=1;
   x[6,8]:=1;x[7,8]:=1;

// x[i,j]存放干线OD矩阵表的特征,用0,1,2表示
   for i:=1 to 8 do
      for j:=1 to 8 do
         if ((x[i,j]=0) and (x[i,j+1]=1))then
             x[i,j+1]:=2;

   //读入数据到数组a[i],b[i]
   AssignFile(Myfile,'F:\OD\od.txt');
   Reset(Myfile);
   while not Eof(Myfile) do
   begin
     Readln(Myfile,b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8]);
     Readln(Myfile,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
   end;
   CloseFile(Myfile);
   


   //y[i,j]存放由i口进在j口前仍留在干线上的车辆数
   //首先给每行的第一列数字赋值b[i]
   for i:=1 to 8 do
      for j:=1 to 8 do
         if (x[i,j]=2)then
            y[i,j]:=b[i];

    //one[i]存放每一列的不为0的行数
  for i:=1 to 8 do
     begin
        one[i]:=0;
        n[i]:=0;
     end;
  for i:=1 to 8 do
      for j:=1 to 8 do
         if (x[i,j]<>0) then
             one[j]:=one[j]+1;


  for i:=1 to 8 do
      for j:=1 to 8 do
         if x[i,j]=0 then
           begin
             x0[i,j]:=0;
             y[i,j]:=0;
           end;




  l:=0;//存放第i列只有一个数据的列号
  for i:=1 to 8 do
       if one[i]=1 then
              begin
               x0[1,i]:=a[i];
               //n[i]:=y[1,i];
              end;

 for i:=2 to 8 do    //控制列号
   begin
      for k:=1 to 7 do
         if x[k,i]=1 then  //控制行号
            y[k,i]:=y[k,i-1]-x0[k,i-1];
      for j:=1 to 8 do   //第i列的y和
         n[i]:=n[i]+y[j,i];
      for j:=1 to 8 do
         if x[j,i]<>0 then
            x0[j,i]:=round(a[i]*y[j,i]/n[i]);
   end;


list1:=TstringList.create;
 for i:=1 to 8  do
     begin
       tempstr:='';
       for j:=1 to 8  do
            tempstr:=tempstr+inttostr(y[i,j])+#9+'';
       list1.Add(tempstr);
     end;
 showmessage('把修改后的OD流数据写入文本文件y[i,j].txt?');
 list1.saveTofile('F:\OD\y[i,j].txt');
 freeandnil(list1);
 Memo1.Lines.LoadFromFile('F:\OD\y[i,j].txt');

end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  memo1.clear;
  label1.visible:=false;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
   close;
end;

procedure TForm3.Button3Click(Sender: TObject);
var
   i,j,k,h,l:integer;
   b:array[1..8]of integer;
   a:array[1..8]of integer;
   x:array[1..8,1..8]of integer;
   x0:array[1..8,1..8]of integer;
   y:array[1..8,1..8]of integer;
   n:array[1..8]of integer;
   one:array[1..8]of integer;
   Myfile:TextFile;
   tempstr:string;
   list1:TStringList;
begin
   label1.Visible:=true;
   label1.caption:='i 进口进入干线,在 j 出口离开干线的车辆数x[i,j]';
   for i:=1 to 8 do
      for j:=1 to 8 do
          x[i,j]:=0;
   x[1,2]:=1;x[1,3]:=1;x[1,4]:=1;x[1,5]:=1;x[1,6]:=1;x[1,7]:=1;x[1,8]:=1;
   x[2,4]:=1;x[2,5]:=1;x[2,6]:=1;x[2,7]:=1;x[2,8]:=1;
   x[3,4]:=1;x[3,5]:=1;x[3,6]:=1;x[3,7]:=1;x[3,8]:=1;
   x[4,6]:=1;x[4,7]:=1;x[4,8]:=1;
   x[5,6]:=1;x[5,7]:=1;x[5,8]:=1;
   x[6,8]:=1;x[7,8]:=1;

// x[i,j]存放干线OD矩阵表的特征,用0,1,2表示
   for i:=1 to 8 do
      for j:=1 to 8 do
         if ((x[i,j]=0) and (x[i,j+1]=1))then
             x[i,j+1]:=2;

   //读入数据到数组a[i],b[i]
   AssignFile(Myfile,'F:\OD\od.txt');
   Reset(Myfile);
   while not Eof(Myfile) do
   begin
     Readln(Myfile,b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8]);
     Readln(Myfile,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
   end;
   CloseFile(Myfile);
   


   //y[i,j]存放由i口进在j口前仍留在干线上的车辆数
   //首先给每行的第一列数字赋值b[i]
   for i:=1 to 8 do
      for j:=1 to 8 do
         if (x[i,j]=2)then
            y[i,j]:=b[i];

    //one[i]存放每一列的不为0的行数
  for i:=1 to 8 do
     begin
        one[i]:=0;
        n[i]:=0;
     end;
  for i:=1 to 8 do
      for j:=1 to 8 do
         if (x[i,j]<>0) then
             one[j]:=one[j]+1;


  for i:=1 to 8 do
      for j:=1 to 8 do
         if x[i,j]=0 then
           begin
             x0[i,j]:=0;
             y[i,j]:=0;
           end;




  l:=0;//存放第i列只有一个数据的列号
  for i:=1 to 8 do
       if one[i]=1 then
              begin
               x0[1,i]:=a[i];
               //n[i]:=y[1,i];
              end;

 for i:=2 to 8 do    //控制列号
   begin
      for k:=1 to 7 do
         if x[k,i]=1 then  //控制行号
            y[k,i]:=y[k,i-1]-x0[k,i-1];
      for j:=1 to 8 do   //第i列的y和
         n[i]:=n[i]+y[j,i];
      for j:=1 to 8 do
         if x[j,i]<>0 then
            x0[j,i]:=round(a[i]*y[j,i]/n[i]);
   end;


list1:=TstringList.create;
 for i:=1 to 8  do
     begin
       tempstr:='';
       for j:=1 to 8  do
            tempstr:=tempstr+inttostr(x0[i,j])+#9+'';
       list1.Add(tempstr);
     end;
 showmessage('把修改后的OD流数据写入文本文件x[i,j].txt?');
 list1.saveTofile('F:\OD\x[i,j].txt');
 freeandnil(list1);
 Memo1.Lines.LoadFromFile('F:\OD\x[i,j].txt');


end;

procedure TForm3.Button4Click(Sender: TObject);
var
   i,j,k,h,l:integer;
   b:array[1..8]of integer;
   a:array[1..8]of integer;
   x:array[1..8,1..8]of integer;
   x0:array[1..8,1..8]of integer;
   y:array[1..8,1..8]of integer;
   n:array[1..8]of integer;
   one:array[1..8]of integer;
   Myfile:TextFile;
   tempstr:string;
   list1:TStringList;
begin
   label1.Visible:=true;
   label1.caption:=' j 出口前的干线断面总流量N[i],第一行表示出口编号:';
   for i:=1 to 8 do
      for j:=1 to 8 do
          x[i,j]:=0;
   x[1,2]:=1;x[1,3]:=1;x[1,4]:=1;x[1,5]:=1;x[1,6]:=1;x[1,7]:=1;x[1,8]:=1;
   x[2,4]:=1;x[2,5]:=1;x[2,6]:=1;x[2,7]:=1;x[2,8]:=1;
   x[3,4]:=1;x[3,5]:=1;x[3,6]:=1;x[3,7]:=1;x[3,8]:=1;
   x[4,6]:=1;x[4,7]:=1;x[4,8]:=1;
   x[5,6]:=1;x[5,7]:=1;x[5,8]:=1;
   x[6,8]:=1;x[7,8]:=1;

// x[i,j]存放干线OD矩阵表的特征,用0,1,2表示
   for i:=1 to 8 do
      for j:=1 to 8 do
         if ((x[i,j]=0) and (x[i,j+1]=1))then
             x[i,j+1]:=2;

   //读入数据到数组a[i],b[i]
   AssignFile(Myfile,'F:\OD\od.txt');
   Reset(Myfile);
   while not Eof(Myfile) do
   begin
     Readln(Myfile,b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8]);
     Readln(Myfile,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
   end;
   CloseFile(Myfile);
   


   //y[i,j]存放由i口进在j口前仍留在干线上的车辆数
   //首先给每行的第一列数字赋值b[i]
   for i:=1 to 8 do
      for j:=1 to 8 do
         if (x[i,j]=2)then
            y[i,j]:=b[i];

    //one[i]存放每一列的不为0的行数
  for i:=1 to 8 do
     begin
        one[i]:=0;
        n[i]:=0;
     end;
  for i:=1 to 8 do
      for j:=1 to 8 do
         if (x[i,j]<>0) then
             one[j]:=one[j]+1;


  for i:=1 to 8 do
      for j:=1 to 8 do
         if x[i,j]=0 then
           begin
             x0[i,j]:=0;
             y[i,j]:=0;
           end;




  l:=0;//存放第i列只有一个数据的列号
  for i:=1 to 8 do
       if one[i]=1 then
              begin
               x0[1,i]:=a[i];
               //n[i]:=y[1,i];
              end;


 for i:=2 to 8 do    //控制列号
   begin
      for k:=1 to 7 do
         if x[k,i]=1 then  //控制行号
            y[k,i]:=y[k,i-1]-x0[k,i-1];
      for j:=1 to 8 do   //第i列的y和
         n[i]:=n[i]+y[j,i];
      for j:=1 to 8 do
         if x[j,i]<>0 then
            x0[j,i]:=round(a[i]*y[j,i]/n[i]);
   end;

  list1:=TstringList.create;
  tempstr:='';
 for i:=1 to 8 do
       tempstr:=tempstr+inttostr(i)+#9+'';
       tempstr:=tempstr+#13;
 for i:=1 to 8  do
       tempstr:=tempstr+inttostr(n[i])+#9+'';
 list1.Add(tempstr);

 showmessage('把修改后的OD流数据写入文本文件N[i].txt?');
 list1.saveTofile('F:\OD\N[i].txt');
 freeandnil(list1);
 Memo1.Lines.LoadFromFile('F:\OD\N[i].txt');
end;

end.
 

⌨️ 快捷键说明

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