From cc9b9e8aa0e9d2bc2e8944750d61933d60b3c26d Mon Sep 17 00:00:00 2001 From: "Alexey N. Alexandrov" Date: Wed, 1 May 2024 12:19:48 +0300 Subject: [PATCH] final(lab06): completed --- .../06-lab-information_warfare/__init__.py | 0 .../informational_warfare.ipynb | 487 ++++++++++++++++++ 2 files changed, 487 insertions(+) create mode 100644 game_theory/06-lab-information_warfare/__init__.py create mode 100644 game_theory/06-lab-information_warfare/informational_warfare.ipynb diff --git a/game_theory/06-lab-information_warfare/__init__.py b/game_theory/06-lab-information_warfare/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/game_theory/06-lab-information_warfare/informational_warfare.ipynb b/game_theory/06-lab-information_warfare/informational_warfare.ipynb new file mode 100644 index 0000000..b767757 --- /dev/null +++ b/game_theory/06-lab-information_warfare/informational_warfare.ipynb @@ -0,0 +1,487 @@ +{ + "cells": [ + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "# Лабораторная работа №6\n", + "### \"ИНФОРМАЦИОННОЕ ПРОТИВОБОРСТВО\"\n", + "\n", + "**Вариант:** 1\n", + "\n", + "**Цель работы:** изучить теоретико-игровую модель информационного противоборства в социальных сетях. Промоделировать информационное управление в рамках игры и определить итоговое мнение агентов." + ], + "id": "9e6e0d1cc72eca2" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:34.826140Z", + "start_time": "2024-05-01T09:18:34.819865Z" + } + }, + "cell_type": "code", + "source": [ + "import logging\n", + "\n", + "import numpy as np\n", + "\n", + "np.set_printoptions(precision=4, suppress=True)\n", + "logging.basicConfig(level=logging.INFO, format='%(message)s')" + ], + "id": "70d54f7e06433099", + "outputs": [], + "execution_count": 145 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:34.837880Z", + "start_time": "2024-05-01T09:18:34.834328Z" + } + }, + "cell_type": "code", + "source": [ + "# Размерность матрицы (количество агентов)\n", + "N = 10" + ], + "id": "94d9cc139e3130ea", + "outputs": [], + "execution_count": 146 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### 1. Генерация стохастической матрицы\n", + "В модели социальной сети рассматриваются агенты ($i \\in N = {1,2,..., n}, n \\in \\mathbb{N}$), составляющие эту сеть, и их\n", + "мнения $х_i$, зависящие от дискретного момента времени: $x_i = x_i(t), t = 0, 1, 2, ...$. \n", + "\n", + "В каждый момент времени мнения агентов изменяются под влиянием мнений других агентов. Степень этого влияния определяется неотрицательной стохастической по строкам матрицей $А = (a_{ij})$, где $a_{ij}$ — степень доверия $і$-го агента $j$-му агенту (в том числе и самому себе)." + ], + "id": "ad634312faebc072" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:34.898840Z", + "start_time": "2024-05-01T09:18:34.883166Z" + } + }, + "cell_type": "code", + "source": [ + "def generate_trust_matrix(n_agents):\n", + " matrix = np.random.rand(n_agents, n_agents)\n", + " # Нормализуем строки и столбцы, чтобы сумма значений в каждой строке была равна 1.\n", + " return matrix / matrix.sum(axis=1, keepdims=True)\n", + "\n", + "\n", + "# Функция для проверки стохастичности матрицы\n", + "def is_stochastic(matrix):\n", + " rows_sum = np.sum(matrix, axis=1)\n", + " logging.info(f\"Сумма по строкам: {rows_sum}\")\n", + " # Проверяем, что сумма значений в строках равна 1.\n", + " return np.allclose(rows_sum, 1)\n", + "\n", + "\n", + "# Генерируем стохастическую матрицу доверия\n", + "trust_matrix = generate_trust_matrix(N)\n", + "trust_matrix" + ], + "id": "1348edde50cd3a3e", + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.0596, 0.2094, 0.1181, 0.046 , 0.0328, 0.016 , 0.0385, 0.1899,\n", + " 0.18 , 0.1098],\n", + " [0.0032, 0.109 , 0.2126, 0.2052, 0.0927, 0.0323, 0.0477, 0.131 ,\n", + " 0.1413, 0.0249],\n", + " [0.0682, 0.0126, 0.1556, 0.0454, 0.1117, 0.1621, 0.1633, 0.1262,\n", + " 0.0412, 0.1137],\n", + " [0.1085, 0.1336, 0.0953, 0.0602, 0.1047, 0.1242, 0.105 , 0.0594,\n", + " 0.1243, 0.0849],\n", + " [0.1633, 0.0894, 0.1479, 0.1555, 0.0803, 0.1615, 0.0187, 0.1337,\n", + " 0.024 , 0.0256],\n", + " [0.1716, 0.0772, 0.1494, 0.1157, 0.1022, 0.0814, 0.1034, 0.088 ,\n", + " 0.0594, 0.0515],\n", + " [0.2128, 0.0158, 0.1367, 0.1927, 0.0395, 0.0106, 0.0838, 0.0727,\n", + " 0.073 , 0.1622],\n", + " [0.118 , 0.0033, 0.1733, 0.0807, 0.0736, 0.1446, 0.1676, 0.0688,\n", + " 0.0968, 0.0734],\n", + " [0.1025, 0.1518, 0.0704, 0.1241, 0.042 , 0.1823, 0.0186, 0.0781,\n", + " 0.0343, 0.1961],\n", + " [0.1524, 0.1751, 0.1337, 0.1684, 0.004 , 0.0591, 0.1133, 0.0493,\n", + " 0.1323, 0.0122]])" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 147 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:34.925074Z", + "start_time": "2024-05-01T09:18:34.906368Z" + } + }, + "cell_type": "code", + "source": "is_stochastic(trust_matrix)", + "id": "e4037067ed48f65b", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Сумма по строкам: [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 148, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 148 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### 2. Мнение агентов\n", + "\n", + "Вектор мнений $X = (x_1, x_2, ..., x_n)$ задан для начального момента времени ($X(0)$) и изменяется следующим образом:\n", + "$$x_i(t) = \\sum_{j = 0}^{n} a_{ij}x_{j}(t - 1)$$\n", + "\n", + "Этот закон можно записать иначе:\n", + "$$X(t) = A \\cdot X(t ー 1)$$\n", + "\n", + "При достаточно долгом взаимодействии агентов вектор мнений сходится к итоговому значению:\n", + "$$X = A^{\\infty} \\cdot X(0)$$\n", + ", где $A^{\\infty} = \\lim_{t \\to \\infty} A^{t}$." + ], + "id": "4e7d4347f2ea4e8" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:34.940092Z", + "start_time": "2024-05-01T09:18:34.934853Z" + } + }, + "cell_type": "code", + "source": [ + "def compute_final_opinions(trust_matrix, initial_opinions, epsilon=1e-6):\n", + " i = 0\n", + " logging.info(f\"x({i}) = {initial_opinions}\")\n", + " current_opinions = initial_opinions.copy()\n", + " previous_opinions = np.zeros_like(initial_opinions)\n", + " res_trust_matrix = trust_matrix.copy()\n", + " while np.linalg.norm(current_opinions - previous_opinions) > epsilon:\n", + " previous_opinions = current_opinions\n", + " current_opinions = np.dot(trust_matrix, current_opinions)\n", + " res_trust_matrix = np.dot(res_trust_matrix, trust_matrix)\n", + " i += 1\n", + " logging.info(f\"x({i}) = {current_opinions}\")\n", + "\n", + " return current_opinions, res_trust_matrix" + ], + "id": "501db75641b200ed", + "outputs": [], + "execution_count": 149 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:34.970165Z", + "start_time": "2024-05-01T09:18:34.947361Z" + } + }, + "cell_type": "code", + "source": [ + "a, b = 1, 20\n", + "# Генерируем начальные мнения агентов.\n", + "initial_opinions = np.random.randint(a, b + 1, N)\n", + "final_opinions, res_trust_matrix = compute_final_opinions(trust_matrix, initial_opinions)\n", + "print(f\"После взаимодействия агентов, вектор мнений сходится к значению:\\nX = {final_opinions}\")\n", + "print(f\"Результирующая матрица доверия:\\n{res_trust_matrix}\")" + ], + "id": "6ec9cd67efb6018b", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "x(0) = [ 6 2 4 6 19 5 20 19 3 18]\n", + "x(1) = [ 9.122 8.5571 12.0944 9.3996 8.4644 9.6723 10.0128 10.2833 9.1409\n", + " 7.0025]\n", + "x(2) = [9.3802 9.8509 9.6576 9.3308 9.7085 9.6184 9.3695 9.7644 9.0447 9.632 ]\n", + "x(3) = [9.5636 9.5271 9.5639 9.5319 9.57 9.531 9.4749 9.4951 9.5899 9.4832]\n", + "x(4) = [9.5337 9.5412 9.526 9.5365 9.5384 9.5374 9.5333 9.5338 9.5266 9.5391]\n", + "x(5) = [9.534 9.5331 9.5341 9.5346 9.5346 9.5341 9.5339 9.5332 9.5363 9.5338]\n", + "x(6) = [9.5341 9.5343 9.5341 9.5342 9.534 9.5341 9.5342 9.5343 9.534 9.5342]\n", + "x(7) = [9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5341 9.5342 9.5342]\n", + "x(8) = [9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342]\n", + "x(9) = [9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342]\n", + "x(10) = [9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "После взаимодействия агентов, вектор мнений сходится к значению:\n", + "X = [9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342 9.5342]\n", + "Результирующая матрица доверия:\n", + "[[0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]]\n" + ] + } + ], + "execution_count": 150 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### 3. Информационное управление\n", + "Для информационного управления необходимо наличие нескольких игроков (в данном случае - двух), которые могут влиять на начальные мнения некоторых агентов. Случайным образом выберем число и номера агентов первого игрока и аналогично число и номера агентов второго игрока (они не должны пересекаться, так как эта ситуация выходит за рамки данной работы). Следует обратить внимание, что число агентов влияния первого игрока не обязательно должно совпадать с числом агентов влияния второго игрока." + ], + "id": "9b66b35707f73d8c" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:34.980231Z", + "start_time": "2024-05-01T09:18:34.973888Z" + } + }, + "cell_type": "code", + "source": [ + "def get_player_agents_indices(n_agents):\n", + " # Генерируем случайное число агентов для каждого игрока (необязательно равное).\n", + " player1_count = np.random.randint(1, n_agents)\n", + " # Учитываем уже выбранных агентов для первого игрока.\n", + " player2_count = np.random.randint(1, n_agents - player1_count + 1) \n", + "\n", + " # Генерируем случайные неповторяющиеся индексы агентов для каждого игрока\n", + " player1_indices = np.random.choice(\n", + " range(n_agents), \n", + " size=player1_count, replace=False)\n", + " player2_indices = np.random.choice(\n", + " [idx for idx in range(n_agents) if idx not in player1_indices], \n", + " size=player2_count, replace=False)\n", + " \n", + " player1_indices.sort()\n", + " player2_indices.sort()\n", + " return player1_indices, player2_indices" + ], + "id": "404a8423cf6b8c5", + "outputs": [], + "execution_count": 151 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:35.008895Z", + "start_time": "2024-05-01T09:18:35.005534Z" + } + }, + "cell_type": "code", + "source": [ + "player1_influence_indices, player2_influence_indices = get_player_agents_indices(N)\n", + "print(f\"Индексы агентов влияния для первого игрока: {player1_influence_indices}\")\n", + "print(f\"Индексы агентов влияния для второго игрока: {player2_influence_indices}\")" + ], + "id": "2cb1f6b84204e8cc", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Индексы агентов влияния для первого игрока: [0 1 2 3 4 5 6 7 9]\n", + "Индексы агентов влияния для второго игрока: [8]\n" + ] + } + ], + "execution_count": 152 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "Затем сгенерируем случайным образом управление для агентов влияния первого и второго игроков.\n", + "Сформируем вектор начальных мнений агентов с учетом информационного влияния, нейтральным агентам назначим случайные стартовые мнения. " + ], + "id": "1295f9d7ea7f938" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:35.027752Z", + "start_time": "2024-05-01T09:18:35.023913Z" + } + }, + "cell_type": "code", + "source": [ + "ABS_MAX_INFLUENCE = 100\n", + "player1_influence = np.random.randint(0, ABS_MAX_INFLUENCE)\n", + "print(f\"Сформированное начальное мнение агентов первого игрока: {player1_influence}\")\n", + "player2_influence = np.random.randint(-ABS_MAX_INFLUENCE, 0)\n", + "print(f\"Сформированное начальное мнение агентов второго игрока: {player2_influence}\")" + ], + "id": "d5446b48a5ed3607", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Сформированное начальное мнение агентов первого игрока: 1\n", + "Сформированное начальное мнение агентов второго игрока: -37\n" + ] + } + ], + "execution_count": 153 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:35.065840Z", + "start_time": "2024-05-01T09:18:35.053069Z" + } + }, + "cell_type": "code", + "source": [ + "# Модифицируем начальные мнения агентов с учётом влияния.\n", + "for i in player1_influence_indices:\n", + " initial_opinions[i] = player1_influence\n", + " \n", + "for i in player2_influence_indices:\n", + " initial_opinions[i] = player2_influence\n", + "\n", + "final_opinions, res_trust_matrix = compute_final_opinions(trust_matrix, initial_opinions)\n", + "print(f\"После взаимодействия агентов, вектор мнений сходится к значению:\\nX = {final_opinions}\")\n", + "print(f\"Результирующая матрица доверия:\\n{res_trust_matrix}\")" + ], + "id": "8d61ada53e10a7", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "x(0) = [ 1 1 1 1 1 1 1 1 -37 1]\n", + "x(1) = [-5.8389 -4.3709 -0.5674 -3.7224 0.0886 -1.2574 -1.7744 -2.6765 -0.303\n", + " -4.029 ]\n", + "x(2) = [-2.5922 -1.9905 -2.0026 -2.3674 -2.7046 -2.5931 -3.1355 -2.084 -3.0314\n", + " -2.8545]\n", + "x(3) = [-2.4222 -2.3935 -2.5679 -2.5577 -2.3848 -2.4943 -2.5464 -2.5961 -2.4733\n", + " -2.4684]\n", + "x(4) = [-2.4916 -2.5138 -2.5078 -2.4791 -2.4989 -2.493 -2.5014 -2.5071 -2.4832\n", + " -2.4936]\n", + "x(5) = [-2.4999 -2.497 -2.4983 -2.4974 -2.497 -2.4971 -2.4937 -2.4962 -2.4966\n", + " -2.4964]\n", + "x(6) = [-2.4969 -2.497 -2.4967 -2.497 -2.4975 -2.4973 -2.4974 -2.4969 -2.4972\n", + " -2.4972]\n", + "x(7) = [-2.497 -2.497 -2.4971 -2.4971 -2.497 -2.4971 -2.497 -2.4971 -2.4971\n", + " -2.497 ]\n", + "x(8) = [-2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971\n", + " -2.4971]\n", + "x(9) = [-2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971\n", + " -2.4971]\n", + "x(10) = [-2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971\n", + " -2.4971]\n", + "x(11) = [-2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971\n", + " -2.4971]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "После взаимодействия агентов, вектор мнений сходится к значению:\n", + "X = [-2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971 -2.4971\n", + " -2.4971]\n", + "Результирующая матрица доверия:\n", + "[[0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]\n", + " [0.1113 0.0956 0.1393 0.1122 0.0708 0.0984 0.0911 0.1011 0.092 0.0882]]\n" + ] + } + ], + "execution_count": 154 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-05-01T09:18:35.071578Z", + "start_time": "2024-05-01T09:18:35.067718Z" + } + }, + "cell_type": "code", + "source": [ + "if np.isclose(final_opinions[0], 0):\n", + " print(\"Ничья\")\n", + "elif final_opinions[0] > 0:\n", + " print(\"Выиграл первый игрок\")\n", + "else:\n", + " print(\"Выиграл второй игрок\") " + ], + "id": "e99d6bd92410f867", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Выиграл второй игрок\n" + ] + } + ], + "execution_count": 155 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}