19.2.プログラム:Quantitative System Performance

19.1.導入」の続きです。(目次はこちら

19.2.プログラム


 プログラムは以下の4ページに現れる。2つのステートメント・ラベル(2001と2003)は第20章での参照のために含まれており、プログラムでは使用されない。
 若干のFortran実装はフォーマットされたI/Oについて制約を課すことに注意しよう。プログラムを使用する時は実数の入力に(整数値の入力ではなくて)明示的な小数点を含ませることが最善である。

 program multpl
c
c 最大3クラスと25センターまで可能
c クラス2と3はおのおの最大10個の客までに制限される
c クラス1はその個体数について制限はない、
c
 integer Ncents,center,class
 integer n1,n2,n3
c
c Ncusts(c)はクラスcの個体数
c NはMVAが要求する一時的な個体数ベクトル
c
 integer Ncusts(3),N(3)
c
c demand(c,k)はクラスcのセンターkでのサービス要求時間
c
 real demand(3,25)
c
c qlen(class 2 pop.,class 3 pop.,k)は3次元配列で、
c クラス2とクラス3のネットワーク個体数の可能な各々の組合せ
c について個々のセンターkでの待ち行列長である。
c この繰返しの最も外側のクラスであるクラス1の個体数は添字として現れる
c 必要はない。個体数の添字は1から11まで変化し、これは0から10までの個体数
c を表現する。というのは若干のFortran実装は配列の添字の最小値を1に制限
c しているからである。
 real qlen(11,11,25)
c
c rtime(c,k)はクラスcのセンターkでの滞在時間
c
 real rtime(3,25)
c
c tput(c)とsysr(c)はクラスcのスループット応答時間である。
c
 real tput(3),sysr(3)
c
 write (6,5)
5 format (30h Input number of customers for)
 do 10 class = 1,3
  write (6,15) class
15  format (9h  Class ,i1,1h:)
  read (5,20) Mcusts(class)
20  format (i4)
10  continue
 write (6,25)
25 format (25h Input number of centers:)
 read (5,20) Ncents
 write (6,30)
30 format (25h Input service demand for)
 do 35 center=1,Ncents
  write (6,40) center
40  format (10h  Center ,i2,1h:)
  do 45 class=1,3
   if (Ncusts(class) .eq. 0) goto 45
   write (6,50) class
50   format (11h    Class ,i1,1h:)
   read (5,55) demand(class,center)
55   format (f8.4)
45   continue
35  continue
c
c ネットワークが記述されたので、評価を実行する。
c アルゴリズムは可能な全ての個体数ベクトルについて繰り返す。
c
 do 60 n1=0,Ncusts(1)
  do 65 n2=0,Ncusts(2)
   do 70 n3=0,Ncusts(3)
    if (n1+n2+n3 .eq. 0) goto 70
    N(1) = n1
    N(2) = n2
    N(3) = n3
c
c まず、個々のセンターでの滞在時間を計算する。
c
    do 80 class = 1,3
     sysr(class) = 0.0
     if (N(class) .eq. 0) goto 80
c
     N(class) = N(class) - 1
     do 85 center=1,Ncents
2001      rtime(class,center) =
 x      demand(class,center) *
 x      (1.0+qlen(N(2)+1,N(3)+1,center))
      sysr(class) = sysr(class)  +
 x      rtime(class,center)
85      continue
     N(class) = N(class) + 1
c
c 次に、リトルの法則を用いてシステム・スループットを計算する。
c
     tput(class) = N(class) / sysr(class)
80     continue
c
c 最後に、リトルの法則を用いてセンターの待ち行列長を計算する。
c
    do 90 center=1,Ncents
     qlen(n2+1,n3+1,center) = 0.0
     do 95 class=1,3
      if (N(class) .eq. 0) goto 95
2003      qlen(n2+1,n3+1,center) =
 x      qlen(n2+1,n3+1,center) +
 x      rtime(class,center) * tput(class)
95      continue
90     contnue
c
70    continue
65   continue
60  continue
c
c 結果をプリントする
c
 do 100 class=1,3
  if (Ncusts(class) .eq. 0) goto 100
c
  write (6,105) class
105  format (7h Class ,i1,1h:)
  write (6,110) tput(class)
110  format (22h  System throughput: ,f8.4)
  write (6,115) Ncusts(class) / tput(class)
115  format (25h  System response time: ,f8.4)
c
  write (6,120)
120  format (24h  Device utilizations: )
  do 125 center=1,Ncents
   write (6,130) center,tput(class)*demand(class,center)
130   format (i7,2h: ,f5.3)
125   contnue
c
  write (6,140)
140  format (25h  Device queue lengths: )
  do 145 center=1,Ncents
   write (6,150) center, tput(class)*rtime(class,center)
150   format (i7,2h; ,f8.4)
145   continue
c
100  continue
c
 end


第20章 負荷依存サービスセンター」に続きます。