mirea-projects/Second term/Discrete math/Задание_11.ipynb
2024-09-24 02:22:33 +03:00

380 lines
48 KiB
Plaintext
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "6059efcd",
"metadata": {},
"source": [
"# Графы"
]
},
{
"cell_type": "markdown",
"id": "2bb2048b",
"metadata": {},
"source": [
"## Связность и разреженность графов. "
]
},
{
"cell_type": "markdown",
"id": "dbe8a4df",
"metadata": {},
"source": [
"\n",
"![title](images/Снимок_экрана1.jpg)\n"
]
},
{
"cell_type": "markdown",
"id": "9b3416ff",
"metadata": {},
"source": [
"## Гигантсткие компоненты"
]
},
{
"cell_type": "markdown",
"id": "328b16c7",
"metadata": {},
"source": [
"\n",
"![title](images/Снимок_экрана2.jpg)\n"
]
},
{
"cell_type": "markdown",
"id": "fd5b6604",
"metadata": {},
"source": [
"## Диаметр сложных сетей"
]
},
{
"cell_type": "markdown",
"id": "dff99fcf",
"metadata": {},
"source": [
"\n",
"![title](images/Снимок_экрана3.jpg)\n"
]
},
{
"cell_type": "markdown",
"id": "34c62bab",
"metadata": {},
"source": [
"## Устойчивость гигантской компоненты"
]
},
{
"cell_type": "markdown",
"id": "b5bb7b77",
"metadata": {},
"source": [
"\n",
"![title](images/Снимок_экрана4.jpg)\n",
"\n",
"![title](images/Снимок_экрана4_1.jpg)\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "700c5810",
"metadata": {},
"source": [
"## Устойчивость к атакам на хабы"
]
},
{
"cell_type": "markdown",
"id": "31179960",
"metadata": {},
"source": [
"\n",
"![title](images/Снимок_экрана5.jpg)\n",
"\n",
"![title](images/Снимок_экрана5_2.jpg)\n",
"\n",
"![title](images/Снимок_экрана5_3.jpg)\n"
]
},
{
"cell_type": "markdown",
"id": "211e44bf",
"metadata": {},
"source": [
"## Степенной закон распределения вершин"
]
},
{
"cell_type": "markdown",
"id": "824edd9a",
"metadata": {},
"source": [
"\n",
"![title](images/Снимок_экрана6.jpg)\n"
]
},
{
"cell_type": "markdown",
"id": "42640b23",
"metadata": {},
"source": [
"## Задачи"
]
},
{
"cell_type": "markdown",
"id": "21d8b493",
"metadata": {},
"source": [
"### Задача 1. Рассмотрим модель случайных графов на n вершинах, в котором каждое из возможных ребер проводится независимо от всех остальных с с одной и той же вероятностью. Используя библиотеку NetworkX, сгегенрируйте граф на 1000 вершинах при р=0,003. Оцените разницу между количеством ребер и их ожидаемым количеством. Постройте график распределения вершин в log-log координатах. Оцените степенную зависимость закона распределения вершин. "
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "cc065936",
"metadata": {},
"outputs": [],
"source": [
"import networkx as nx\n",
"import matplotlib\n",
"matplotlib.rcParams['xtick.labelsize'] = 18\n",
"matplotlib.rcParams['ytick.labelsize'] = 18\n",
"import matplotlib.pyplot as plt\n",
"import pylab\n",
"%matplotlib inline\n",
"pylab.rcParams['figure.figsize'] = 10, 10"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "9dfe4c39",
"metadata": {},
"outputs": [],
"source": [
"G = nx.gnp_random_graph(1000, 0.003)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "2d19ab3c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ожидаемое количество рёбер: 1498\n",
"Колличество рёбер в графе: 1540\n"
]
}
],
"source": [
"## ваш код здесь для подсчета количества сгенерированных ребер и ожидаемого их количества\n",
"import itertools\n",
"\n",
"x = G.nodes()\n",
"number_of_nodes = len(list(itertools.combinations(x, 2)))\n",
"print(\"Ожидаемое количество рёбер:\", round(0.003 * number_of_nodes))\n",
"print(\"Колличество рёбер в графе: \", G.number_of_edges())"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "7b3aaf8c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA20AAANzCAYAAAA6LvAhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABxAklEQVR4nO3deXxU1f3/8fedhARiMpMF2RUQFWRREeJSviARFUGDoGxugCioVYuFr1a/LoBSrRVR+zNqrQjBBUvYxLogogiluCD4VSyiXyVsYQ/ZCFnn/P6YzpiYbTJZ5ibzej4eeUzm3nPv+dwJ7WPennvPsYwxRgAAAAAAW3IEuwAAAAAAQNUIbQAAAABgY4Q2AAAAALAxQhsAAAAA2BihDQAAAABsjNAGAAAAADZGaAMAAAAAGyO0AQAAAICNEdoAAAAAwMYIbQAA1JOFCxfKsix16dKlwr5Zs2bJsiwNHjy40evyx7p162RZlizLqrCvuuuyk8GDB8uyLM2aNSvYpQBAvSK0AYCNeb/ol/1xOBxyOp3q1KmTfvOb3+jOO+/U0qVLVVRUFOxy0YjWrVunWbNmaeHChcEupcGtXLlSs2bN0sqVK4NdCgAEBaENAJqItm3bqm3btmrTpo0sy1JGRoY2bdqkF154QWPGjFGHDh300ksvBbtMVKF169bq3r27Tj311Ho537p16zR79ux6C21RUVHq3r27unfvXi/nq08rV67U7Nmzawxtp556qrp3767WrVs3TmEA0EjCg10AAMA/Bw4cKPe+tLRU//73v7VmzRo9//zz2rlzp+644w5t2LBBr7/+eqW3uSF47rrrLt11113BLqNK559/vr7//vtgl1EnixYtCnYJANAgGGkDgCYqLCxMffr00fTp07Vt2zaNHz9ekvTmm2/qT3/6U5CrAwAA9YXQBgDNQFRUlFJTU9W3b19J0p/+9CdlZmZW2raoqEgvvPCCkpKS1Lp1a0VERKhdu3a6+uqr9f7771fbz/HjxzVz5kydddZZatWqldq0aaPhw4dr7dq1kqQuXbrIsqwKt+ylp6f7nslLT0/XTz/9pKlTp6pr166KjIysMMGF2+3WG2+8oeHDh6tt27aKiIjQySefrMsvv1yLFy+WMabaOrdt26apU6fqjDPOUFRUlKKjo3X22WfrwQcf1JEjR6o9tiafffaZRo4cqdatW6tVq1bq3r27HnzwQeXl5VV7XE0TkaxevVrXXHONOnXqpIiICDmdTp122mm6/PLLNXfuXN/f0/tZzp49W5L06aefVnjuseznX3ZyjuLiYj399NPq37+/YmNjZVmW1q1bJ6n6iUh+bc2aNRo2bJhOPvlktWrVSr169dKcOXNUUFBQaftJkybJsixNmjSpynNWNtmJt6bU1FRJUmpqaoVr9db/62utyvLly3XVVVf5/l21bdtWV111lVasWFHlMb+uf+nSpRo8eLDi4+MVFRWlc889V88995zcbneV5wCAOjEAANuaOXOmkWT8/b/rtLQ0X/v58+dX2J+enm569erla2NZlnG5XL73ksztt99e6bkPHjxoevbs6WvXokULExsb6zvPiy++aDp37mwkmQULFpQ7dufOnb7j3njjDRMdHW0kmaioKHPSSSeZzp07+9oePXrUDBo0qFxNv65xxIgRprCwsNI6n3zySeNwOHxto6KiTEREhO99+/btzZYtW/z6PH9t/vz55c7tcrl85+7Ro4eZN2+ekVTuery8f8uLL764wr7Zs2eXu76oqCjfZ+T9+eSTT4wxxuzevdu0bdvWnHTSSb6/Q9u2bcv9vPXWW75zX3zxxUaS+cMf/mB+85vfGEkmPDzcxMXFGcuyfOf95JNPqvy3tmDBAt91paSkGMuyjCQTGxtrwsPDfcf17dvXZGZmVjh+4sSJRpKZOHFilZ9t2T68Nm7caNq2bWtatmxpJJmWLVtWuNaNGzdWuNaZM2dWOH9hYaEZN26cr1aHw2Hi4uLK/T2vu+46U1RUVG39d955p+94779/78+ECROqvD4AqAtCGwDYWG1DW25urgkLC6v0C2ReXp7p0aOHkWQGDx5s1q1bZwoKCowxxmRlZZl58+b5gsKzzz5b4dxXXHGFkWRatWpl5s+f7zt29+7dZty4cSYiIsJERUXVGNqio6PNBRdcYL788kvf/h07dhhjjCkpKfF98T733HPNO++8Y44fP+6rPzU11bRp08ZIMvfcc0+FGl955RVfH3/84x/N/v37fefdvHmzueSSS4wk06lTJ5Obm+vXZ+r11Vdf+QLK4MGDzfbt240xxhQVFZnFixeb2NhY35f42oS29PR0X3CYPn262bdvn29fVlaW2bBhg/ntb39rNm/e7Nf5fs37eUZHR5vo6GizYMECk5+fb4wx5siRI+bo0aPGGP9CW1RUlGnRooUZM2aM2b17tzHGmPz8fPPiiy+ayMhII8mMGjWqwvGBhrbaHF/2WisLbTNmzPD9B4aHH37YHDt2zBhjTGZmpvmf//kf37X/4Q9/qLL/uLg4ExERYebNm2eys7ONMZ7P8NZbb/Udv3bt2mprBIBAENoAwMZqG9qMMeaMM84wksyAAQPKbX/00Ud9X/IrG00wxpjly5cbSaZ169amuLjYt33Dhg2+Ol577bUKx5WWlpqkpCRfm+pCW+fOnasMTIsWLfKNWmVlZVXaZvPmzcayLBMREWEOHjzo256Tk+MLTR988EGlxxYXF5t+/foZSeaZZ56ptE1Vhg0bZiSZM8880xd6yvrggw/KXeOvVRWy/v73v/vOWxu1DW2SzKpVq6ps509o8/ZXWlpaoY03MEsyX3zxRbl9wQ5te/fu9QXuBx54oNJjp0+f7hu5zMjIqLT/yv5te3n/Xd16663V1ggAgeCZNgBoZuLj4yWpwjNt8+fPlyRNnz5dLVq0qPTYkSNHyul06siRI/rqq69829PS0iR5nlm74YYbKhzncDj00EMP+VXfXXfdpejo6Er3eWu844475HK5Km3Tr18/9erVS0VFRfrkk09825ctW6asrCz17dtXQ4cOrfTY8PBwXXfddZI8z5D5Kysry9f+3nvvVatWrSq0GTp0qC666CK/z+kVGxsrScrNzdXx48drfby/evXqpeTk5Dqf56GHHpLDUfHrw80336xOnTpJkt56660691Ofli1bppKSErVs2VL3339/pW0eeughRUZGqri4WEuXLq20zSmnnKKJEydWum/EiBGSpG+++aZ+igaAMpjyHwBCwL59+7Rr1y5J0i233KKwsLAq23on1Ni1a5cuuOACSdKWLVskSYMGDapyoooBAwYoPDxcJSUl1dYyYMCASreXlpbqs88+k+SZtOPxxx+v8hzeQOq9JknauHGjJGn79u1q165dlceeOHGiwrE12bJli2+SiUsuuaTKdpdccok2bdrk93klz1T7rVu31v79+3XBBRfo9ttv16WXXqru3bvX67INVX3utREeHq6BAwdWus/hcGjw4MF6/fXXtXnz5jr3VZ+89SQmJsrpdFbaJi4uTv3799fGjRurrD8xMbHKv0mHDh0kVfyPJQBQHwhtANDMeL80JiQk+LZlZGT4fvd39sT8/Hzf74cPH5b0yxfTykRGRqp169YV1pP7tTZt2lS6PTMzU4WFhZKkY8eO1bpG7zUWFBRUOYthVcfW5NChQ77fO3bsWGU770hTbcTGxmrx4sW6/vrr9d133+nuu++WJLlcLg0aNEhjx47VuHHjqhwd9VdVn3tttG7dWpGRkVXu9342ZT8vO/DWU93fTvrl71dV/TExMVUeGx7u+UpVXFwcSIkAUC1ujwSAZiQvL08///yzJKlbt26+7aWlpb7ft2/fLuN5prnan8qmZ6+PkZ+qRvnK1vj+++/7VWPZqd29x48bN86vY9PT0+t8LfXl0ksv1c6dO7Vo0SJNnDhRZ5xxhrKzs/XOO+/opptuUt++fbVv37469VHd6CoAwN4IbQDQjHzwwQe+8FJ2PbCytwvW5rZAr5NPPllS+RG7XyssLKzTGmgJCQm+0YpAavReYyDH1qTsKFV14akuweqkk07STTfdpIULF+qHH37Q3r179eSTT6ply5blRuCC6ciRIyoqKqpyv/f6fz2q5/27VjcCmp2dXQ8VVs5bz969e6tt591fH6OSAFCfCG0A0EwUFRX5ngNzuVwaOXKkb1+XLl18t4a98847tT73eeedJ8mzkHNVNm7cWOPzbNVp0aKFzj//fEmB1eh9Zuurr77S/v37A66jMuedd55v8o2yk5/82scff1xvfXbs2FH33XefZsyYIcmzoHVZ3npMDQuN16eSkhJt2LCh0n3GGN+/j/79+5fbFxcXJ0nas2dPlef+/PPPq9xX12v11rN58+Yqw2FWVla5Z98AwE4IbQDQDJw4cUKTJk3S1q1bJUkPPPCAb1ZCrylTpkjyzNDobVeVX0+mMHr0aElSenq63nzzzQrtjTHVThzir6lTp0qS3nvvPb333nu1qnHMmDGKjY1VcXGxpk+fXu0XfLfbraysLL/rio2N1eWXXy5Jmjt3bqUjRh999JH+9a9/+X1OL+9zfFXxzlT56xkbvRNq1OY66sMf//hH36QsZaWmpvpC2bhx48rtO+eccyRJX375ZaXBbfv27Vq+fHmVfdb1Wq+99lqFh4eroKBATz75ZKVtHn/8cRUWFqpFixa69tprA+oHABoKoQ0Amii3261t27Zp3rx56tWrlxYvXixJuummm3TfffdVaD9jxgz16dNHBQUFSkpK0vPPP6+jR4/69mdlZen999/XhAkTKswQOHDgQF122WWSPOFv4cKFvrCxd+9e3XDDDdqwYYOioqLqdE033nijLr30UhljNGrUKM2ZM6fcLZnHjx/XJ598ojvvvFOnnXZauWNjY2P17LPPSvJMOX/llVfq888/9wUMt9ut7du36+mnn1avXr30j3/8o1a1PfbYYwoLC9P333+vK6+8Ujt27JDkGX1asmSJxo4dWyEo++PJJ5/UsGHD9Nprr5W7fa+wsFBLlizRU089JUm68soryx3Xu3dvSdJ3330XUFgMRFRUlP75z3/q+uuv99VaUFCgl19+WXfccYck6eqrr/aNmHolJycrOjpaxcXFGjt2rO+zKy4u1ttvv61LL71UJ510UpX9eq91w4YN+v7772tdd8eOHTVt2jRJ0p/+9CfNnDnTFwCzsrL08MMP+z7n6dOnq3379rXuAwAaVIOvBAcACFjZxbXbtm3r+4mNjTUOh8O3T/9ZEPull16q9nz79u0zF154oe8Yy7JMbGyscTqd5c51+umnVzh2//79pkePHr42LVq08C1m7XA4zMsvv2xOPfVUI8ksXry43LFlF9feuXNntTVmZ2ebq666qlw9TqfTxMbGGsuyfNvCw8MrPf7FF180ERERvnaRkZEmISHBtGjRotw5X3/99eo//Er89a9/LVeDy+UykZGRvgXB582bV+vFtcv+jSWZVq1amfj4+HL9nHXWWWb//v3ljisuLjbdu3f3tYmLizOdO3c2nTt3Nmlpab52VS04/Wv+LK7duXNn8/zzz/tqi4uLK/e5nnPOOebIkSOVnv+VV14pd00xMTG+v9OFF15onn/++So/u8zMTHPyySeX+7fuvdZNmzb5da2FhYVm7NixvnM4HA4TFxdX7n9H1113XaULz9d1cXAAqCtG2gCgiTh48KAOHjyoQ4cOqaSkRO3atdOFF16oO+64Q0uXLtW+fft02223VXuODh066J///KcWL16sESNGqH379srPz1dRUZG6dOmi5ORkPfvss1q/fn2FY9u1a6cvv/xSDz/8sLp37y6Hw6Hw8HANHz5cH3/8saZMmeJ7XiiQEScvp9Opd955R++9957GjRunU089VYWFhcrPz1fHjh11+eWX64knnvCN1vza7bffrh07dui///u/dc455ygyMlJZWVmKjo5W//79dffdd2vNmjW+RbZrY+rUqdq4caOSk5MVHx+v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bR577DG99957uv766/XNN9/opZde0t13312nggEAAAAglAT8TNuSJUtkWZZSUlIqDWxew4cPV0pKiowxeuuttwLtDgAAAABCUsDPtMXHxys/P195eXkKD69+wK6kpETR0dGKiopSZmZmQIU2FzzTBgAAAEDyPxsEPNJ24sQJRUVF1RjYJCk8PFxRUVE6ceJEoN0BAAAAQEgKOLS1bdtW2dnZ2r17d41t09PTlZWVpbZt2wbaHQAAAACEpIBD26BBg2SM0e9///tq12Ezxmj69OmyLEsXX3xxoN0BAAAAQEgKOLR5g9jKlSt1ySWXaO3atSouLvbtLy4u1kcffaSkpCStXLlSlmXp97//fb0UDQAAAAChok6Laz/zzDOaMWOGbxHt8PBwtW7dWpJ05MgRlZSU+Ebh5s2bp3vuuafuFTdxTEQCAAAAQGqEiUgk6fe//71WrVql7t27yxij4uJi7d+/X/v371dxcbGMMerZs6feeecdAhsAAAAABKBOI21lffvtt9q8ebMOHTokSWrTpo369++vPn361Mfpmw1G2gAAAABI/meDmufr91OfPn0IaAAAAABQz+p0eyQAAAAAoGER2gAAAADAxvy6PfKSSy6pl84sy9LatWvr5VwAAAAAEAr8Cm3r1q2rl868SwMAAAAAAPzjV2ibOXNmQ9cBAAAAAKhEvU35D/8w5T8AAAAAqZEW1wYAAAAANCxCGwAAAADYGKENAAAAAGzMr9B29tlna/ny5fXWaUZGhu666y49+eST9XZOAAAAAGiO/Apt27dv15gxY3TuuefqpZdeUmZmZkCdrV+/Xrfeequ6deumF198UW63O6DzAAAAAECo8Gv2yO+//1733nuv3n33XVmWpRYtWuiyyy7TwIEDdf755+ucc85RXFxcuWOKior0888/64svvtDnn3+ud999V3v27JExRieffLJmzpyp2267TWFhYQ12cXaSkpKilJQUlZaW6ocffmD2SAAAACDE+Tt7ZK2m/P/kk0/05JNPas2aNTLGlFssOywsTLGxsYqMjNSxY8d04sSJcscaY9ShQwfddtttuueeexQTExPAZTV9TPkPAAAAQGqg0OaVnp6uv/3tb1q9erX+93//V6WlpVW2bdu2rS6++GJdd911uuqqq0JmZK0qhDYAAAAAUgOHtrJyc3O1efNmZWRk6PDhwyooKFBC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69olAAAAAISMOoW22bNna86cOXK73fLn0Th/lggAAAAAAPwi4ND2xhtvaPbs2ZKkDh06aOjQoerQoYPCw+s8eAcAAAAA+I+AE1ZKSookacSIEVqyZIkiIiLqrSgAAAAAgEfAE5Fs27ZNlmXphRdeILABAAAAQAMJOLRZliWn06kOHTrUZz0AAAAAgDICDm09evRQfn6+CgsL67Me28rLy9OsWbN01VVXqV27drIsS5MmTQp2WQAAAACauYBD26233qri4mKlpaXVZz22deTIEc2ePVtbtmxR//79g10OAAAAgBAR8EQkU6ZM0bvvvqvf/e53OvXUUzVo0KD6rMt22rdvr71796pjx44qKChQq1atgl0SAAAAgBAQcGh79NFHdc4552jDhg1KSkrSgAEDdMEFFygmJqba4x555JFAuwyqyMhIdezYMdhlAAAAAAgxlvFnVexKOBwO32LZ3lP4s3h2aWlpIN3ZinekbeLEiVq4cGGtjs3JyZHL5VJ2dracTmfDFAgAAADA9vzNBgGPtA0aNMivkFaf8vPz9emnn+qrr77Sli1b9NVXX2n37t2SpJkzZ2rWrFk1niM3N1dPP/20li1bpp07dyosLExnnnmmxo8fr7vvvpvlCwAAAADYSsChbd26dfVYhn+++OILDR8+PODjd+3apcGDBys9PV2SFBUVpcLCQm3evFmbN2/WG2+8obVr1youLq6eKgYAAACAugl49shgiYuL05AhQ3Tvvfdq8eLFateunV/HlZSUKDk5Wenp6Wrfvr3WrFmj48ePKz8/X2+99ZZiYmK0detW3XjjjQ18BQAAAADgv4BH2oJh4MCByszMLLft/vvv9+vY1NRUffvtt5KkZcuW6aKLLpLkeTZv3Lhxcrvduv766/Xee+9p7dq1GjJkSP0WDwAAAAABaFIjbWFhYQEfm5qaKklKSkryBbayxo8fr65du0qSFi1aFHA/AAAAAFCfmlRoC1R+fr42btwoSRo2bFilbSzL0hVXXCFJ+vDDDxutNgAAAACoTpO6PTJQ27dvl9vtliT17t27ynbefQcOHFBmZqbi4+PL7X/++eeVlZWlkpISSdI333yjOXPmSPLMptncFxgHAAAA0PhCIrRlZGT4fq9ugeyy+zIyMiqEtrlz52rXrl2+91u3btXWrVsleZYcqCy0FRYWqrCw0Pc+Jyen9hcA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VFQU7HIAwDYIbQAANEPLli3TP//5Tw0fPlwXXHBBsMvxy6mnnqqbb75ZP/30k1JSUoJdDgDYBqENAIBmpri4WH/4wx8kSbNmzQpuMbX0P//zP2rRooXmzJmjrKysYJcDALZAaAMAoJlZtmyZfvrpJ/Xv31+JiYnBLqdWTj31VA0fPlyZmZl65ZVXgl0OANgCoQ0AgGbmpZdekiTdeOONQa4kMN66X375ZRljglwNAAQfoQ0A0CDeeOMNDRgwQDExMXK5XLrgggtq9SV827Ztmjp1qs444wxFRUUpOjpaZ599th588EEdOXKk2mPXr1+v5ORktW7dWq1atVL37t314IMPKi8vTwsXLpRlWerSpUuF48pOkGKM0SuvvKL/+q//UkJCgizL0sKFC8u1T09P1z333KNevXopOjpaUVFR6tGjh6ZNm6bdu3dXW2NRUZFeeOEFJSUlqXXr1oqIiFC7du109dVX6/333/frM6rMDz/8oE8//VSWZWn8+PEBnyc7O1uPPvqozjvvPDmdTrVq1UpnnHGG7rjjDv3888/VHnv8+HHNnDlTZ511llq1aqU2bdpo+PDhWrt2rSSpS5culX6eXsnJyYqJidGPP/6odevWBXwNANBsGAAA6pHb7TY333yzkWQkGcuyTFxcnHE4HEaSGT9+vJk4caKRZCZOnFjpOZ588klfe0kmKirKRERE+N63b9/ebNmypdJj//KXvxjLsnxtXS6X79izzjrLPPPMM0aS6dy5c4VjvXVNmDDBXHvttUaScTgcvvoXLFjga/v666+byMhIXz+RkZGmVatWvvcxMTFm9erVldaYnp5uevXqVe4zcrlcvveSzO23317bj953/ZJM9+7dq2yzc+dOXz87d+6ssH/btm2mU6dOvjYtW7Y0MTEx5a516dKllZ774MGDpmfPnr62LVq0MLGxsb7rfPHFF03nzp2NpHKf568NGTLESDL33XdfbT8CAGh2CG0AgHr13HPP+b6w33XXXebw4cPGGGOysrLMrFmzjGVZvi/xlYW2V155xUgy0dHR5o9//KPZv3+/McaYkpISs3nzZnPJJZcYSaZTp04mNze33LEbN270hb3LLrvM7NixwxhjTHFxsUlLSzPx8fEmLi6uxtAWHR1twsPDzdy5c012drYxxpjc3FyTkZFhjDHmww8/NA6Hw4SHh5v77rvP7Ny507jdbuN2u833339vxowZYyQZp9Npdu3aVa6PvLw806NHDyPJDB482Kxbt84UFBT4PqN58+aZ6OhoI8k8++yztf78R48ebSSZm266qco21YW2nJwc07VrVyPJdOzY0bz77rumtLTUGGPM119/bS688EJfcPv6668rnPuKK64wkkyrVq3M/Pnzfde2e/duM27cOBMREWGioqJqDG3/8z//YySZCy64oNafAQA0N4Q2AEC9OXHihImPj682NNx///2+wPDr0JaTk+MLdB988EGlxxcXF5t+/foZSeaZZ54pt887OtOzZ09fWCjr448/9vVdXWiTZP7yl79U2n9paak544wzjCTz17/+tdI2xhgzYsQII8lMmzat3PZHH33USDIXX3yxKSoqqvTY5cuXG0mmdevWpri4uMo+KnPKKacYSWbu3LlVtqkutP3pT3/yjZB9++23FY7NyckxXbp0MZLMlVdeWW7fhg0bfOd97bXXKhxbWlpqkpKSfG2qC21paWlGkgkPDzeFhYXVXzQANHM80wYAqDcffvihMjMzJUmPPPJIpW3uv/9+tWzZstJ9y5YtU1ZWlvr27auhQ4dW2iY8PFzXXXedJGn16tW+7ZmZmfr4448lSffee68iIyMrHJuUlKSBAwfWeB1xcXG67bbbKt23fv16/fjjj2rdurVuvfXWKs8xYcKECjVK0vz58yVJ06dPV4sWLSo9duTIkXI6nTpy5Ii++uqrGuv1MsZo//79kqSTTz7Z7+PK+vvf/y5JGj16tHr37l1hf0xMjO677z5J0vvvv6/s7GzfvrS0NEmeZ9ZuuOGGCsc6HA499NBDftXRunVrSVJJSYkOHz5cu4sAgGYmPNgFAACaj82bN0uSTjnlFJ1++umVtnG5XOrXr582btxYYZ932/bt29WuXbsq+zlx4oQkadeuXb5tW7du9U1ycvHFF1d57ODBg7Vhw4ZqryMxMVERERGV7vPWmJ2drQ4dOlR5jqKiogo17tu3z/f+lltuUVhYWJXH5+Xl+Y73d3HsrKwslZSUSJLi4+P9OubXNX/zzTeSpEsvvbTKdpdddpkkye12a8uWLUpKSpIkbdmyRZI0aNAgWZZV6bEDBgxQeHi4r86qlK3/8OHD6tixo/8XAgDNDKENAFBvDh06JEk1fsHu1KlTpdszMjIkSQUFBSooKKixv/z8fN/vZUdjqgtT/nz5b9OmTZX7vDUWFxfr4MGDNZ7LGzDLHiupxhkwvcpeY03KfmaVjTTWJDMzU6WlpZKq/5zK/v28f3Ppl79BdZ9/ZGSkWrdurQMHDlRbS6tWrXy/+/NvAQCaM26PBADYhjcwjBs3Tsbz3HW1P+np6ZWep6pRHn9VNwLmrfGCCy7wq0bv6F/ZYyXPaKI/x06aNMnvuhMSEny/Hzt2rBZXXL/q+vlL8t1mK5W/LgAIRYQ2AEC98Y5Q7du3r9p2Ve333hJZ9pZCf5V9hqvsiJa/ffurLjWWveUzkONrEhERIafTKal86PFXfHy8L7Du3bu3ynZl95UdlfT+Dar7/AsLC/0aZSxbf6DP5wFAc0FoAwDUm/79+0uS9uzZo59++qnSNjk5OVVOrjFgwABJ0ldffeWbUMNfffv29Y3wVLcgc10Xa/bWeODAAd8zfP7q0qWL77bDd955p051VKVnz56SVOMC2JWJiIjQ2WefLUm+hbAr89FHH0nyTCxy3nnn+bZ7f//000+rPHbjxo01Ps8mSTt37pQktW/fXrGxsTW2B4DmjNAGAKg3l112meLi4iRJjz32WKVt/vznP5d7zqusMWPGKDY2VsXFxZo+fXq5Wwt/ze12Kysry/c+Pj7eNyHG008/7ZsIpKz169fXOAlJTZKSknyTrPz+97+vtJ+yfj3iNWXKFEmeWSS3bt1aq2P9MWjQIEnSF198UetjJWn8+PGSpKVLl2rbtm0V9ufl5enPf/6zJGn48OFyuVy+faNHj5Ykpaen680336xwrDFGjz/+uF91fP7555J+uR4ACGWENgBAvWnVqpUefvhhSVJqaqruueceHT16VJJnhO2xxx7T448/XuXISWxsrJ599llJ0ltvvaUrr7xSn3/+udxutyRPUNu+fbuefvpp9erVS//4xz/KHT979mxZlqVt27ZpxIgR+vHHHyV5po1fvny5rr32Wl+oDFR4eLheeuklhYeH65///KcGDRqktWvXqri42Nfm559/1ksvvaTExES98MIL5Y6fMWOG+vTpo4KCAiUlJen555/3fUaSZwbI999/XxMmTPBreYJfGzx4sCTPTJ5ln6Hz1x133KGuXbuquLhYw4YN0/vvv+/7/L/99lsNHTpUO3fuVGRkpObMmVPu2IEDB/pmlpwyZYoWLlyowsJCSZ5bKm+44QZt2LBBUVFRNdbhDW3VzQQKACGj4ZeCAwCEktLSUnPTTTf5FlB2OBwmLi7OhIWFGUlm/PjxvkWsf724tteLL75oIiIifOeIjIw0CQkJpkWLFr5tkszrr79e4dhnnnmmXJvY2FgTGRlpJJnevXv79nfv3r3CsTXVVdaKFStMTEyMr58WLVqYhIQEX1/enzlz5lQ4dt++febCCy/0tbEsy8TGxhqn01nu2NNPP73GOn6tsLDQnHzyyUaS+fDDDyttU93i2sYY8+2335qOHTv62rRs2bJcbZGRkSYtLa3Sc+/fv9/06NGj3OfiXTDd4XCYl19+2Zx66qlGklm8eHGl59ixY4eRZCIiIsyhQ4dq/RkAQHPDSBsAoF45HA4tWrRIixYt0oUXXqhWrVqppKRE5513nl566aVKb5v7tdtvv107duzQf//3f+ucc85RZGSksrKyFB0drf79++vuu+/WmjVrfItsl3XPPfdo3bp1Gj58uOLi4lRQUKAuXbrooYce0meffea75bKuz0mNHDlS//d//6eZM2fq/PPPV3R0tLKyshQZGalzzjlHt956q1asWKF77723wrEdOnTQP//5Ty1evFgjRoxQ+/btlZ+fr6KiInXp0kXJycl69tlntX79+lrXFRERoZtvvlmS9MYbbwR0bb1799Z3332nWbNm6dxzz1V4eLgKCwvVrVs33X777fruu+98t0L+Wrt27fTll1/q4YcfVvfu3eVwOBQeHq7hw4fr448/1pQpU3wLclf1N/DWPWrUKCYhAQBJljHVPDAAAEAzc8MNN+jNN9/U5MmTNX/+/GCX0yB+/vlnnXnmmYqKitL+/ft10kknBbsknx9//FFnnnmmJGn37t065ZRTyu03xuiMM87QTz/9pE8//ZRn2gBAPNMGAAghP/zwg5YvXy5JuuKKK4JcTcM57bTTdMsttyg3N1cpKSnBLqecJ554QpJnlstfBzZJWrJkiX766ScNHTqUwAYA/8FIGwCgWXnkkUfUpk0bjRgxQp06dZLD4dDx48f1j3/8Q9OnT1dGRoZ69Oihb775Ri1atAh2uQ3m4MGDOv3009WqVSvt3Lmz0Ubbvv/+e82dO1cTJkxQ3759FRMT49v+5JNPauHChZKkRYsW6aabbip3rNvtVp8+ffT999/r66+/Vp8+fRqlZgCwO0IbAKBZGTlypN5++21JUosWLRQTE6OsrCzfDIgdO3bUBx98oN69ewezzEaxcuVKff311xozZox69erVKH1+/fXX6tu3r++9y+VScXGx8vPzfdt+97vf6bnnnqtw7N69e/XKK6+oa9eumjhxYqPUCwBNAaENANCsfPrpp/r73/+uf/3rX9q/f78yMzN10kkn6cwzz9RVV12lu+66S/Hx8cEus9nKzc3Vyy+/rI8++kg7duzQoUOHVFJSojZt2uiiiy7S1KlTNWTIkGCXCQBNCqENAAAAAGyMiUgAAAAAwMYIbQAAAABgY4Q2AAAAALAxQhsAAAAA2BihDQAAAABsjNAGAAAAADZGaAMAAAAAGyO0AQAAAICN/X9tlXfiozJoNgAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1000x1000 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# подсчет количества вершин каждой степени\n",
"degrees = dict()\n",
"for degree in dict(G.degree()).values():\n",
" if degree in degrees:\n",
" degrees[degree] += 1\n",
" else:\n",
" degrees[degree] = 1\n",
"# Ваш код для формирования такого же словаря, с помощью библиотечных функций\n",
"\n",
"\n",
"sorted_degree_values = sorted(degrees.keys())\n",
"counts = [degrees[d] for d in sorted_degree_values]\n",
"plt.loglog(sorted_degree_values, counts, ls='None', marker='o', color='r', markersize=8)\n",
"plt.xlabel(\"degree (log)\", fontsize=18)\n",
"plt.ylabel(\"number of vertices (log)\", fontsize=18)\n",
"plt.title(\"Degree distribution\", fontsize=18)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "f2b1060f",
"metadata": {},
"source": [
"### Задача 2. Найдите число компонено связности в графе из предыдущей задачи. Есть ли в нем гигантская уомпонента? Сколько в ней вершин, каков ее диаметр? Удажите из графа 10- ую часть вершин. Остентся ли в графе гигантская компонента? Сделайте исследование при какой доле вершин гигантская компонента разрушается."
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "24ccb3b0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"46\n",
"Graph with 950 nodes and 1535 edges\n",
"13\n"
]
}
],
"source": [
"components = nx.number_connected_components(G)\n",
"print (components)\n",
"giant_component_list = sorted(nx.connected_components(G), key=len, reverse=True) # reverse для сортировки по убыванию\n",
"giant_component = G.subgraph(giant_component_list[0])\n",
"print (G.subgraph(giant_component))\n",
"# print(len(max(nx.connected_components(G), key=len))) # количество вершин в гигантской компоненте\n",
"print (nx.diameter(giant_component))\n"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "172d4d3f",
"metadata": {},
"outputs": [],
"source": [
"# Ваш код здесь для удаления 10 процентов случайных вершин\n",
"import random\n",
"\n",
"H = G.copy()\n",
"for node in list(H.nodes()):\n",
" if random.random() < 0.1:\n",
" H.remove_node(node)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "7af62d1b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"895\n",
"57\n",
"831\n"
]
}
],
"source": [
"# вывести количество оставшихся вершин, количество компонент связности, гигантскую компоненту связности\n",
"comps = list(nx.connected_components(H))\n",
"print(H.order())\n",
"print(len(comps))\n",
"print(len(comps[0]))"
]
},
{
"cell_type": "markdown",
"id": "87d38664",
"metadata": {},
"source": [
"### Задача 3. Найдите число компонено связности в графе из предыдущей задачи. Есть ли в нем гигантская уомпонента? Сколько в ней вершин, каков ее диаметр? Удажите из графа 50 самых больших по степени вершин. Остентся ли в графе гигантская компонента? Сделайте исследование при какой доле вершин гигантская компонента разрушается."
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "2380c355",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"900\n",
"774\n"
]
}
],
"source": [
"# Ваш код здесь для удаления 50 вершин-хабов\n",
"H = G.copy()\n",
"nodes = sorted(H.nodes(), key=lambda v: H.degree(v), reverse=True)\n",
"for node in nodes[:100]:\n",
" H.remove_node(node)\n",
"\n",
"print(H.order())\n",
"print(len(next(nx.connected_components(H))))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "b8228d0a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"900\n",
"105\n",
"774\n"
]
}
],
"source": [
"# вывести количество оставшихся вершин, количество компонент связности, гигантскую компоненту связности\n",
"comps = list(nx.connected_components(H))\n",
"print(H.order())\n",
"print(len(comps))\n",
"print(len(comps[0]))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}