{ "cells": [ { "cell_type": "markdown", "id": "ead7f8c4", "metadata": {}, "source": [ "# Constraint *Knapsack*" ] }, { "cell_type": "markdown", "id": "de7b3fdc", "metadata": {}, "source": [ "The constraint *Knapsack* ensures that some items are packed in a knapsack with certain weight and profit restrictions. So, the context is to manage a collection of items, each one being described by 2 attributes: its weight and its profit. We have to decide how many copies of each item must be selected (or simply, which items must be selected, in a single occurrence, if variables are 0/1) while respecting a numerical condition $(\\odot_w,k_w)$ on accumulated weights and a numerical condition $(\\odot_p,k_p)$ on accumulated profits." ] }, { "cell_type": "markdown", "id": "35e42a3c", "metadata": {}, "source": [ "The operator of the first condition is expected to be in $\\{<,\\leq,=\\}$ whereas the operator of the second condition is expected to be in $\\{>,\\geq,=\\}$." ] }, { "attachments": { "bag.png": { "image/png": "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" } }, "cell_type": "markdown", "id": "51a94be5", "metadata": {}, "source": [ "Ensuring a minimum benefit when filling a knapsack:\n", "\"Knapsack\"" ] }, { "cell_type": "markdown", "id": "148939a0", "metadata": {}, "source": [ "In PyCSP$^3$, we must call the function *Knapsack()* that allows us to pass the variables either in sequence (individually) or under the form of a list. \n", "Two named parameters *weights* and *profits* are required.\n", "Then, we have to express twe two conditions (on weights and profits).\n", "On the one hand, the first condition, on weights, is given either by *wlimit* or *wcondition*: exactly one of these two parameters must be different from *None*.\n", "The value of *wlimit* is either an integer value or an integer variable (and the implicit operator is then $\\leq$). \n", "The value of *wcondition* can be built by calling a function among *lt()*, *le()*, *eq()*, ... \n", "On the other hand, the second condition, on profits, is expressed on the object obtained when calling *Knapsack()*. Indeed, this object represents the accumulated profit and can then be restricted by a condition (typically, defined by a relational operator and a limit)." ] }, { "cell_type": "markdown", "id": "09d815cc", "metadata": {}, "source": [ "To see how this constraint works, we need first to import the library PyCSP$^3$:" ] }, { "cell_type": "code", "execution_count": 1, "id": "ee65f363", "metadata": {}, "outputs": [], "source": [ "from pycsp3 import *" ] }, { "cell_type": "markdown", "id": "0a9a7eaa", "metadata": {}, "source": [ "For our illustration, we assume that we have 10 items with the following weights and profits:" ] }, { "cell_type": "code", "execution_count": 2, "id": "273e2744", "metadata": {}, "outputs": [], "source": [ "weights = [10, 2, 6, 11, 21, 4, 8, 3, 8, 10]\n", "profits = [20, 4, 3, 9, 13, 2, 3, 4, 7, 8]\n", "nItems = len(weights)" ] }, { "cell_type": "markdown", "id": "582bc8ee", "metadata": {}, "source": [ "We also assume that we need to collect some of these items (in a knapsack) while considering that the capacity of the knapsack is 20 (*w_limit*) and the minimum satisfactory level is 30 (*p_limit*)." ] }, { "cell_type": "code", "execution_count": 3, "id": "99093051", "metadata": {}, "outputs": [], "source": [ "w_limit, p_limit = 20, 30" ] }, { "cell_type": "markdown", "id": "6fd481eb", "metadata": {}, "source": [ "Next, we introduce an array $x$ of 10 variables, each variable having {0,1} as domain.\n", "We have $x[i]$ set to 1 iff the item i is packed (selected)." ] }, { "cell_type": "code", "execution_count": 4, "id": "1c85cdb9", "metadata": {}, "outputs": [], "source": [ "x = VarArray(size=nItems, dom={0, 1})" ] }, { "cell_type": "markdown", "id": "d4b8032d", "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": "f7b6e0c9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Array of variable x: [x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9]]\n", "Domain of any variable: 0 1\n" ] } ], "source": [ "print(\"Array of variable x: \", x)\n", "print(\"Domain of any variable: \", x[0].dom)" ] }, { "cell_type": "markdown", "id": "2f52f0ae", "metadata": {}, "source": [ "We simply post a single constraint *Knapsack* with the limits mentioned above." ] }, { "cell_type": "code", "execution_count": 6, "id": "c71d5d09", "metadata": {}, "outputs": [], "source": [ "satisfy(\n", " Knapsack(x, weights=weights, wlimit=w_limit, profits=profits) >= p_limit\n", ");" ] }, { "cell_type": "markdown", "id": "450f4d23", "metadata": {}, "source": [ "By calling the function solve(), we can check that the problem (actually, the single constraint) is satisfiable (SAT). We can also print the values assigned to the variables in the found solution; we can call the function *values()* that collects the values assigned (in the last found solution) to a specified list of variables." ] }, { "cell_type": "code", "execution_count": 7, "id": "f2cba76c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Values of x: [1, 1, 0, 0, 0, 1, 0, 1, 0, 0]\n" ] } ], "source": [ "if solve() is SAT:\n", " print(\"Values of x: \", values(x))" ] }, { "cell_type": "markdown", "id": "38b23a1f", "metadata": {}, "source": [ "On this simple constraint, one can verify that the number of solutions (supports) is 2." ] }, { "cell_type": "code", "execution_count": 8, "id": "eef140e4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Solution 1: [1, 1, 0, 0, 0, 1, 0, 1, 0, 0] of profit 30\n", "Solution 2: [1, 1, 0, 0, 0, 0, 0, 0, 1, 0] of profit 31\n" ] } ], "source": [ "if solve(sols=ALL) is SAT:\n", " for i in range(n_solutions()):\n", " print(f\"Solution {i+1}: {values(x, sol=i)} of profit {sum(value(x[j], sol=i)*profits[j] for j in range(nItems))}\")" ] }, { "cell_type": "markdown", "id": "42db16e5", "metadata": {}, "source": [ "Let us display the internal representation of the posted constraint:" ] }, { "cell_type": "code", "execution_count": 9, "id": "448cf9d6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "knapsack(list:x[], weights:10 2 6 11 21 4 8 3 8 10, limit:(le,20), profits:20 4 3 9 13 2 3 4 7 8, condition:(ge,30))\n" ] } ], "source": [ "print(posted())" ] }, { "cell_type": "markdown", "id": "149ae95e", "metadata": {}, "source": [ "Now, let us discard it:" ] }, { "cell_type": "code", "execution_count": 10, "id": "936027a2", "metadata": {}, "outputs": [], "source": [ "unpost()" ] }, { "cell_type": "markdown", "id": "39f2752b", "metadata": {}, "source": [ "Let us check that there are no more constraints:" ] }, { "cell_type": "code", "execution_count": 11, "id": "0c33a0d7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n" ] } ], "source": [ "print(posted())" ] }, { "cell_type": "markdown", "id": "d7a837bf", "metadata": {}, "source": [ "Let us post the same constraint, this time by using the other parameter *wcondition*:" ] }, { "cell_type": "code", "execution_count": 12, "id": "3e6d0202", "metadata": {}, "outputs": [], "source": [ "satisfy(\n", " Knapsack(x, weights=weights, wcondition=le(w_limit), profits=profits) >= p_limit\n", ");" ] }, { "cell_type": "markdown", "id": "c74c4532", "metadata": {}, "source": [ "Let us check that this is the same constraint:" ] }, { "cell_type": "code", "execution_count": 13, "id": "91d8688e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "knapsack(list:[x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9]], weights:[10, 2, 6, 11, 21, 4, 8, 3, 8, 10], limit:(le,20), profits:[20, 4, 3, 9, 13, 2, 3, 4, 7, 8], condition:(ge,30))\n" ] } ], "source": [ "print(posted())" ] }, { "cell_type": "markdown", "id": "94d06788", "metadata": {}, "source": [ "Since XCSP$^3$ Specifications 3.1, *Knapsack* belongs to XCSP$^3$-core (notably because solvers not equipped with a specific propagator can handle that constraint easily by posting two constraints *Sum*).\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 }