参考資料として、
https://www.elsevier.com/books/probability-statistics-and-queueing-theory/allen/978-0-08-057105-8
を参考にしていきます。
(1) 重複組合せの計算(全ての組合せの算出)
まず、計算の難しさの部分で出てくる重複組合せの計算をしていきます。
重複組合せを再帰計算でやってみます。
重複組合せは
c種類のものから重複を許してn個選ぶ時の組合せ
cHn = c+n-1Cn
2H5 = 6C5 = 6通り(5,0),(4,1),(3,2),(2,3),(1,4),(0,5)
となります。この時、2種類でやる時は2重ループ、3種類でやる場合は3重ループになります。
public int[][] getCombination() {
int value[][] = new int[6][c];
int index = 0;
for(int i = 0; i <= n; i++) {//第1層
value[index][0] = i;
for(int j = 0; j <= n-i;j++) {//第2層
value[index][1] = j;
//最下層
value[index][2] = n - i - j;
index++;
}
}
return value;
}
これだと、種類が増えるごとにループが増えてしまうので、通常こういう場合は再帰計算でやります。
public void GetRecursive(int n, int c_index, int pre_i) {
if(c_index == c - 1) {
value[index][c_index] = n;
index ++;
return;
}
else {
for(int i = 0; i <= n; i++) {
if(index == this.combi)break;
if(c_index > 0) value[index][c_index - 1] = pre_i;
value[index][c_index] = i;
this.GetRecursive(n - i, c_index + 1, i);
if(c_index == c-1 ) c_index = 0;
}
}
}
例えば、n=5,c=3でやると
重複組合せ:個数21
重複組合せ:[[0, 0, 5], [0, 1, 4], [0, 2, 3], [0, 3, 2], [0, 4, 1], [0, 5, 0], [1, 0, 4], [1, 1, 3], [1, 2, 2], [1, 3, 1], [1, 4, 0], [2, 0, 3], [2, 1, 2], [2, 2, 1], [2, 3, 0], [3, 0, 2], [3, 1, 1], [3, 2, 0], [4, 0, 1], [4, 1, 0], [5, 0, 0]]
となります。[追記(2019/10/12)]
今回の場合は、クラスごとの最大数を制約として設定する必要があったので、追加しました。一旦出た解に対し、制約を満たしているものだけ取り出しました。ソースコードに関数として追加しました。
ソースコード
(確認すること)
・クラス間の移動が無いモデルでは、トラフィック方程式が必要無い?(初期のクラス人数だけで解けてしまう?)
0 件のコメント:
コメントを投稿