Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

тпр2

.docx
Скачиваний:
0
Добавлен:
07.04.2025
Размер:
532.38 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего образования «Уфимский университет науки и технологий»

Кафедра ВМиК

Отчёт по лабораторной работе №2

на тему: «Логико-вероятностный метод»

по дисциплине: «Теория принятия решений»

Выполнили:

Студент группы: ПРО-432Б Ихсанова Э. А.

Видманов А. А.

Мустафин А. А.

Проверила: Нагимова И. А.

Уфа – 2025

Цель работы

Целью работы является освоение методов идентификации, оценки и управления информационными рисками.

Задачи

1. Изучение логико-вероятностного метода (ЛВМ).

2. Реализация ЛВМ в виде приложения.

Постановка задачи

Дано:

  1. Ресурс с номером i, для которого выделены опасные состояния Sij, , где m  число возможных состояний.

  2. Структура ОС и вероятности инициирующих событий (угроз) xk, .

Требуется найти:

Вероятности Pij реализации опасных состояний Sij, .

Пример

Описание ИС:

В качестве информационной системы для данной лабораторной работы была выбрана CRM-система для бизнеса.

Опасное состояние:

Х0 – Прерывание работы CRM

Х1 – Потеря данных

Х2 – Невыполнение контрактных обязательств

Инициализирующие события:

Х3 — Техническая ошибка на сервере

Х4 — Невозможно восстановить данные

Х5 — Юридические проблемы с клиентами

Рисунок 1. Дерево событий

Расчет ЛВМ:

Расчет вероятности отказа CRM:

Формула:

P(X0) = 1 - (1 - P(X3)) * (1 - P(X4)) * (1 - P(X5))

Подставляем значения:

P(X0) = 1 - (1 - 0.05) * (1 - 0.02) * (1 - 0.1)

P(X0) = 1 - (0.95 * 0.98 * 0.90)

P(X0) = 1 - 0.8361

P(X0) = 0.1639 (16.39% вероятность отказа системы)

Руководство пользователя

Шаг 1: Определение опасных состояний (рисков)

Вкладка "Опасные состояния":

  • Прерывание работы CRM.

  • Потеря данных.

  • Н евыполнение контрактных обязательств.

Шаг 2: Ввод вероятностей и потерь

  • Для Прерывания работы CRM вероятность: 0.05 (5% вероятность).

  • Для Потери данных вероятность: 0.02 (2% вероятность).

  • Для Невыполнения контрактных обязательств вероятность: 0.1 (10% вероятность).

Также ввод потери от каждого состояния:

  • Для Прерывания работы CRM потери: 100000 (потери из-за простоев в работе).

  • Для Потери данных потери: 200000 (потери из-за утраты данных и восстановления).

  • Д ля Невыполнения контрактных обязательств потери: 50000 (штрафы, убытки из-за потери клиентов).

Шаг 3: Добавление инициирующих событий и их вероятностей

Вкладка "Инициирующие события":

  • Техническая ошибка в сервере (для прерывания работы CRM) — вероятность: 0.01

  • Невозможно восстановить данные после сбоя (для потери данных) — вероятность: 0.05

  • Ю ридические проблемы с клиентами (для невыполнения контрактных обязательств) — вероятность: 0.02

Шаг 4: Добавление сценариев

На вкладке "Сценарии":

  • Создай сценарий "Технический сбой в CRM", который включает событие "Техническая ошибка в сервере".

  • С оздай сценарий "Потеря всех данных", который включает событие "Невозможно восстановить данные после сбоя".

Шаг 5: Расчет вероятности сценариев

Теперь рассчитаем вероятность сценариев:

Сценарий "Технический сбой в CRM":

  • Вероятность события: 0.01

  • Вероятность состояния: 0.05

  • Вероятность сценария: 0.01 * 0.05 = 0.0005 (0.05%)

Сценарий "Потеря всех данных":

  • Вероятность события: 0.05

  • Вероятность состояния: 0.02

  • Вероятность сценария: 0.05 * 0.02 = 0.001 (0.1%)

Шаг 6: Расчет рисков

Теперь рассчитаем риски для каждого состояния:

Сценарий "Технический сбой в CRM":

  • Риск = Вероятность сценария * Потери = 0.0005 * 100000 = 50

Сценарий "Потеря всех данных":

  • Риск = Вероятность сценария * Потери = 0.001 * 200000 = 200

