Загрузка данных


#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;
}