Загрузка данных
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <ctime>
using namespace std;
const int ln11 = 15, ln21 = 16, ln31 = 12;
// Добавлено время обслуживания для нового канала K23 (lk23 = 11 тактов)
const int lk11 = 13, lk12 = 12, lk13 = 10, lk21 = 13, lk22 = 12, lk23 = 11, lk31 = 13;
int k11[1050] = {0}, k12[1050] = {0}, k13[1050] = {0};
// Добавлен массив состояний для нового канала k23
int k21[1050] = {0}, k22[1050] = {0}, k23[1050] = {0}, k31[1050] = {0};
int n11[1050][ln11] = {0}, n21[1050][ln21] = {0}, n31[1050][ln31] = {0};
int inz = 0, outz = 0, lostz = 0;
int INz[1050][3] = {0}, OUTz[1050] = {0}, LOSTz[1050][8] = {0};
int time_in_h11[10000] = {0};
int time_in_h21[10000] = {0};
int time_in_h31[10000] = {0};
int main() {
setlocale(LC_ALL, "Russian");
int t;
srand(time(0));
for (t = 1; t <= 1000; t++) {
if (k31[t - 1] != k31[t] && k31[t - 1] != 0) {
outz++;
OUTz[t] = k31[t - 1];
}
if (k31[t] == 0 && n31[t][0] != 0) {
for (int i = t; i < t + lk31; i++) k31[i] = n31[t][0];
for (int i = 0; i < ln31 - 1; i++) n31[t][i] = n31[t][i + 1];
n31[t][ln31 - 1] = 0;
}
if (k21[t - 1] != k21[t] && k21[t - 1] != 0) {
if (n31[t][ln31 - 1] != 0) {
lostz++;
LOSTz[t][0] = k21[t - 1];
} else {
for (int i = 0; i < ln31; i++) {
if (n31[t][i] == 0) {
n31[t][i] = k21[t - 1];
break;
}
}
}
}
if (k22[t - 1] != k22[t] && k22[t - 1] != 0) {
if (n31[t][ln31 - 1] != 0) {
k22[t] = k22[t - 1];
} else {
for (int i = 0; i < ln31; i++) {
if (n31[t][i] == 0) {
n31[t][i] = k22[t - 1];
break;
}
}
}
}
// --- МОДИФИКАЦИЯ: Выход заявки из параллельного канала К23 во 3-ю фазу ---
if (k23[t - 1] != k23[t] && k23[t - 1] != 0) {
if (n31[t][ln31 - 1] != 0) {
lostz++;
LOSTz[t][7] = k23[t - 1]; // Свободный индекс 7 для фиксации потерь из К23
} else {
for (int i = 0; i < ln31; i++) {
if (n31[t][i] == 0) {
n31[t][i] = k23[t - 1];
break;
}
}
}
}
if (k21[t] == 0 && n21[t][0] != 0) {
for (int i = t; i < t + lk21; i++) k21[i] = n21[t][0];
for (int i = 0; i < ln21 - 1; i++) n21[t][i] = n21[t][i + 1];
n21[t][ln21 - 1] = 0;
}
if (k22[t] == 0 && n21[t][0] != 0) {
for (int i = t; i < t + lk22; i++) k22[i] = n21[t][0];
for (int i = 0; i < ln21 - 1; i++) n21[t][i] = n21[t][i + 1];
n21[t][ln21 - 1] = 0;
}
// --- МОДИФИКАЦИЯ: Распределение заявок из Фазы 1 во 2-ю фазу ---
// Заявка при выходе сначала пытается занять параллельный канал К23 (минуя накопитель Н21)
if (k11[t - 1] != k11[t] && k11[t - 1] != 0) {
if (k23[t] == 0) { // Если параллельный канал К23 свободен
for (int i = t; i < t + lk23; i++) k23[i] = k11[t - 1]; // Занимаем К23
} else { // Если К23 занят, отправляем стандартным путем в накопитель Н21
if (n21[t][ln21 - 1] != 0) { lostz++; LOSTz[t][1] = k11[t - 1]; }
else {
for (int i = 0; i < ln21; i++) if (n21[t][i] == 0) { n21[t][i] = k11[t - 1]; break; }
}
}
}
if (k12[t - 1] != k12[t] && k12[t - 1] != 0) {
if (k23[t] == 0) {
for (int i = t; i < t + lk23; i++) k23[i] = k12[t - 1];
} else {
if (n21[t][ln21 - 1] != 0) { lostz++; LOSTz[t][2] = k12[t - 1]; }
else {
for (int i = 0; i < ln21; i++) if (n21[t][i] == 0) { n21[t][i] = k12[t - 1]; break; }
}
}
}
if (k13[t - 1] != k13[t] && k13[t - 1] != 0) {
if (k23[t] == 0) {
for (int i = t; i < t + lk23; i++) k23[i] = k13[t - 1];
} else {
if (n21[t][ln21 - 1] != 0) { lostz++; LOSTz[t][3] = k13[t - 1]; }
else {
for (int i = 0; i < ln21; i++) if (n21[t][i] == 0) { n21[t][i] = k13[t - 1]; break; }
}
}
}
if (k11[t] == 0 && n11[t][0] != 0) {
for (int i = t; i < t + lk11; i++) k11[i] = n11[t][0];
for (int i = 0; i < ln11 - 1; i++) n11[t][i] = n11[t][i + 1];
n11[t][ln11 - 1] = 0;
}
if (k12[t] == 0 && n11[t][0] != 0) {
for (int i = t; i < t + lk12; i++) k12[i] = n11[t][0];
for (int i = 0; i < ln11 - 1; i++) n11[t][i] = n11[t][i + 1];
n11[t][ln11 - 1] = 0;
}
int ist1 = rand() % 10;
int ist2 = rand() % 10;
int ist3 = rand() % 10;
if (ist1 == 1) {
inz++; INz[t][0] = inz;
if (n11[t][ln11 - 1] != 0) { lostz++; LOSTz[t][4] = INz[t][0]; }
else {
for (int i = 0; i < ln11; i++) if (n11[t][i] == 0) { n11[t][i] = INz[t][0]; break; }
}
}
if (ist2 == 1) {
inz++; INz[t][1] = inz;
if (n11[t][ln11 - 1] != 0) { lostz++; LOSTz[t][5] = INz[t][1]; }
else {
for (int i = 0; i < ln11; i++) if (n11[t][i] == 0) { n11[t][i] = INz[t][1]; break; }
}
}
if (ist3 == 1) {
inz++; INz[t][2] = inz;
if (k13[t] == 0) {
for (int i = t; i < t + lk13; i++) k13[i] = INz[t][2];
} else {
lostz++; LOSTz[t][6] = INz[t][2];
}
}
for (int i = 0; i < ln11; i++) n11[t + 1][i] = n11[t][i];
for (int i = 0; i < ln21; i++) n21[t + 1][i] = n21[t][i];
for (int i = 0; i < ln31; i++) n31[t + 1][i] = n31[t][i];
}
int idle_time_k11 = 0, idle_time_k12 = 0, idle_time_k13 = 0;
int idle_time_k21 = 0, idle_time_k22 = 0, idle_time_k23 = 0, idle_time_k31 = 0;
int idle_count_k11 = 0, idle_count_k12 = 0, idle_count_k13 = 0;
int idle_count_k21 = 0, idle_count_k22 = 0, idle_count_k23 = 0, idle_count_k31 = 0;
for (int step = 1; step <= 1000; step++) {
if (k11[step] == 0) {
idle_time_k11++;
if (step == 1 || k11[step - 1] != 0) idle_count_k11++;
}
if (k12[step] == 0) {
idle_time_k12++;
if (step == 1 || k12[step - 1] != 0) idle_count_k12++;
}
if (k13[step] == 0) {
idle_time_k13++;
if (step == 1 || k13[step - 1] != 0) idle_count_k13++;
}
if (k21[step] == 0) {
idle_time_k21++;
if (step == 1 || k21[step - 1] != 0) idle_count_k21++;
}
if (k22[step] == 0) {
idle_time_k22++;
if (step == 1 || k22[step - 1] != 0) idle_count_k22++;
}
// --- МОДИФИКАЦИЯ: Сбор статистики по простоям для нового канала К23 ---
if (k23[step] == 0) {
idle_time_k23++;
if (step == 1 || k23[step - 1] != 0) idle_count_k23++;
}
if (k31[step] == 0) {
idle_time_k31++;
if (step == 1 || k31[step - 1] != 0) idle_count_k31++;
}
for (int i = 0; i < ln11; i++) if (n11[step][i] != 0) time_in_h11[n11[step][i]]++;
for (int i = 0; i < ln21; i++) if (n21[step][i] != 0) time_in_h21[n21[step][i]]++;
for (int i = 0; i < ln31; i++) if (n31[step][i] != 0) time_in_h31[n31[step][i]]++;
}
int total_time_phase1 = idle_time_k11 + idle_time_k12 + idle_time_k13;
int total_count_phase1 = idle_count_k11 + idle_count_k12 + idle_count_k13;
double avg_idle_phase1 = (total_count_phase1 > 0) ? (double)total_time_phase1 / total_count_phase1 : 0.0;
int total_time_phase2 = idle_time_k21 + idle_time_k22;
int total_count_phase2 = idle_count_k21 + idle_count_k22;
double avg_idle_phase2 = (total_count_phase2 > 0) ? (double)total_time_phase2 / total_count_phase2 : 0.0;
// --- МОДИФИКАЦИЯ: Расчет среднего времени одного простоя К23 ---
double avg_idle_k23 = (idle_count_k23 > 0) ? (double)idle_time_k23 / idle_count_k23 : 0.0;
int total_time_phase3 = idle_time_k31;
int total_count_phase3 = idle_count_k31;
double avg_idle_phase3 = (total_count_phase3 > 0) ? (double)total_time_phase3 / total_count_phase3 : 0.0;
double sum_h11 = 0, sum_h21 = 0, sum_h31 = 0;
int count_h11 = 0, count_h21 = 0, count_h31 = 0;
for (int id = 1; id <= inz; id++) {
if (time_in_h11[id] > 0) { sum_h11 += time_in_h11[id]; count_h11++; }
if (time_in_h21[id] > 0) { sum_h21 += time_in_h21[id]; count_h21++; }
if (time_in_h31[id] > 0) { sum_h31 += time_in_h31[id]; count_h31++; }
}
double avg_wait_h11 = (count_h11 > 0) ? sum_h11 / count_h11 : 0.0;
double avg_wait_h21 = (count_h21 > 0) ? sum_h21 / count_h21 : 0.0;
double avg_wait_h31 = (count_h31 > 0) ? sum_h31 / count_h31 : 0.0;
cout << "===== РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ (Вариант 13 - Модифицированный) =====" << endl;
cout << fixed << setprecision(2);
cout << "1. Всего пришло заявок: " << inz << endl;
cout << "2. Обработано заявок: " << outz << endl;
cout << "3. Было утеряно заявок: " << lostz << endl;
cout << " (Осталось в системе: " << (inz - outz - lostz) << ")" << endl;
cout << "\n4. Среднее время одного простоя каналов по каждой фазе:" << endl;
cout << " - Фаза 1 (К11, К12, К13): " << avg_idle_phase1 << " тактов" << endl;
cout << " - Фаза 2 (К21, К22): " << avg_idle_phase2 << " тактов" << endl;
cout << " - Канал К23 (параллельный): " << avg_idle_k23 << " тактов" << endl; // Вывод простоя для К23
cout << " - Фаза 3 (К31): " << avg_idle_phase3 << " тактов" << endl;
cout << "\n5. Среднее время простоя заявок в накопителе:" << endl;
cout << " - Накопитель Н11: " << avg_wait_h11 << " тактов" << endl;
cout << " - Накопитель Н21: " << avg_wait_h21 << " тактов" << endl;
cout << " - Накопитель Н31: " << avg_wait_h31 << " тактов" << endl;
cout << "=================================================" << endl;
ofstream myfile("determ.txt");
for (int t_idx = 1; t_idx <= 1000; t_idx++) {
myfile << INz[t_idx][0] << "\t" << INz[t_idx][1] << "\t" << INz[t_idx][2] << "\t";
for (int i = 0; i < ln11; i++) myfile << n11[t_idx][i] << ",";
myfile << "\t" << k11[t_idx] << "\t" << k12[t_idx] << "\t" << k13[t_idx] << "\t";
for (int i = 0; i < ln21; i++) myfile << n21[t_idx][i] << ",";
myfile << "\t" << k21[t_idx] << "\t" << k22[t_idx] << "\t" << k23[t_idx] << "\t"; // k23 включен в лог-файл
for (int i = 0; i < ln31; i++) myfile << n31[t_idx][i] << ",";
myfile << "\t" << k31[t_idx] << "\t" << OUTz[t_idx] << "\t";
for (int i = 0; i < 8; i++) myfile << LOSTz[t_idx][i] << ",";
myfile << endl;
}
myfile.close();
return 0;
}