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


#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;

int main() {
    // === НАСТРОЙКА ЛОКАЛИЗАЦИИ ===
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
    
    srand(time(0));
    
    // Емкости накопителей
    const int ln11 = 12;
    const int ln12 = 7;
    const int ln21 = 16;
    
    // Времена обработки в каналах
    const int lk11 = 12, lk12 = 16, lk13 = 7;
    const int lk21 = 12, lk22 = 11;
    const int lk31 = 13, lk32 = 9;
    
    const int max_time = 1000;
    
    // Каналы
    int k11[2000] = {0}, k12[2000] = {0}, k13[2000] = {0};
    int k21[2000] = {0}, k22[2000] = {0};
    int k31[2000] = {0}, k32[2000] = {0};
    
    // Накопители
    int n11[2000][ln11] = {0};
    int n12[2000][ln12] = {0};
    int n21[2000][ln21] = {0};
    
    // Входные, выходные, потерянные заявки
    int INz[2000][3] = {0};
    int OUTz[2000][2] = {0};
    int LOSTz[2000][8] = {0};
    
    int inz = 0, outz = 0, lostz = 0;
    
    // Время в накопителях
    int time_in_h11[10000] = {0};
    int time_in_h12[10000] = {0};
    int time_in_h21[10000] = {0};
    
    // Генерация моментов ближайшего поступления заявок
    int ist1 = rand() % 10 + 1;
    int ist2 = rand() % 10 + 1;
    int ist3 = rand() % 10 + 1;
    
    int t = 0;
    
    // === ОСНОВНОЙ ЦИКЛ МОДЕЛИРОВАНИЯ ===
    while (t < max_time) {
        // 1. ВЫХОД ИЗ СИСТЕМЫ (3-я фаза)
        if (t > 0) {
            if (k31[t - 1] != k31[t] && k31[t - 1] != 0) {
                outz++;
                OUTz[t][0] = k31[t - 1];
            }
            if (k32[t - 1] != k32[t] && k32[t - 1] != 0) {
                outz++;
                OUTz[t][1] = k32[t - 1];
            }
        }
        
        // 2. ПЕРЕХОД ИЗ КАНАЛОВ 2-й ФАЗЫ В 3-ю
        if (t > 0) {
            // К21 -> К31 или К32
            if (k21[t - 1] != k21[t] && k21[t - 1] != 0) {
                if (k31[t] == 0) {
                    for (int i = t; i < t + lk31; i++) k31[i] = k21[t - 1];
                } else if (k32[t] == 0) {
                    for (int i = t; i < t + lk32; i++) k32[i] = k21[t - 1];
                } else {
                    lostz++;
                    LOSTz[t][0] = k21[t - 1];
                }
            }
            
            // К22 -> К31 или К32
            if (k22[t - 1] != k22[t] && k22[t - 1] != 0) {
                if (k31[t] == 0) {
                    for (int i = t; i < t + lk31; i++) k31[i] = k22[t - 1];
                } else if (k32[t] == 0) {
                    for (int i = t; i < t + lk32; i++) k32[i] = k22[t - 1];
                } else {
                    lostz++;
                    LOSTz[t][1] = k22[t - 1];
                }
            }
        }
        
        // 3. ПЕРЕХОД ИЗ НАКОПИТЕЛЯ Н21 В КАНАЛЫ К21 И К22
        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;
        }
        
        // 4. ПЕРЕХОД ИЗ 1-й ФАЗЫ В НАКОПИТЕЛЬ Н21
        if (t > 0) {
            // К11: блокировка при отсутствии мест
            if (k11[t - 1] != k11[t] && k11[t - 1] != 0) {
                if (n21[t][0] == 0) {
                    if (k21[t] == 0) {
                        for (int i = t; i < t + lk21; i++) k21[i] = k11[t - 1];
                    } else if (k22[t] == 0) {
                        for (int i = t; i < t + lk22; i++) k22[i] = k11[t - 1];
                    } else {
                        n21[t][0] = k11[t - 1];
                    }
                } else if (n21[t][ln21 - 1] != 0) {
                    k11[t] = k11[t - 1];
                } else {
                    for (int i = 0; i < ln21; i++) {
                        if (n21[t][i] == 0) {
                            n21[t][i] = k11[t - 1];
                            break;
                        }
                    }
                }
            }
            
            // К12: потеря при переполнении Н21
            if (k12[t - 1] != k12[t] && k12[t - 1] != 0) {
                if (n21[t][0] == 0) {
                    if (k21[t] == 0) {
                        for (int i = t; i < t + lk21; i++) k21[i] = k12[t - 1];
                    } else if (k22[t] == 0) {
                        for (int i = t; i < t + lk22; i++) k22[i] = k12[t - 1];
                    } else {
                        n21[t][0] = 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;
                        }
                    }
                }
            }
            
            // К13: потеря при переполнении Н21
            if (k13[t - 1] != k13[t] && k13[t - 1] != 0) {
                if (n21[t][0] == 0) {
                    if (k21[t] == 0) {
                        for (int i = t; i < t + lk21; i++) k21[i] = k13[t - 1];
                    } else if (k22[t] == 0) {
                        for (int i = t; i < t + lk22; i++) k22[i] = k13[t - 1];
                    } else {
                        n21[t][0] = 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;
                        }
                    }
                }
            }
        }
        
        // 5. ПЕРЕХОД ИЗ НАКОПИТЕЛЕЙ Н11 И Н12 В КАНАЛЫ 1-й ФАЗЫ
        // Н11 -> К11
        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;
        }
        
        // Н12 -> К12
        if (k12[t] == 0 && n12[t][0] != 0) {
            for (int i = t; i < t + lk12; i++) k12[i] = n12[t][0];
            for (int i = 0; i < ln12 - 1; i++) n12[t][i] = n12[t][i + 1];
            n12[t][ln12 - 1] = 0;
        }
        
        // Н12 -> К13
        if (k13[t] == 0 && n12[t][0] != 0) {
            for (int i = t; i < t + lk13; i++) k13[i] = n12[t][0];
            for (int i = 0; i < ln12 - 1; i++) n12[t][i] = n12[t][i + 1];
            n12[t][ln12 - 1] = 0;
        }
        
        // 6. ПОСТУПЛЕНИЕ НОВЫХ ЗАЯВОК ОТ ИСТОЧНИКОВ
        // И1 -> К11 или Н11
        if (ist1 == 0) {
            inz++;
            INz[t][0] = inz;
            if (n11[t][0] == 0) {
                if (k11[t] == 0) {
                    for (int i = t; i < t + lk11; i++) k11[i] = INz[t][0];
                } else {
                    n11[t][0] = INz[t][0];
                }
            } else 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;
                    }
                }
            }
            ist1 = rand() % 10 + 1;
        }
        
        // И2 -> К12 (потеря, если канал занят)
        if (ist2 == 0) {
            inz++;
            INz[t][1] = inz;
            if (k12[t] != 0) {
                lostz++;
                LOSTz[t][5] = INz[t][1];
            } else {
                for (int i = t; i < t + lk12; i++) k12[i] = INz[t][1];
            }
            ist2 = rand() % 10 + 1;
        }
        
        // И3 -> Н12
        if (ist3 == 0) {
            inz++;
            INz[t][2] = inz;
            if (n12[t][0] == 0) {
                if (k12[t] == 0) {
                    for (int i = t; i < t + lk12; i++) k12[i] = INz[t][2];
                } else if (k13[t] == 0) {
                    for (int i = t; i < t + lk13; i++) k13[i] = INz[t][2];
                } else {
                    n12[t][0] = INz[t][2];
                }
            } else if (n12[t][ln12 - 1] != 0) {
                lostz++;
                LOSTz[t][6] = INz[t][2];
            } else {
                for (int i = 0; i < ln12; i++) {
                    if (n12[t][i] == 0) {
                        n12[t][i] = INz[t][2];
                        break;
                    }
                }
            }
            ist3 = rand() % 10 + 1;
        }
        
        // 7. ОПРЕДЕЛЕНИЕ БЛИЖАЙШЕГО ВРЕМЕНИ ИЗМЕНЕНИЯ СОСТОЯНИЯ
        int min_time = 10000;
        
        // Поиск ближайшего события среди каналов
        for (int i = t + 1; i <= t + 1000; i++) {
            if (k11[i] != 0 && k11[i] != k11[i - 1]) { min_time = min(min_time, i); break; }
            if (k12[i] != 0 && k12[i] != k12[i - 1]) { min_time = min(min_time, i); break; }
            if (k13[i] != 0 && k13[i] != k13[i - 1]) { min_time = min(min_time, i); break; }
            if (k21[i] != 0 && k21[i] != k21[i - 1]) { min_time = min(min_time, i); break; }
            if (k22[i] != 0 && k22[i] != k22[i - 1]) { min_time = min(min_time, i); break; }
            if (k31[i] != 0 && k31[i] != k31[i - 1]) { min_time = min(min_time, i); break; }
            if (k32[i] != 0 && k32[i] != k32[i - 1]) { min_time = min(min_time, i); break; }
        }
        
        // Учёт времени поступления заявок от источников
        if (ist1 > 0) min_time = min(min_time, t + ist1);
        if (ist2 > 0) min_time = min(min_time, t + ist2);
        if (ist3 > 0) min_time = min(min_time, t + ist3);
        
        // 8. ПЕРЕНОС ДАННЫХ В НАКОПИТЕЛЯХ ДО БЛИЖАЙШЕГО СОБЫТИЯ
        for (int next_t = t + 1; next_t <= min_time; next_t++) {
            for (int i = 0; i < ln11; i++) n11[next_t][i] = n11[t][i];
            for (int i = 0; i < ln12; i++) n12[next_t][i] = n12[t][i];
            for (int i = 0; i < ln21; i++) n21[next_t][i] = n21[t][i];
            
            // Уменьшение счётчиков источников
            if (ist1 > 0) ist1--;
            if (ist2 > 0) ist2--;
            if (ist3 > 0) ist3--;
        }
        
        t = min_time;
        
        if (t > max_time) break;
    }
    
    // === СБОР СТАТИСТИКИ ===
    int idle_time_k11 = 0, idle_time_k12 = 0, idle_time_k13 = 0;
    int idle_time_k21 = 0, idle_time_k22 = 0;
    int idle_time_k31 = 0, idle_time_k32 = 0;
    int idle_count_k11 = 0, idle_count_k12 = 0, idle_count_k13 = 0;
    int idle_count_k21 = 0, idle_count_k22 = 0;
    int idle_count_k31 = 0, idle_count_k32 = 0;
    
    for (int step = 1; step <= max_time; 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++;
        }
        if (k31[step] == 0) {
            idle_time_k31++;
            if (step == 1 || k31[step - 1] != 0) idle_count_k31++;
        }
        if (k32[step] == 0) {
            idle_time_k32++;
            if (step == 1 || k32[step - 1] != 0) idle_count_k32++;
        }
        
        for (int i = 0; i < ln11; i++) {
            if (n11[step][i] != 0) time_in_h11[n11[step][i]]++;
        }
        for (int i = 0; i < ln12; i++) {
            if (n12[step][i] != 0) time_in_h12[n12[step][i]]++;
        }
        for (int i = 0; i < ln21; i++) {
            if (n21[step][i] != 0) time_in_h21[n21[step][i]]++;
        }
    }
    
    double avg_idle_phase1 = (double)(idle_time_k11 + idle_time_k12 + idle_time_k13) /
                              (idle_count_k11 + idle_count_k12 + idle_count_k13);
    double avg_idle_phase2 = (double)(idle_time_k21 + idle_time_k22) /
                              (idle_count_k21 + idle_count_k22);
    double avg_idle_phase3 = (double)(idle_time_k31 + idle_time_k32) /
                              (idle_count_k31 + idle_count_k32);
    
    double sum_h11 = 0, sum_h12 = 0, sum_h21 = 0;
    int count_h11 = 0, count_h12 = 0, count_h21 = 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_h12[id] > 0) {
            sum_h12 += time_in_h12[id];
            count_h12++;
        }
        if (time_in_h21[id] > 0) {
            sum_h21 += time_in_h21[id];
            count_h21++;
        }
    }
    
    double avg_wait_h11 = (count_h11 > 0) ? sum_h11 / count_h11 : 0.0;
    double avg_wait_h12 = (count_h12 > 0) ? sum_h12 / count_h12 : 0.0;
    double avg_wait_h21 = (count_h21 > 0) ? sum_h21 / count_h21 : 0.0;
    
    // === ВЫВОД В КОНСОЛЬ ===
    cout << "================================================================" << endl;
    cout << "РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ (Асинхронный спорадический алгоритм. Вариант 12)" << endl;
    cout << "================================================================" << endl;
    cout << fixed << setprecision(2);
    cout << "1. Всего пришло заявок: " << inz << endl;
    cout << "2. Обработано заявок: " << outz << endl;
    cout << "3. Было утеряно заявок: " << lostz << endl;
    cout << "   (Осталось в системе: " << (inz - outz - lostz) << ")" << endl;
    cout << "4. Среднее время простоя каналов по фазам:" << endl;
    cout << "   - Фаза 1 (К11, К12, К13): " << avg_idle_phase1 << " тактов" << endl;
    cout << "   - Фаза 2 (К21, К22): " << avg_idle_phase2 << " тактов" << endl;
    cout << "   - Фаза 3 (К31, К32): " << avg_idle_phase3 << " тактов" << endl;
    cout << "5. Среднее время простоя заявок в накопителях:" << endl;
    cout << "   - Накопитель Н11: " << avg_wait_h11 << " тактов" << endl;
    cout << "   - Накопитель Н12: " << avg_wait_h12 << " тактов" << endl;
    cout << "   - Накопитель Н21: " << avg_wait_h21 << " тактов" << endl;
    cout << "================================================================" << endl;
    
    // === ЗАПИСЬ В ФАЙЛ (КАК В ПРИЛОЖЕНИИ Г, НО С ГАРАНТИРОВАННЫМ ВЫВОДОМ ПОТЕРЬ) ===
    ofstream myfile("sync_spr.txt");
    myfile << "\xEF\xBB\xBF";  // BOM для UTF-8
    
    for (int t_idx = 1; t_idx <= max_time; t_idx++) {
        // Входные заявки от источников
        myfile << INz[t_idx][0] << "\t" << INz[t_idx][1] << "\t" << INz[t_idx][2] << "\t";
        
        // Накопитель Н11 (через запятую)
        for (int i = 0; i < ln11; i++) myfile << n11[t_idx][i] << ",";
        myfile << "\t";
        
        // Канал К11
        myfile << k11[t_idx] << "\t";
        
        // Накопитель Н12 (через запятую)
        for (int i = 0; i < ln12; i++) myfile << n12[t_idx][i] << ",";
        myfile << "\t";
        
        // Каналы К12, К13
        myfile << k12[t_idx] << "\t" << k13[t_idx] << "\t";
        
        // Накопитель Н21 (через запятую)
        for (int i = 0; i < ln21; i++) myfile << n21[t_idx][i] << ",";
        myfile << "\t";
        
        // Каналы К21, К22
        myfile << k21[t_idx] << "\t" << k22[t_idx] << "\t";
        
        // Каналы К31, К32
        myfile << k31[t_idx] << "\t" << k32[t_idx] << "\t";
        
        // ВЫХОДНЫЕ ЗАЯВКИ (в одной ячейке через запятую)
        myfile << OUTz[t_idx][0] << "," << OUTz[t_idx][1] << "\t";
        
        // ПОТЕРЯННЫЕ ЗАЯВКИ (в одной ячейке через запятую) - ВСЕ 8 элементов
        for (int i = 0; i < 8; i++) {
            myfile << LOSTz[t_idx][i];
            if (i < 7) myfile << ",";
        }
        
        myfile << endl;
    }
    myfile.close();
    
    cout << "\nРезультаты сохранены в файл sync_spr.txt" << endl;
    system("pause");
    
    return 0;
}