Общий риск для системы:

  • Общий риск = Риск сценария 1 + Риск сценария 2 = 50 + 200 = 250

Шаг 7: Вывод результатов

П осле того как ты нажмешь кнопку "Рассчитать риск", программа отобразит:

Шаг 8: Сохранение и выход

П осле завершения анализа ты можешь нажать кнопку "Сохранить и выйти", чтобы все данные о рисках были сохранены в файл results.txt, и при следующем запуске программы они загрузятся.

Вывод

В ходе лабораторной работы был освоен метод идентификации, оценки и управления информационными рисками.

ПРИЛОЖЕНИЕ 1

import json import tkinter as tk from tkinter import ttk, messagebox # Функции для работы с данными def save_data(): with open("risk_data.json", "w") as f: json.dump(data, f, indent=4) def load_data(): try: with open("risk_data.json", "r") as f: return json.load(f) except (FileNotFoundError, json.JSONDecodeError): return {"states": {}, "initiating_events": {}, "scenarios": {}} def calculate_risk(probability, loss): return probability * loss def calculate_system_risk(): total_risk = 0 results_text.delete(1.0, tk.END) # Очищаем текстовое поле перед расчетом results_text.insert(tk.END, "Расчет рисков для сценариев:\n\n") for scenario, details in data["scenarios"].items(): event = details["event"] state = details["state"] event_probability = data["initiating_events"].get(event, 0) state_probability = data["states"].get(state, {}).get("probability", 0) loss = data["states"].get(state, {}).get("loss", 0) # Вероятность сценария = вероятность события * вероятность состояния scenario_probability = event_probability * state_probability scenario_risk = calculate_risk(scenario_probability, loss) total_risk += scenario_risk # Вывод информации о сценарии results_text.insert(tk.END, f"Сценарий: {scenario}\n") results_text.insert(tk.END, f" Инициирующее событие: {event} (вероятность: {event_probability:.4f})\n") results_text.insert(tk.END, f" Опасное состояние: {state} (вероятность: {state_probability:.4f}, потери: {loss:.4f})\n") results_text.insert(tk.END, f" Вероятность сценария: {scenario_probability:.4f}\n") results_text.insert(tk.END, f" Риск сценария: {scenario_risk:.4f}\n\n") results_text.insert(tk.END, f"Общий риск системы: {total_risk:.4f}\n") result_text.set(f"Общий риск ИС: {total_risk:.4f}") # Добавление опасного состояния def add_state(): state = state_entry.get().strip() if state and state not in data["states"]: data["states"][state] = {"probability": 0.0, "loss": 0.0} state_listbox.insert(tk.END, state) state_combobox["values"] = list(data["states"].keys()) state_entry.delete(0, tk.END) save_data() else: messagebox.showerror("Ошибка", "Состояние уже существует или поле пустое") # Добавление инициирующего события def add_event(): event = event_entry.get().strip() if event and event not in data["initiating_events"]: data["initiating_events"][event] = 0.0 event_listbox.insert(tk.END, event) event_combobox["values"] = list(data["initiating_events"].keys()) event_entry.delete(0, tk.END) save_data() else: messagebox.showerror("Ошибка", "Событие уже существует или поле пустое") # Добавление сценария def add_scenario(): scenario = scenario_entry.get().strip() event = event_combobox.get() state = state_combobox.get() if not scenario or not event or not state: messagebox.showerror("Ошибка", "Выберите инициирующее событие и опасное состояние") return if scenario not in data["scenarios"]: data["scenarios"][scenario] = {"event": event, "state": state} scenario_listbox.insert(tk.END, scenario) scenario_entry.delete(0, tk.END) save_data() else: messagebox.showerror("Ошибка", "Сценарий уже существует") # Ввод вероятностей и потерь def enter_probabilities(): selected_state = state_listbox.get(tk.ACTIVE) if selected_state: try: probability = float(probability_entry.get()) data["states"][selected_state]["probability"] = probability messagebox.showinfo("Успех", f"Вероятность для '{selected_state}' обновлена.") save_data() except ValueError: messagebox.showerror("Ошибка", "Введите корректное число для вероятности.") else: messagebox.showerror("Ошибка", "Выберите состояние для ввода вероятности.") def enter_losses(): selected_state = state_listbox.get(tk.ACTIVE) if selected_state: try: loss = float(loss_entry.get()) data["states"][selected_state]["loss"] = loss messagebox.showinfo("Успех", f"Потери для '{selected_state}' обновлены.") save_data() except ValueError: messagebox.showerror("Ошибка", "Введите корректное число для потерь.") else: messagebox.showerror("Ошибка", "Выберите состояние для ввода потерь.") # Ввод вероятности для инициирующих событий def enter_event_probability(): selected_event = event_listbox.get(tk.ACTIVE) if selected_event: try: probability = float(event_probability_entry.get()) data["initiating_events"][selected_event] = probability messagebox.showinfo("Успех", f"Вероятность для '{selected_event}' обновлена.") save_data() except ValueError: messagebox.showerror("Ошибка", "Введите корректное число для вероятности.") else: messagebox.showerror("Ошибка", "Выберите событие для ввода вероятности.") # Сохранение результатов в файл def save_results_to_file(): with open("results.txt", "w", encoding="utf-8") as f: f.write(results_text.get(1.0, tk.END)) messagebox.showinfo("Успех", "Результаты сохранены в файл results.txt") # Интерфейс root = tk.Tk() root.title("Оценка рисков ИС") notebook = ttk.Notebook(root) notebook.pack(fill="both", expand=True) # Вкладка "Опасные состояния" states_frame = ttk.Frame(notebook) notebook.add(states_frame, text="Опасные состояния") state_entry = tk.Entry(states_frame, width=30) state_entry.pack(side=tk.LEFT, padx=5) tk.Button(states_frame, text="Добавить", command=add_state).pack(side=tk.RIGHT, padx=5) state_listbox = tk.Listbox(states_frame, height=5) state_listbox.pack(fill="both", expand=True, pady=5) # Ввод вероятностей и потерь probability_entry = tk.Entry(states_frame, width=15) probability_entry.pack(side=tk.LEFT, padx=5) tk.Button(states_frame, text="Ввести вероятность", command=enter_probabilities).pack(side=tk.LEFT, padx=5) loss_entry = tk.Entry(states_frame, width=15) loss_entry.pack(side=tk.LEFT, padx=5) tk.Button(states_frame, text="Ввести потери", command=enter_losses).pack(side=tk.LEFT, padx=5) # Вкладка "Инициирующие события" events_frame = ttk.Frame(notebook) notebook.add(events_frame, text="Инициирующие события") event_entry = tk.Entry(events_frame, width=30) event_entry.pack(side=tk.LEFT, padx=5) tk.Button(events_frame, text="Добавить", command=add_event).pack(side=tk.RIGHT, padx=5) event_listbox = tk.Listbox(events_frame, height=5) event_listbox.pack(fill="both", expand=True, pady=5) # Ввод вероятности для инициирующих событий event_probability_entry = tk.Entry(events_frame, width=15) event_probability_entry.pack(side=tk.LEFT, padx=5) tk.Button(events_frame, text="Ввести вероятность", command=enter_event_probability).pack(side=tk.LEFT, padx=5) # Вкладка "Сценарии" scenarios_frame = ttk.Frame(notebook) notebook.add(scenarios_frame, text="Сценарии") scenario_entry = tk.Entry(scenarios_frame, width=30) scenario_entry.pack(side=tk.LEFT, padx=5) event_combobox = ttk.Combobox(scenarios_frame, width=30, state="readonly") event_combobox.pack(side=tk.LEFT, padx=5) state_combobox = ttk.Combobox(scenarios_frame, width=30, state="readonly") state_combobox.pack(side=tk.LEFT, padx=5) tk.Button(scenarios_frame, text="Добавить сценарий", command=add_scenario).pack(side=tk.RIGHT, padx=5) scenario_listbox = tk.Listbox(scenarios_frame, height=5) scenario_listbox.pack(fill="both", expand=True, pady=5) # Вкладка "Результаты" results_frame = ttk.Frame(notebook) notebook.add(results_frame, text="Результаты") result_text = tk.StringVar() tk.Label(results_frame, textvariable=result_text).pack() results_text = tk.Text(results_frame, height=15, width=80) results_text.pack(fill="both", expand=True, pady=5) tk.Button(results_frame, text="Рассчитать общий риск", command=calculate_system_risk).pack() tk.Button(results_frame, text="Сохранить результаты", command=save_results_to_file).pack() # Загрузка данных data = load_data() # Обновление Combobox state_combobox["values"] = list(data["states"].keys()) event_combobox["values"] = list(data["initiating_events"].keys()) root.mainloop()

Соседние файлы в предмете Теория принятия решений