
тпр2
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования «Уфимский университет науки и технологий»
Кафедра ВМиК
Отчёт по лабораторной работе №2
на тему: «Логико-вероятностный метод»
по дисциплине: «Теория принятия решений»
Выполнили:
Студент группы: ПРО-432Б Ихсанова Э. А.
Видманов А. А.
Мустафин А. А.
Проверила: Нагимова И. А.
Уфа – 2025
Цель работы
Целью работы является освоение методов идентификации, оценки и управления информационными рисками.
Задачи
1. Изучение логико-вероятностного метода (ЛВМ).
2. Реализация ЛВМ в виде приложения.
Постановка задачи
Дано:
Ресурс с номером i, для которого выделены опасные состояния Sij,
, где m число возможных состояний.
Структура ОС и вероятности инициирующих событий (угроз) 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()