{ "cells": [ { "cell_type": "markdown", "id": "eb35d646", "metadata": { "tags": [ "CSP", "complex", "medium", "Regular" ] }, "source": [ "# Problem *Nonogram*" ] }, { "cell_type": "markdown", "id": "4b1830ef", "metadata": {}, "source": [ "From CSPLib: Nonograms are a popular puzzle, which goes by different names in different countries. Solvers have to shade in squares in a grid so that blocks of consecutive shaded squares satisfy constraints given for each row and column. Constraints typically indicate the sequence of shaded blocks (e.g. 3,1,2 means that there is a block of 3, then a gap of unspecified size, a block of length 1, another gap, and then a block of length 2). Below, there is an example (taken from Chapter 14 in Gecode documentation):" ] }, { "attachments": { "nonogram1.png": { "image/png": "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" } }, "cell_type": "markdown", "id": "4fe0aeec", "metadata": {}, "source": [ "Puzzle:\n", "\"Nonogram" ] }, { "attachments": { "nonogram2.png": { "image/png": "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" } }, "cell_type": "markdown", "id": "ebdba063", "metadata": {}, "source": [ "Solution:\n", "\"Nonogram" ] }, { "cell_type": "markdown", "id": "7524c7dc", "metadata": {}, "source": [ "To build a CSP (Constraint Satisfaction Problem) model, we need first to import the library PyCSP$^3$:" ] }, { "cell_type": "code", "execution_count": 1, "id": "fd42d67b", "metadata": {}, "outputs": [], "source": [ "from pycsp3 import *" ] }, { "cell_type": "markdown", "id": "ca46a3ed", "metadata": {}, "source": [ "Suppose that the data (for a specific Nonogram puzzle) are initially given in a text file as follows:\n", "- a line stating the numbers of rows and columns,\n", "- then, for each row a line stating the number of blocks followed by the sizes of all these blocks (on the same line),\n", "- then, for each column a line stating the number of blocks followed by the sizes of all these blocks (on the same line)." ] }, { "cell_type": "markdown", "id": "58f5bcd5", "metadata": {}, "source": [ "```\n", "9 9\n", "2 2 2\n", "2 4 4\n", "3 1 3 1\n", "3 2 1 2\n", "2 1 1\n", "2 2 2\n", "2 2 2\n", "1 3\n", "1 1\n", "\n", "1 3\n", "2 2 3\n", "2 2 2\n", "2 2 2\n", "2 2 2\n", "2 2 2\n", "2 2 2\n", "2 2 3\n", "1 3\n", "```" ] }, { "cell_type": "markdown", "id": "d16e07ba", "metadata": {}, "source": [ "It is possible to loas such a file, for example with:\n", "```\n", "from pycsp3.problems.data.parsing import register_fields, next_int\n", "\n", "register_fields(\"https://www.cril.univ-artois.fr/~lecoutre/heart.txt\")\n", "\n", "nRows, nCols = next_int(), next_int()\n", "rows = [[next_int() for _ in range(next_int())] for _ in range(nRows)]\n", "cols = [[next_int() for _ in range(next_int())] for _ in range(nRows)]\n", "```" ] }, { "cell_type": "markdown", "id": "de8bc75d", "metadata": {}, "source": [ "However, here, we will consider a JSON file. Actually, this file can be found [here](https://www.cril.univ-artois.fr/~lecoutre/heart.json). To load block patterns, we can then execute: " ] }, { "cell_type": "code", "execution_count": 2, "id": "24cb442f", "metadata": {}, "outputs": [], "source": [ "rows, cols = default_data(\"https://www.cril.univ-artois.fr/~lecoutre/heart.json\")\n", "nRows, nCols = len(rows), len(cols)" ] }, { "cell_type": "markdown", "id": "169e1430", "metadata": {}, "source": [ "We can check data:" ] }, { "cell_type": "code", "execution_count": 3, "id": "82d82c55", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Patterns for rows: [\n", " [2, 2]\n", " [4, 4]\n", " [1, 3, 1]\n", " [2, 1, 2]\n", " [1, 1]\n", " [2, 2]\n", " [2, 2]\n", " [3]\n", " [1]\n", "]\n", "Patterns for columns: [\n", " [3]\n", " [2, 3]\n", " [2, 2]\n", " [2, 2]\n", " [2, 2]\n", " [2, 2]\n", " [2, 2]\n", " [2, 3]\n", " [3]\n", "]\n" ] } ], "source": [ "print(\"Patterns for rows: \", rows)\n", "print(\"Patterns for columns: \", cols)" ] }, { "cell_type": "markdown", "id": "8ddb2ce0", "metadata": {}, "source": [ "We start our CSP model with a two-dimensional array $x$ of variables, each variable having {0,1} as domain. " ] }, { "cell_type": "code", "execution_count": 4, "id": "c2e4c30b", "metadata": {}, "outputs": [], "source": [ "# x[i][j] is 1 iff the cell at row i and col j is colored in black\n", "x = VarArray(size=[nRows, nCols], dom={0, 1})" ] }, { "cell_type": "markdown", "id": "5654880b", "metadata": {}, "source": [ "We can display (the structure of) the array as well as the domain of the first variable." ] }, { "cell_type": "code", "execution_count": 5, "id": "18d98ecf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Array of variables x: [\n", " [x[0][0], x[0][1], x[0][2], x[0][3], x[0][4], x[0][5], x[0][6], x[0][7], x[0][8]]\n", " [x[1][0], x[1][1], x[1][2], x[1][3], x[1][4], x[1][5], x[1][6], x[1][7], x[1][8]]\n", " [x[2][0], x[2][1], x[2][2], x[2][3], x[2][4], x[2][5], x[2][6], x[2][7], x[2][8]]\n", " [x[3][0], x[3][1], x[3][2], x[3][3], x[3][4], x[3][5], x[3][6], x[3][7], x[3][8]]\n", " [x[4][0], x[4][1], x[4][2], x[4][3], x[4][4], x[4][5], x[4][6], x[4][7], x[4][8]]\n", " [x[5][0], x[5][1], x[5][2], x[5][3], x[5][4], x[5][5], x[5][6], x[5][7], x[5][8]]\n", " [x[6][0], x[6][1], x[6][2], x[6][3], x[6][4], x[6][5], x[6][6], x[6][7], x[6][8]]\n", " [x[7][0], x[7][1], x[7][2], x[7][3], x[7][4], x[7][5], x[7][6], x[7][7], x[7][8]]\n", " [x[8][0], x[8][1], x[8][2], x[8][3], x[8][4], x[8][5], x[8][6], x[8][7], x[8][8]]\n", "]\n", "Domain of any variable: 0 1\n" ] } ], "source": [ "print(\"Array of variables x: \", x)\n", "print(\"Domain of any variable: \", x[0][0].dom)" ] }, { "cell_type": "markdown", "id": "ef498390", "metadata": {}, "source": [ "We need to post a constraint *Regular* per row and per column. Indeed, one can transform any clue (pattern for a row or column) into an automaton. We use this function:" ] }, { "cell_type": "code", "execution_count": 6, "id": "b2ae24bc", "metadata": {}, "outputs": [], "source": [ "def automaton(pattern):\n", " q = Automaton.q # for building state names\n", " transitions = []\n", " if len(pattern) == 0:\n", " n_states = 1\n", " transitions.append((q(0), 0, q(0)))\n", " else:\n", " n_states = sum(pattern) + len(pattern)\n", " num = 0\n", " for i, size in enumerate(pattern):\n", " transitions.append((q(num), 0, q(num)))\n", " transitions.extend((q(num + j), 1, q(num + j + 1)) for j in range(size))\n", " transitions.append((q(num + size), 0, q(num + size + (1 if i < len(pattern) - 1 else 0))))\n", " num += size + 1\n", " return Automaton(start=q(0), final=q(n_states - 1), transitions=transitions)\n" ] }, { "cell_type": "markdown", "id": "5bb9a8d0", "metadata": {}, "source": [ "For example, if we display the automaton corresponding to the clue (2 2) given for the first row, we can check that the automaton is well built. " ] }, { "cell_type": "code", "execution_count": 7, "id": "0bce8e2a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Automaton(start=q0, transitions={(q0,0,q0),(q0,1,q1),(q1,1,q2),(q2,0,q3),(q3,0,q3),(q3,1,q4),(q4,1,q5),(q5,0,q5)}, final=[q5])\n" ] } ], "source": [ "print(automaton(rows[0]))" ] }, { "cell_type": "markdown", "id": "ce5d945e", "metadata": {}, "source": [ "We can now post the constraints *Regular*:" ] }, { "cell_type": "code", "execution_count": 8, "id": "8e692793", "metadata": {}, "outputs": [], "source": [ "satisfy(\n", " [x[i] in automaton(rows[i]) for i in range(nRows)],\n", "\n", " [x[:,j] in automaton(cols[j]) for j in range(nCols)]\n", ");" ] }, { "cell_type": "markdown", "id": "76788929", "metadata": {}, "source": [ "Interestingly, by calling the function *solve()*, we can check that the problem is satisfiable (SAT). We can also display the found solution. Here, we call the function *values()* that collects the values assigned to a specified list of variables." ] }, { "cell_type": "code", "execution_count": 9, "id": "199bc223", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\n", " [0, 1, 1, 0, 0, 0, 1, 1, 0]\n", " [1, 1, 1, 1, 0, 1, 1, 1, 1]\n", " [1, 0, 0, 1, 1, 1, 0, 0, 1]\n", " [1, 1, 0, 0, 1, 0, 0, 1, 1]\n", " [0, 1, 0, 0, 0, 0, 0, 1, 0]\n", " [0, 1, 1, 0, 0, 0, 1, 1, 0]\n", " [0, 0, 1, 1, 0, 1, 1, 0, 0]\n", " [0, 0, 0, 1, 1, 1, 0, 0, 0]\n", " [0, 0, 0, 0, 1, 0, 0, 0, 0]\n", "]\n" ] } ], "source": [ "if solve() is SAT:\n", " print(values(x))" ] }, { "cell_type": "markdown", "id": "d7fa590d", "metadata": {}, "source": [ "We can improve the output:" ] }, { "cell_type": "code", "execution_count": 10, "id": "4d0ec3cc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " * * * * \n", "* * * * * * * *\n", "* * * * *\n", "* * * * *\n", " * * \n", " * * * * \n", " * * * * \n", " * * * \n", " * \n" ] } ], "source": [ "if solve() is SAT:\n", " for i in range(nRows):\n", " print(' '.join('*' if value(x[i][j]) == 1 else ' ' for j in range(nCols)))" ] }, { "cell_type": "markdown", "id": "c1ee8df7", "metadata": {}, "source": [ "Finally, we give below the model in one piece. Here the data is expected to be given by the user (in a command line)." ] }, { "cell_type": "raw", "id": "33e890e4", "metadata": { "raw_mimetype": "text/x-python" }, "source": [ "from pycsp3 import *\n", "\n", "rows, cols = data # patterns for row and columns\n", "nRows, nCols = len(rows), len(cols)\n", "\n", "# x[i][j] is 1 iff the cell at row i and col j is colored in black\n", "x = VarArray(size=[nRows, nCols], dom={0, 1})\n", "\n", "\n", "def automaton(pattern):\n", " q = Automaton.q # for building state names\n", " transitions = []\n", " if len(pattern) == 0:\n", " n_states = 1\n", " transitions.append((q(0), 0, q(0)))\n", " else:\n", " n_states = sum(pattern) + len(pattern)\n", " num = 0\n", " for i, size in enumerate(pattern):\n", " transitions.append((q(num), 0, q(num)))\n", " transitions.extend((q(num + j), 1, q(num + j + 1)) for j in range(size))\n", " transitions.append((q(num + size), 0, q(num + size + (1 if i < len(pattern) - 1 else 0))))\n", " num += size + 1\n", " return Automaton(start=q(0), final=q(n_states - 1), transitions=transitions)\n", "\n", "\n", "satisfy(\n", " [x[i] in automaton(rows[i]) for i in range(nRows)],\n", "\n", " [x[:, j] in automaton(cols[j]) for j in range(nCols)]\n", ")\n" ] } ], "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.7.12" } }, "nbformat": 4, "nbformat_minor": 5 }