{ "nbformat": 4, "nbformat_minor": 0, "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.7.6" }, "colab": { "name": "kl_py_maze_01.ipynb", "provenance": [], "collapsed_sections": [], "include_colab_link": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "L6PPJugj5kly", "colab_type": "text" }, "source": [ "

\n", " \n", " \n", "

\n", "\n", "\n", "

\n", "\n", "# Labirintus generálás és megoldás pythonnal.\n", "\n", "https://klajosw.blogspot.com/\n", "\n", "https://github.com/klajosw/\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": { "id": "BthzIA015klz", "colab_type": "text" }, "source": [ "--- \n", "\n", "A két fő megszorítás az, hogy legyen egy út a bejárattól a kijáratig, és szórakoztatónak kell lennie, ha a labirintust ceruzával, papírral és az agyi erővel oldja meg, nem túl könnyű, de nem is lehetetlen.\n", "\n", "Ahogy egy számítógépes labirintus modellezésére gondolok, úgy tűnik, hogy a grafikon lesz a megfelelő modell:\n", "a grafikon a rács négyzete, a grafikon szélei pedig a szomszédos négyzetek közötti nyílások. \n", "\n", "Tehát a grafikon milyen tulajdonságai eredményeznek jó labirintust\n", "\n", "\n", "- A bejárattól a kijáratig vezető útnak kell lennie.\n", "- Nem lehet túl sok ilyen út; talán a legjobb, ha csak egy van.\n", "- Valószínűleg a gráfot külön-külön össze kell kapcsolni, nem lehetnek olyan négyzet-szigetek, amelyek a kezdetektől elérhetetlenek. Valójában talán pontosan egy utat akarunk a két négyzet között.\n", "- Az útnak sok csavarral kell rendelkeznie; túl könnyű lenne, ha többnyire egyenes.\n", "\n", "Tudom, hogy a fa ezen tulajdonságokkal rendelkezik az utolsó kivételével. \n", "\n", "Tehát a célom így módosult: Helyezzünk a fát egy rácsra, amely minden négyzetet lefed, és ellenőrizzük, hogy az ösvények csavarodnak-e. \n", "\n", "Így tegyem meg:\n", "\n", "- Indítsa el a szélek nélküli rácsot (minden négyzetet mindkét oldalán falak vesznek körül).\n", "- A bal felső sarokban és a jobb alsó sarokban adja hozzá a széleket (azaz le kell falakat) a bejárathoz.\n", "- Helyezze a fa gyökerét valamilyen négyzetre.\n", "- Ezután ismételje meg, amíg a fa nem fedezi az egész rácsot:\n", "   * Válasszon ki egy csomópontot a fában.\n", "   * Véletlenszerűen válassza ki a szomszédot, amelyet még nem adtak hozzá a fához.\n", "   * Adjon hozzá egy szélt (leüt a falon) a csomóponttól a szomszédhoz.\n", " \n", "\n", "Az alábbi példában az A gyökér a bal felső sarokban van, és két ága van, Az \"A-B-C-D\" és az \"A-b-c-d\" véletlenszerűen választottak (nos, valójában nem véletlenszerűen; ugyanazt a labirintust kezdenek létrehozni):\n", "\n", " o o--o--o--o--o--o--o--o--o--o\n", " | A b c| | | | | | | |\n", " o o--o o--o--o--o--o--o--o--o\n", " | B| | d| | | | | | | |\n", " o o--o--o--o--o--o--o--o--o--o\n", " | C D| | | | | | | | |\n", " o--o--o--o--o--o--o--o--o--o--o\n", " | | | | | | | | | | |\n", " o--o--o--o--o--o--o--o--o--o--o\n", " | | | | | | | | | | |\n", " o--o--o--o--o--o--o--o--o--o o\n", "\n", "\n", "---\n", " \n", "Ezután kiválasztom a \"d\" csomópontot, és kiterjesztem az \"e\" -re \n", "(ezen a ponton nincsenek elérhető szomszédok, tehát az \"e\" -et a jövőben nem választjuk meg), \n", "\n", "majd a \"D\" -et választom, és onnan kiterjesztem az összes az \"N\" módhoz, minden lépésben kiválasztva az éppen hozzáadott csomópontot:\n", "\n", " o o--o--o--o--o--o--o--o--o--o\n", " | A b c| | | | | | | |\n", " o o--o o--o--o--o--o--o--o--o\n", " | B| e d| | N| | | | | |\n", " o o--o--o--o o--o--o--o--o--o\n", " | C D| | | M| | | | | |\n", " o--o o--o--o o--o--o--o--o--o\n", " | F E| | K L| | | | | |\n", " o o--o--o o--o--o--o--o--o--o\n", " | G H I J| | | | | | |\n", " o--o--o--o--o--o--o--o--o--o o\n", " \n", "Folytassa így, amíg a rács minden négyzetét hozzáadja a fához. Ezen a ponton lesz egy út a kezdetektől a célokig. Néhány falak megmaradnak; néhányat leütönek.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "CQsTvX-j5kl0", "colab_type": "text" }, "source": [ "---\n", "\n", "# Véletlenszerű fák készítése\n", "\n", "A következő végrehajtási döntéseket hozom:\n", "\n", "- A fa élek halmaza.\n", "- Az „él” egy csomópont két csomópontból. Az élek kétirányúak, így a félreértés elkerülése érdekében mindig a rendezett sorrendben fogjuk megkapni: mindig `(A, B)`, soha `(B, A)`. A „szél” kivitelező ezt kényszeríti.\n", "- A fában lévő csomópont bármi lehet: szám, betű, ... Ebben a jegyzetfüzetben fákat készítünk, ahol a csomópontok négyzet alakban vannak egy rácsban, de a \"random_tree\" függvény bármilyen típusú csomópontot elfogad.\n", "- A \"random_tree (csomópontok, szomszédok, pop)\" algoritmus a következőképpen működik:\n", "  * Az érvek:\n", "    - \"csomópontok\": csomópontok gyűjteménye.\n", "    - \"szomszédok\": olyan funkció, hogy a \"szomszédok (csomópont)\" egy csomópontkészletet ad vissza.\n", "    - \"pop\": olyan funkció, hogy a \"pop (frontier)\" eltávolítja és visszatér egy elemet a \"határról\".\n", "  * A funkció három gyűjteményt nyomon követi:\n", "    - \"fa\": a fa éleinek halmaza.\n", "    - \"csomópontok\": azon csomópontok halmaza, amelyeket még nem adtak hozzá a fához, de lesznek.\n", "    - \"határ\": a fában lévő csomópontok sora, amelyek jogosultak egy él hozzáadásához.\n", "  * Minden iteráción:\n", "    - A „pop” gombbal válasszon ki egy „csomópontot” a határról, és keresse meg azokat a szomszédokat, akik még nem vannak a fában.\n", "    - Ha vannak szomszédok, véletlenszerűen válasszon egyet (`nbr`), adjon hozzá` él (csomópont, nbr) `-t a` fához `, távolítsa el a\n", "      szomszédját a \"csomópontokból\", és tartsa a csomópontot és a szomszédot a határon. Ha nincsenek szomszédok,\n", "      dobja el a csomópontot a határról.\n", "  * Ha nincsenek \"csomópontok\", tegyük vissza a \"fát\".\n", "\n", "\n", "\n", "---" ] }, { "cell_type": "code", "metadata": { "id": "7EzyC9Q-5kl0", "colab_type": "code", "colab": {} }, "source": [ "import random\n", "from collections import deque, namedtuple\n", "\n", "Edge = tuple\n", "Tree = set\n", "\n", "def edge(A, B) -> Edge: return Edge(sorted([A, B]))\n", "\n", "def random_tree(nodes, neighbors, pop=deque.pop) -> Tree:\n", " \"\"\"Repeat: pop a node and add edge(node, nbr) until all nodes have been added to tree.\"\"\"\n", " tree = Tree()\n", " nodes = set(nodes)\n", " root = nodes.pop()\n", " frontier = deque([root])\n", " while nodes:\n", " node = pop(frontier)\n", " nbrs = neighbors(node) & nodes\n", " if nbrs:\n", " nbr = random.choice(list(nbrs))\n", " tree.add(edge(node, nbr))\n", " nodes.remove(nbr)\n", " frontier.extend([node, nbr])\n", " return tree" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "WrwLF8aR5kl4", "colab_type": "text" }, "source": [ "---\n", "\n", "# Véletlenszerű labirintus készítése\n", "\n", "Most használjuk a `random_tree` funkciót a `random_maze` megvalósításához. \n", "\n", "Alapvetően csak `(x, y)` négyzetek gyűjteményét készítjük, ezeket átvisszük a `random_tree` -re, és hagyjuk, hogy a munka megtörténjen. \n", "\n", "Vegye figyelembe, hogy:\n", "\n", "A labirintus egy elnevezett tuple, amely három mezővel rendelkezik: a rács szélessége és magassága, valamint a négyzetek közötti élek.\n", " \n", "A négyzetet egész koordináták (x, y) együttese jelöli.\n", "\n", "A szomszédok 4 (négyzet) függvény adja a négy környező négyzetet.\n", "\n", "---" ] }, { "cell_type": "code", "metadata": { "id": "VCSJv0Ub5kl4", "colab_type": "code", "colab": {} }, "source": [ "Maze = namedtuple('Maze', 'width, height, edges')\n", "\n", "Square = tuple\n", "\n", "def neighbors4(square) -> {Square}:\n", " \"\"\"The 4 neighbors of an (x, y) square.\"\"\"\n", " (x, y) = square\n", " return {(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)}\n", "\n", "def grid(width, height) -> {Square}: \n", " \"\"\"All squares in a grid of these dimensions.\"\"\"\n", " return {(x, y) for x in range(width) for y in range(height)}\n", "\n", "def random_maze(width, height, pop=deque.pop) -> Maze:\n", " \"\"\"Generate a random maze, using random_tree.\"\"\"\n", " tree = random_tree(grid(width, height), neighbors4, pop)\n", " return Maze(width, height, tree)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "23_W7Xt45kl7", "colab_type": "text" }, "source": [ "### Készítsünk egy 10x5-es labirintust:" ] }, { "cell_type": "code", "metadata": { "id": "eOCjVJ595kl8", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "d87e2fbc-920c-4a7b-e632-32f939aedf4a" }, "source": [ "random_maze(10, 5)" ], "execution_count": 3, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Maze(width=10, height=5, edges={((6, 2), (6, 3)), ((8, 0), (8, 1)), ((6, 4), (7, 4)), ((8, 3), (9, 3)), ((2, 2), (3, 2)), ((8, 4), (9, 4)), ((4, 0), (5, 0)), ((1, 0), (2, 0)), ((1, 1), (2, 1)), ((4, 1), (5, 1)), ((4, 2), (4, 3)), ((2, 1), (2, 2)), ((0, 2), (0, 3)), ((7, 4), (8, 4)), ((6, 0), (7, 0)), ((3, 1), (3, 2)), ((3, 0), (3, 1)), ((2, 3), (2, 4)), ((7, 1), (7, 2)), ((0, 4), (1, 4)), ((3, 3), (4, 3)), ((9, 0), (9, 1)), ((1, 2), (1, 3)), ((8, 1), (9, 1)), ((7, 0), (8, 0)), ((9, 1), (9, 2)), ((7, 3), (8, 3)), ((4, 0), (4, 1)), ((4, 2), (5, 2)), ((2, 4), (3, 4)), ((6, 1), (7, 1)), ((0, 1), (0, 2)), ((1, 1), (1, 2)), ((6, 3), (6, 4)), ((6, 2), (7, 2)), ((3, 3), (3, 4)), ((0, 0), (1, 0)), ((5, 1), (5, 2)), ((2, 0), (3, 0)), ((5, 0), (6, 0)), ((3, 4), (4, 4)), ((0, 0), (0, 1)), ((0, 3), (0, 4)), ((4, 4), (5, 4)), ((1, 3), (2, 3)), ((9, 3), (9, 4)), ((5, 3), (5, 4)), ((6, 0), (6, 1)), ((8, 2), (9, 2))})" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "markdown", "metadata": { "id": "OnUc_mSR5kl_", "colab_type": "text" }, "source": [ "---\n", "\n", "Ez így nem nagyon szép. Szükség lesz egy módszerre a labirintus megjelenítésére.\n", "\n", "\n", "# Labirintus megjelenítése\n", "\n", "\n", "\n", "\n", "\n", "A `matplotlib` -t használom a labirintus falainak ábrázolására. Alig várom, mikor lesz * megoldási út *, és megengedjük ennek ábrázolását is.\n", "\n", "\n", "---" ] }, { "cell_type": "code", "metadata": { "id": "XKHPkXvX5kmA", "colab_type": "code", "colab": {} }, "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "def plot_maze(maze, figsize=None, path=None):\n", " \"\"\"Plot a maze by drawing lines between adjacent squares, except for pairs in maze.edges\"\"\"\n", " w, h = maze.width, maze.height\n", " plt.figure(figsize=figsize or (w/5, h/5))\n", " plt.axis('off')\n", " plt.gca().invert_yaxis()\n", " exits = {edge((0, 0), (0, -1)), edge((w-1, h-1), (w-1, h))}\n", " edges = maze.edges | exits\n", " for sq in grid(w, h):\n", " for nbr in neighbors4(sq):\n", " if edge(sq, nbr) not in edges:\n", " plot_wall(sq, nbr)\n", " if path: # Plot the solution (or any path) as a green line through the maze\n", " X, Y = transpose((x + 0.5, y + 0.5) for (x, y) in path)\n", " plt.plot(X, Y, 'g-', linewidth=2)\n", " \n", "def transpose(matrix): return list(zip(*matrix))\n", "\n", "def plot_wall(s1, s2):\n", " \"\"\"Plot a wall: a blue line between squares s1 and s2.\"\"\"\n", " (x1, y1), (x2, y2) = s1, s2\n", " if x1 == x2: # horizontal wall\n", " y = max(y1, y2)\n", " X, Y = [x1, x1+1], [y, y]\n", " else: # vertical wall\n", " x = max(x1, x2)\n", " X, Y = [x, x], [y1, y1+1]\n", " plt.plot(X, Y, 'b-', linewidth=2)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "c6tvFDJL5kmC", "colab_type": "text" }, "source": [ "### Nézzük meg, hogy néz ki:" ] }, { "cell_type": "code", "metadata": { "id": "XzWTU5qs5kmD", "colab_type": "code", "colab": {}, "outputId": "99321fc3-6a54-4fc1-836a-387c2a02b521" }, "source": [ "M = random_maze(10, 5)\n", "plot_maze(M, figsize=(5, 2.5)) " ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAACWCAYAAACYTp4YAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAACwUlEQVR4nO3dQY4TMRBAUTfi/ldutggQYqRu57t47wCZ9Dj5rqzquu97AVR8+/QbAPiZKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKR8f/LFrmvda6113+t68nX/9DeAlqe+9yYlIOXRSWmHN6cw2nZM4nzd079eTEpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEpx61Ysoyy7fT1RxM/X6ediUkJSDluUjqt+v+LHRPGzrP3OfsckxKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpBy3DaTiXu5dti1nWPK+Ux5jrXO28xiUgJSjpuUdt/4p90yv9p945/+/5rk1GnPpASkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpDyyoqlHatdJqzymbLGaZdTVwb9jbP/nUkJSHllUnqz/hNvyzdNuol3PIvp9fNMSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmvrFjiayatjZqyiHTSmZzGpASkHDcpTVoSOOlZpnE2n2NSAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSHllxdKkRX6TnoV/N+ncT1sXZVICUq77HnMhAAOYlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIEWUgBRRAlJECUj5AZ35UzmPSBlLAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "nUPIIBLt5kmF", "colab_type": "text" }, "source": [ "---\n", "\n", "# A labirintus megoldása\n", "\n", "Itt az ideje megmutatni, hogyan lehet megoldani egy labirintust. \n", "\n", "Az első szélességű keresést fogom használni, amely garantálja, hogy a megoldás a lehető legrövidebb lesz (bár csak egy megoldással rendelkező labirintusok esetén).\n", "\n", "A `breadth_first_search` függvény a fel nem fedezett négyzetek határát tartja fenn, és minden iterációnál eltávolítja a határról egy négyzetet, amely a legkisebb útmélységben van, és hozzáadja a határhoz a négyzet összes szomszédját, amelyeket a falak nem blokkolnak és még nem láttak korábban.\n", "\n", "A `{square: [square,...]}` elérési útnak nevezett szótárnak két célja van: megakadályozza, hogy hurkokat hozzunk létre egy útban, és végül megmondja nekünk az utat az indulástól a célig, pl. `[(0, 0), (0, 1), (1, 1), (2, 1), ...]`.\n", "\n", "---" ] }, { "cell_type": "code", "metadata": { "id": "TggPnecr5kmF", "colab_type": "code", "colab": {} }, "source": [ "def breadth_first_search(maze):\n", " \"\"\"Find a shortest sequence of states from start to the goal.\"\"\"\n", " start = (0, 0)\n", " goal = (maze.width - 1, maze.height - 1)\n", " frontier = deque([start]) # A queue of states to consider\n", " paths = {start: [start]} # start has a one-square path\n", " while frontier:\n", " s = frontier.popleft()\n", " if s == goal:\n", " return paths[s]\n", " for s2 in neighbors4(s):\n", " if s2 not in paths and edge(s, s2) in maze.edges:\n", " frontier.append(s2)\n", " paths[s2] = paths.get(s, []) + [s2]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "qz9uO0su5kmJ", "colab_type": "code", "colab": {}, "outputId": "168e7669-775f-47fc-a139-447bb449e282" }, "source": [ "solution = breadth_first_search(M)\n", "solution" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[(0, 0),\n", " (1, 0),\n", " (2, 0),\n", " (3, 0),\n", " (4, 0),\n", " (5, 0),\n", " (5, 1),\n", " (6, 1),\n", " (6, 0),\n", " (7, 0),\n", " (8, 0),\n", " (9, 0),\n", " (9, 1),\n", " (9, 2),\n", " (9, 3),\n", " (9, 4)]" ] }, "metadata": { "tags": [] }, "execution_count": 37 } ] }, { "cell_type": "code", "metadata": { "id": "IyjTCIrA5kmL", "colab_type": "code", "colab": {}, "outputId": "56286568-6e21-4158-d9d8-4b871a3acd04" }, "source": [ "plot_maze(M, figsize=(5, 3), path=solution)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAACxCAYAAACC56uWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAADj0lEQVR4nO3dUW6cMBRAUaiyumZRURbVbM/9ilq1VZVRwFyccxYwDGNyefkA72OMDaDi29VfAOB3ogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkDK05Eftu/b2LZtG2Pbj/zcfx0DaDnq796kBKQcOinNcOYURtuMSZzHHf3fi0kJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUi5/IHd/3b2K5Ot6Gy/j+cwD7K/7j23bvp95jAWdvi7/Y1LiSjNiIUiPu/Q3u3xSGi/Dayi+oNkTsuvsYwr/uZiUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIOXyB3IfdfS+5RxrjO3WD76ueH3dbU1MSkDK7Salu1X/q5gxYcxce9fZdUxKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkHK7B3JZS2HvelpMSlzlbdFj8UkmJS4xXsbz1d+BJpMSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKbd79m3G9tArmrUN9Srrs8p5bNv9tiA3KQEpt5uUZt/x73aX+dPsO/7df6+V3HXaMykBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkPJ0xofO2MN8hT3r33+nFc5lhhnX1WzW/m8mJSDllEnpzPqveLc800p34hnnYnq9nkkJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIEWUgJSnq78Av/avX8GMcxlj288+xkprcjcmJSDldpPSjLvkLCudy2qszXVMSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKSIEpAiSkCKKAEp+xjHvcvq/cVYK7z2YaVz4eOs++OO/s1MSkCKKAEpogSkiBKQIkpAiigBKaIEpIgSkCJKQIooASmiBKScsm33+7MwK1jpXPi4ldb9bs/xmZSAlEPfEgDwWSYlIEWUgBRRAlJECUgRJSBFlIAUUQJSRAlIESUgRZSAFFECUkQJSBElIOUnnSR7B/BUa4YAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "6BRTf6WM5kmO", "colab_type": "text" }, "source": [ "---\n", "\n", "# Stratégiak `pop` paraméter `random_maze` használathoz\n", "\n", "Hasonlítsuk össze, hogy a labirintus hogyan változik a pop-paraméter három különböző választása alapján.\n", "\n", "\n", "# `pop=deque.pop`\n", "\n", "\n", "Az alapértelmezett pop módszer, a `deque.pop` azt jelenti, hogy a fát ** mélységében először ** hozza létre; mindig a `node` a határ ** ** végén ** választjuk, tehát a fa egy ágot követ véletlenszerűen csavart út mentén, amíg az út megduplázódik, és nincs több szomszéd. \n", "\n", "Ezen a ponton kiválasztjuk a legújabb teret, amelyhez szomszédok vannak, és onnan folytatjuk. A `deque.pop` labirintus nagyon jól néz ki.\n", "\n", "Megmutatom a labirintust megoldás nélkül, majd a megoldás útvonalával.\n", "\n", "---" ] }, { "cell_type": "code", "metadata": { "id": "72dJIG665kmO", "colab_type": "code", "colab": {} }, "source": [ "def show(pop):\n", " \"\"\"Using this `pop` parameter, show a 70x70 maze, first without and then with the solution path.\"\"\"\n", " M = random_maze(30, 30, pop)\n", " plot_maze(M)\n", " plt.show()\n", " solution = breadth_first_search(M)\n", " plot_maze(M, path=[(0, -1)] + solution + [(M.width - 1, M.height)])\n", " return len(solution)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "_Le5jU_G5kmQ", "colab_type": "code", "colab": {}, "outputId": "0d887aae-669c-4dde-a54e-93e64b6bc0f6" }, "source": [ "show(deque.pop)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/plain": [ "339" ] }, "metadata": { "tags": [] }, "execution_count": 47 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "nagkcDYE5kmS", "colab_type": "text" }, "source": [ "---\n", "\n", "# `pop=deque.popleft`\n", "\n", "Ez nagyjából ugyan olyan szélességgel hozza létre a labirintust - egy gyökér négyzetnél indulunk, hozzá adunk egy szélt, és ettől kezdve mindig kiválasztunk egy szülői élt, mielőtt kiválasztunk egy gyermek élét.\n", "\n", "A nettó eredmény egy olyan terv, amely koncentrikus rétegekben sugároz ki a gyökérből (amelyet a `random_tree` választ ki, és nem feltétlenül a bal felső négyzet; alatta úgy tűnik, hogy a gyökér a jobb alsó negyedben található). \n", "\n", "A `deque.popleft` labirintus formatervezésként érdekes, de számomra nem működik jól, mint egy labirintus. Túl könnyű megoldani: kövesse az utat a kezdetektől a gyökérig, majd fontolja meg az utat a végétől a gyökérig, és nézze meg, hogy miként illeszkednek egymáshoz.\n", "\n", "---" ] }, { "cell_type": "code", "metadata": { "id": "Bo6LicaA5kmS", "colab_type": "code", "colab": {}, "outputId": "2fb82fe0-d0eb-47c4-cbb6-4e56f76c898d" }, "source": [ "show(deque.popleft)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/plain": [ "59" ] }, "metadata": { "tags": [] }, "execution_count": 48 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "xHTIHRQn5kmV", "colab_type": "text" }, "source": [ "# `pop=poprandom`\n", "\n", "Választhatunk egy cellát véletlenszerűen a határtól. \n", "\n", "Ez egy érdekes kompromisszum: van némi felépítése és véleményem szerint meglehetősen szép, mint labirintus. \n", "\n", "\n", "Meg kell azonban mondanom, hogy meglepett, hogy az út majdnem olyan egyenes és rövid, mint a `pop=popleft` esetében; nem olyan szűk, mint a `pop=deque.pop`-nál.\n", "\n", "---" ] }, { "cell_type": "code", "metadata": { "id": "U4Uk5Bp15kmV", "colab_type": "code", "colab": {} }, "source": [ "def poprandom(seq):\n", " \"\"\"Select and return a random element; remove it from the sequence.\"\"\"\n", " element = random.choice(seq)\n", " seq.remove(element)\n", " return element" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "kic3L-kk5kmY", "colab_type": "code", "colab": {}, "outputId": "02f252db-0171-4f33-dc4e-2e104335435a" }, "source": [ "show(poprandom)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/plain": [ "65" ] }, "metadata": { "tags": [] }, "execution_count": 50 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "ZEbOx2C35kma", "colab_type": "code", "colab": {} }, "source": [ "" ], "execution_count": 0, "outputs": [] } ] }