n)) { throw new InvalidParamException('Кількість СМО має бути цілим невід\'ємним числом'); } else { $this->k[ 0 ] = 0; for($i = 1; $i <= $this->n; $i++) { for($j = 1; $j <= $this->n; $j++) { $this->p[ $i ][ $j ] = 0; $this->r[ $i ] = 1; $this->mu[ $i ] = 0; } } } } public function attributeLabels() { return [ 'n' => 'Кількість систем масового обслуговування (n)', 'N' => 'Кількість вимог в мережі масового обслуговування (N)', 'p' => 'Матриця ймовірностей (pi,j)', 'K' => 'Показники системи масового обслуговування (K)', 'r' => 'Кількість каналів обслуговування (r)', 'mu' => 'Інтенсивність обслуговування каналом (1/μ)', 'e' => 'Коефіцієнт передачі (e)', 'b' => 'Початкова СМО (e = 1)', 'k' => 'Масив вимог', 'probs' => 'Допоміжні функції pi(k)', 'SMO' => 'Ймовірність перебування j вимоги в i-тій СМО PСМОi(j)', 'C' => 'Нормуючий множник (C(N))', 'L' => 'Середня кількість вимог у черзі СМОi (Li)', 'R' => 'Середня кількість зайнятих пристроїв у СМОi (Ri)', 'M' => 'Середня кількість вимог у СМОi (Mi)', 'La' => 'Інтенсивність вихідного потоку вимог у СМОii)', 'T' => 'Середній час перебування вимоги у СМОi (Ti)', 'Q' => 'Середній час очікування у черзі СМОi (Qi)', ]; } public function rules() { return [ [ [ 'b' ], 'required', ], [ [ 'N', ], 'integer', 'min' => 1, ], [ [ 'n' ], 'integer', 'min' => 2, 'max' => 3, 'message' => 'На даний момент допустимі значення кількості СМО лише 2 або 3', ], [ [ 'p', 'mu', ], 'safe', ], [ [ 'r' ], 'each', 'rule' => [ 'integer', 'min' => 1, ], ], [ [ 'mu' ], 'each', 'rule' => [ 'number', 'min' => 0, ], ], [ [ 'b' ], 'integer', 'min' => 1, ], [ [ 'b' ], 'compare', 'compareAttribute' => 'n', 'operator' => '<=', ], [ [ 'b' ], 'default', 'value' => 1, ], ]; } public function buildk() { if(!empty($this->N)) { for($i = 1; $i <= $this->N; $i++) { $this->k[$i] = $i; } } } public function buildE($antiloop = true) { $this->e[ $this->b ] = 1; for($k = 1; $k <= $this->n; $k++) { if($k == $this->b) { continue; } else { $this->e[ $k ] = ''; } } foreach($this->p as $i => $vals) { foreach($vals as $j => $val) { if($j == $this->b) { continue; } if($val != 0) { $this->e[ $j ] .= '{' . $i . '};'; } } } do { $iteration = 0; $found = 0; foreach($this->e as $i => $val) { if(!preg_match('/\{\d\}/', $val)) { foreach($this->e as $j => $value) { if(preg_match('/\{' . $i . '\}/', $this->e[ $j ])) { $this->e[ $j ] = preg_replace('/\{' . $i . '\}/', ( $this->p[ $i ][ $j ] * $val ), $this->e[ $j ]); $found = 1; } } } } if($antiloop) { $iteration++; } } while($found && $iteration < 100); foreach($this->e as $i => $val) { if(strpos($val, ';') !== false) { $this->e[ $i ] = array_sum(explode(';', $val)); } } } public function buildProbs() { for($q = 1; $q <= $this->n; $q++) { foreach($this->k as $k) { $prob = pow($this->e[ $q ] * $this->mu[ $q ], $k); if($k <= $this->r[ $q ]) { $prob = $prob * 1 / $this->factorial($k); } else { $prob = $prob * 1 / $this->factorial($this->r[ $q ]) * pow($this->r[ $q ], ( $k - $this->r[ $q ] )); } $this->probs[ $q ][ $k ] = $prob; unset( $prob ); } } } public function factorial($x) { $x = intval($x); if(!is_int($x) || $x < 0) { throw new Exception('Factorial must be greater than 0'); } $res = 1; for($i = 1; $i <= $x; $i++) { $res *= $i; } return $res; } public function buildC() { $result = 0; if($this->n == 2) { for($a = 0; $a <= $this->N; $a++) { $result += $this->probs[1][$a] * $this->probs[2][$this->N - $a]; } } elseif($this->n == 3) { for($a = 0; $a <= $this->N; $a++) { $sum = 0; for($b = 0; $b <= ( $this->N - $a ); $b++) { $sum += $this->findSum($b, $a); } $result += $sum * $this->probs[ 1 ][ $a ]; unset( $sum ); } } $this->C = pow($result, ( -1 )); } public function findSum($b, $a) { return $this->probs[ 2 ][ $b ] * $this->probs[ 3 ][ $this->N - $a - $b ]; } public function buildSMO() { for($q = 1; $q <= $this->n; $q++) { foreach($this->k as $k) { $sum = 0; if($this->n == 2) { if($q == 1) { $sum += $this->probs[1][$k]*$this->probs[2][$this->N - $k]; } elseif($q == 2) { $sum += $this->probs[1][$this->N - $k]*$this->probs[2][$k]; } } elseif($this->n == 3) { for($a = 0; $a <= ($this->N - $k); $a++) { if($q == 1) { $sum += $this->probs[1][$k]*$this->probs[2][$a]*$this->probs[3][($this->N - $k - $a)]; } elseif($q == 2) { $sum += $this->probs[1][$a]*$this->probs[2][$k]*$this->probs[3][($this->N - $k - $a)]; } elseif($q ===3) { $sum += $this->probs[1][$a]*$this->probs[2][($this->N - $k - $a)]*$this->probs[3][$k]; } } } $this->SMO[$q][$k] = $sum*$this->C; unset($sum); } } } public function testSMO() { $message = ''; foreach($this->SMO as $K => $vals) { $message .= 'SUM of SMO'.$K.': '; $sum = 0; foreach($vals as $val) { $sum += $val; } $message .= $sum.';
'; unset($sum); } return $message; } public function buildL() { for($i = 1; $i <= $this->n; $i++) { $sum = 0; for($j = ($this->r[$i] + 1); $j <= $this->N; $j++) { // Maybe error $sum += ($j - $this->r[$i]) * $this->SMO[$i][$j]; } $this->L[$i] = $sum; unset($sum); } } public function buildR() { for($i = 1; $i <= $this->n; $i++) { $sum = 0; for($j = 0; $j <= ($this->r[$i] - 1); $j++) { $sum += ($this->r[$i] - $j) * $this->SMO[$i][$j]; } $sum = $this->r[$i] - $sum; $this->R[$i] = $sum; unset($sum); } } public function buildM() { for($i = 1; $i <= $this->n; $i++) { $this->M[$i] = $this->L[$i] + $this->R[$i]; } } public function buildLa() { for($i = 1; $i <= $this->n; $i++) { $this->La[$i] = $this->R[$i] * pow($this->mu[$i], (-1)); } } public function buildT() { for($i = 1; $i <= $this->n; $i++) { $this->T[$i] = $this->M[$i] / $this->La[$i]; } } public function buildQ() { for($i = 1; $i <= $this->n; $i++) { $this->Q[$i] = $this->L[$i] / $this->La[$i]; } } }