From a916a1fce2e6f955894b91ac7bb5f07dfd69d896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torma=20Krist=C3=B3f?= Date: Mon, 4 Jan 2021 00:47:57 +0100 Subject: [PATCH] Upload files to '' --- MernokiModellalkotasVizsga.ipynb | 214 +++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 MernokiModellalkotasVizsga.ipynb diff --git a/MernokiModellalkotasVizsga.ipynb b/MernokiModellalkotasVizsga.ipynb new file mode 100644 index 0000000..96c4830 --- /dev/null +++ b/MernokiModellalkotasVizsga.ipynb @@ -0,0 +1,214 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mérnöki modellalkotás vizsga\n", + "**Optikai hiba lokalizálás**\n", + "\n", + "_Torma Kristóf\tY8O353_\n", + "## Feladat\n", + "Adjon meg egy olyan bináris mátrixot, amelyiknek kevesebb oszlopa van, mint sora, és bármely legfeljebb 2 sor (bitenkénti) VAGY vektora egyedi. (Nem triviális 2-separable hibakód) Válaszodat indokold, és mondj olyan link hibákat, amelyeket a fenti m-trail mátrixszal azonosítani tudunk!\n", + "## Megoldás\n", + "A feladat megoldását a sorok és oszlopok számának meghatározásával kezdtem. A következő kifejezésekben a mátrix oszlopainak számát ```n```-nel jelöltem.\n", + "### Előkészületek\n", + "Mivel a bitenkénti ```VAGY``` műveletet minden sor esetében elvégezzük önmagán, ezért ```n+1``` sorú mátrix esetében legalább ```n+1``` vektort állítunk össze. Emellett mindegyik sorát a mátrixnak bitenként ```VAGY```-olunk minden másik sorával. Ez\n", + "\\begin{equation*}\n", + "\\frac{\\ n\\ast\\left(n+1\\right)}{2}\n", + "\\end{equation*}\n", + "darab vektort jelent. Tehát összesen\n", + "\\begin{equation*}\n", + "\\frac{\\ n\\ast\\left(n+1\\right)}{2}\\ +\\ n\\ +\\ 1\n", + "\\end{equation*}\n", + "darabszámú vektor fog keletkezni.\n", + "Triviális, hogy a keletkezett vektorok egyediségének szükséges feltétele az\n", + "\\begin{equation*}\n", + "\\frac{\\ n\\ast\\left(n+1\\right)}{2}\\ +\\ n\\ +\\ 1\\ <=\\ 2^n\n", + "\\end{equation*}\n", + "egyenlőtlenség teljesülése, hiszen n hosszú bináris vektorból\n", + "\\begin{equation*}\n", + "2^n\n", + "\\end{equation*}\n", + "darab van.\n", + "A mátrixot úgy alkottam meg, hogy a csupa nulla vektor és csupa egyes vektorokat ne használjam, ugyanis előbbi a hibátlan állapotot jelzi, utóbbi pedig minden másik vektorra VAGY-olva a csupa egyes vektort eredményezi, ezzel a feladat nem teljesülne.\n", + "\n", + "Az egyenlőtlenség legkisebb pozitív egész megoldása a négy (lásd lenti kód)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n = 4\n", + "\n", + "nsqrd = n ** 2\n", + "\n", + "print(f\"n^2: {nsqrd}\")\n", + "\n", + "numofrows = n + 1\n", + "\n", + "numofvectors = (((numofrows - 1) * (numofrows)) / 2) + numofrows\n", + "\n", + "print(f\"Vector count: {numofvectors}\")\n", + "\n", + "print(f\"Required condition satisfied: {numofvectors <= nsqrd}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Mátrix előállítása\n", + "A szükséges feltétel segítségével megállapíthattuk, hogy legalább négy oszlopos mátrixra lesz szükségünk. Négy bit viszont a feladat többi feltételét is figyelembe véve nem elengendő.\n", + "\n", + "Mivel a feladatban nem szerepel, hogy a legkisebb ilyen mátrixot kell megadni, ezért kezdetben hét oszloppal és nyolc sorral próbálkoztam ilyen mátrixot keresni. A mátrixot soronként készítettem el, minden sort úgy adtam hozzá a métrixomhoz, hogy a bitenkénti ```VAGY```-olással generált vektorok egyediek legyenek.\n", + "\n", + "Így kaptam meg az alábbi mátrixot:\n", + "\n", + "\\begin{equation}\n", + "\\begin{vmatrix}\n", + "1&0&0&0&0&1&0\\\\\n", + "0&1&0&0&1&0&0\\\\\n", + "0&0&1&1&0&0&0\\\\\n", + "0&0&1&0&0&1&0\\\\\n", + "1&0&0&0&0&0&1\\\\\n", + "0&1&1&0&0&0&0\\\\\n", + "1&0&0&0&1&0&0\\\\\n", + "0&0&0&1&0&0&1\n", + "\\end{vmatrix}\n", + "\\end{equation}\n", + "\n", + "Ennek helyességét az alábbi Python kóddal ellenőriztem:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip3 install -q numpy networkx matplotlib" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import numpy\n", + "\n", + "\n", + "mtx = \\\n", + "[\n", + " [1,0,0,0,0,1,0],\n", + " [0,1,0,0,1,0,0],\n", + " [0,0,1,1,0,0,0],\n", + " [0,0,1,0,0,1,0],\n", + " [1,0,0,0,0,0,1],\n", + " [0,1,1,0,0,0,0],\n", + " [1,0,0,0,1,0,0],\n", + " [0,0,0,1,0,0,1]\n", + "]\n", + "\n", + "vectors = [numpy.bitwise_or(mtx[i], mtx[j]) for i in range(len(mtx)) for j in range(i, len(mtx)) ]\n", + "\n", + "n = 7\n", + "nsqrd = n ** 2\n", + "numofrows = n + 1\n", + "numofvectors = (((numofrows - 1) * (numofrows)) / 2) + numofrows\n", + "\n", + "print(f\"All generated vectors in the Matrix are unique: \"\n", + " f\"{((len(vectors) == numofvectors) and (len(vectors) <= nsqrd)) and (len(vectors) == len(numpy.unique(vectors, axis=0)))}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Gráf előállítása\n", + "A mátrix elkészítése után láttam neki a az arra illeszkedő gráf elkészítésének. Egy olyan gráfot szerettem volna elkészíteni, aminek nyolc éle van és abban hét monitorozó út található.\n", + "\n", + "A gráfh hibakódtáblájával bármely egy vagy két link meghibásodása detektálható, hiszen a mátrix bármely két sorának bitenkénti ```VAGY```-olása egyedi vektort eredményez.\n", + "\n", + "A gráfhoz tartozó hibakódtábla:\n", + "\n", + "\\begin{array}{l|lllllll}\n", + "&t_1&t_2&t_3&t_4&t_5&t_6&t_7\\\\ \\hline\n", + "A-B&1&0&0&0&0&1&0\\\\\n", + "C-D&0&1&0&0&1&0&0\\\\\n", + "D-B&0&0&1&1&0&0&0\\\\\n", + "E-D&0&0&1&0&0&1&0\\\\\n", + "A-D&1&0&0&0&0&0&1\\\\\n", + "C-E&0&1&1&0&0&0&0\\\\\n", + "A-B&1&0&0&0&1&0&0\\\\\n", + "E-F&0&0&0&1&0&0&1\n", + "\\end{array}\n", + "\n", + "A gráfot kirajzoló kód:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import networkx\n", + "\n", + "G = networkx.Graph()\n", + "G.add_edges_from([(\"A\", \"B\"), (\"A\", \"C\"), (\"A\", \"D\"), (\"C\", \"D\"), (\"B\", \"D\"), (\"D\", \"E\"), (\"C\", \"E\"), (\"E\", \"F\")])\n", + "\n", + "node_positions = {\"A\": (0., 1.), \"B\": (1., 1.), \"C\": (0., 0.), \"D\": (1., 0.), \"E\": (0.5, -1.3), \"F\": (1., -1.3)}\n", + "\n", + "networkx.draw_networkx(G, pos=nx.rescale_layout_dict(node_positions), font_color=\"white\")\n", + "\n", + "edge_labels = \\\n", + "{ \n", + " ('A', 'B'): \"1000010\",\n", + " ('A', 'D'): \"1000001\",\n", + " ('C', 'A'): \"1000100\",\n", + " ('C', 'D'): \"0100100\",\n", + " ('D', 'B'): \"0011000\",\n", + " ('D', 'E'): \"0010010\",\n", + " ('C', 'E'): \"0110000\",\n", + " ('E', 'F'): \"0001001\"\n", + "}\n", + "el = nx.draw_networkx_edge_labels(G, pos=nx.rescale_layout_dict(node_positions), edge_labels=edge_labels)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}