Files
ortools-clone/docs/python/ortools/algorithms/pywrapknapsack_solver.html
2021-12-14 13:41:01 +01:00

842 lines
84 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 8.0.0" />
<title>pywrapknapsack_solver API documentation</title>
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2264%22%20height%3D%2264%22%20viewBox%3D%2244.5%202.5%2015%2015%22%3E%3Cpath%20d%3D%22M49.351%2021.041c-.233-.721-.546-2.408-.772-4.076-.042-.09-.067-.187-.046-.288-.166-1.347-.277-2.625-.241-3.351-1.378-1.008-2.271-2.586-2.271-4.362%200-.976.272-1.935.788-2.774.057-.094.122-.18.184-.268-.033-.167-.052-.339-.052-.516%200-1.477%201.202-2.679%202.679-2.679.791%200%201.496.352%201.987.9a6.3%206.3%200%200%201%201.001.029c.492-.564%201.207-.929%202.012-.929%201.477%200%202.679%201.202%202.679%202.679a2.65%202.65%200%200%201-.269%201.148c.383.747.595%201.572.595%202.41%200%202.311-1.507%204.29-3.635%205.107.037.699.147%202.27.423%203.294l.137.461c.156%202.136-4.612%205.166-5.199%203.215zm.127-4.919a4.78%204.78%200%200%200%20.775-.584c-.172-.115-.505-.254-.88-.378zm.331%202.302l.828-.502c-.202-.143-.576-.328-.984-.49zm.45%202.157l.701-.403c-.214-.115-.536-.249-.891-.376l.19.779zM49.13%204.141c0%20.152.123.276.276.276s.275-.124.275-.276-.123-.276-.276-.276-.275.124-.275.276zm.735-.389a1.15%201.15%200%200%201%20.314.783%201.16%201.16%200%200%201-1.162%201.162c-.457%200-.842-.27-1.032-.653-.026.117-.042.238-.042.362a1.68%201.68%200%200%200%201.679%201.679%201.68%201.68%200%200%200%201.679-1.679c0-.843-.626-1.535-1.436-1.654zm3.076%201.654a1.68%201.68%200%200%200%201.679%201.679%201.68%201.68%200%200%200%201.679-1.679c0-.037-.009-.072-.011-.109-.21.3-.541.508-.935.508a1.16%201.16%200%200%201-1.162-1.162%201.14%201.14%200%200%201%20.474-.912c-.015%200-.03-.005-.045-.005-.926.001-1.679.754-1.679%201.68zm1.861-1.265c0%20.152.123.276.276.276s.275-.124.275-.276-.123-.276-.276-.276-.275.124-.275.276zm1.823%204.823c0-.52-.103-1.035-.288-1.52-.466.394-1.06.64-1.717.64-1.144%200-2.116-.725-2.499-1.738-.383%201.012-1.355%201.738-2.499%201.738-.867%200-1.631-.421-2.121-1.062-.307.605-.478%201.267-.478%201.942%200%202.486%202.153%204.51%204.801%204.51s4.801-2.023%204.801-4.51zm-3.032%209.156l-.146-.492c-.276-1.02-.395-2.457-.444-3.268a6.11%206.11%200%200%201-1.18.115%206.01%206.01%200%200%201-2.536-.562l.006.175c.802.215%201.848.612%202.021%201.25.079.295-.021.601-.274.837l-.598.501c.667.304%201.243.698%201.311%201.179.02.144.022.507-.393.787l-.564.365c1.285.521%201.361.96%201.381%201.126.018.142.011.496-.427.746l-.854.489c.064-1.19%201.985-2.585%202.697-3.248zM49.34%209.925c0-.667%201-.667%201%200%200%20.653.818%201.205%201.787%201.205s1.787-.552%201.787-1.205c0-.667%201-.667%201%200%200%201.216-1.25%202.205-2.787%202.205s-2.787-.989-2.787-2.205zm-.887-7.633c-.093.077-.205.114-.317.114a.5.5%200%200%201-.318-.886L49.183.397a.5.5%200%200%201%20.703.068.5.5%200%200%201-.069.703zm7.661-.065c-.086%200-.173-.022-.253-.068l-1.523-.893c-.575-.337-.069-1.2.506-.863l1.523.892a.5.5%200%200%201%20.179.685c-.094.158-.261.247-.432.247z%22%20fill%3D%22%233bb300%22/%3E%3C/svg%3E"/>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
<style>/*! pygments syntax highlighting */pre{line-height:125%;}td.linenos pre{color:#000000; background-color:#f0f0f0; padding-left:5px; padding-right:5px;}span.linenos{color:#000000; background-color:#f0f0f0; padding-left:5px; padding-right:5px;}td.linenos pre.special{color:#000000; background-color:#ffffc0; padding-left:5px; padding-right:5px;}span.linenos.special{color:#000000; background-color:#ffffc0; padding-left:5px; padding-right:5px;}.pdoc .hll{background-color:#ffffcc}.pdoc{background:#f8f8f8;}.pdoc .c{color:#408080; font-style:italic}.pdoc .err{border:1px solid #FF0000}.pdoc .k{color:#008000; font-weight:bold}.pdoc .o{color:#666666}.pdoc .ch{color:#408080; font-style:italic}.pdoc .cm{color:#408080; font-style:italic}.pdoc .cp{color:#BC7A00}.pdoc .cpf{color:#408080; font-style:italic}.pdoc .c1{color:#408080; font-style:italic}.pdoc .cs{color:#408080; font-style:italic}.pdoc .gd{color:#A00000}.pdoc .ge{font-style:italic}.pdoc .gr{color:#FF0000}.pdoc .gh{color:#000080; font-weight:bold}.pdoc .gi{color:#00A000}.pdoc .go{color:#888888}.pdoc .gp{color:#000080; font-weight:bold}.pdoc .gs{font-weight:bold}.pdoc .gu{color:#800080; font-weight:bold}.pdoc .gt{color:#0044DD}.pdoc .kc{color:#008000; font-weight:bold}.pdoc .kd{color:#008000; font-weight:bold}.pdoc .kn{color:#008000; font-weight:bold}.pdoc .kp{color:#008000}.pdoc .kr{color:#008000; font-weight:bold}.pdoc .kt{color:#B00040}.pdoc .m{color:#666666}.pdoc .s{color:#BA2121}.pdoc .na{color:#7D9029}.pdoc .nb{color:#008000}.pdoc .nc{color:#0000FF; font-weight:bold}.pdoc .no{color:#880000}.pdoc .nd{color:#AA22FF}.pdoc .ni{color:#999999; font-weight:bold}.pdoc .ne{color:#D2413A; font-weight:bold}.pdoc .nf{color:#0000FF}.pdoc .nl{color:#A0A000}.pdoc .nn{color:#0000FF; font-weight:bold}.pdoc .nt{color:#008000; font-weight:bold}.pdoc .nv{color:#19177C}.pdoc .ow{color:#AA22FF; font-weight:bold}.pdoc .w{color:#bbbbbb}.pdoc .mb{color:#666666}.pdoc .mf{color:#666666}.pdoc .mh{color:#666666}.pdoc .mi{color:#666666}.pdoc .mo{color:#666666}.pdoc .sa{color:#BA2121}.pdoc .sb{color:#BA2121}.pdoc .sc{color:#BA2121}.pdoc .dl{color:#BA2121}.pdoc .sd{color:#BA2121; font-style:italic}.pdoc .s2{color:#BA2121}.pdoc .se{color:#BB6622; font-weight:bold}.pdoc .sh{color:#BA2121}.pdoc .si{color:#BB6688; font-weight:bold}.pdoc .sx{color:#008000}.pdoc .sr{color:#BB6688}.pdoc .s1{color:#BA2121}.pdoc .ss{color:#19177C}.pdoc .bp{color:#008000}.pdoc .fm{color:#0000FF}.pdoc .vc{color:#19177C}.pdoc .vg{color:#19177C}.pdoc .vi{color:#19177C}.pdoc .vm{color:#19177C}.pdoc .il{color:#666666}</style>
<style>/*! pdoc */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f7f7f7;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}body{background-color:var(--pdoc-background);}html, body{width:100%;height:100%;}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}.git-button{display:none !important;}nav input[type="search"]:valid ~ *{display:none !important;}}@media (min-width:770px){:root{--sidebar-width:clamp(12.5rem, 28vw, 22rem);}nav{position:fixed;overflow:auto;height:100vh;width:var(--sidebar-width);}main, header{padding:3rem 2rem 3rem calc(var(--sidebar-width) + 3rem);width:calc(54rem + var(--sidebar-width));max-width:100%;}#navtoggle{display:none;}}#togglestate{display:none;}nav.pdoc{--pad:1.75rem;--indent:1.5rem;background-color:var(--accent);border-right:1px solid var(--accent2);box-shadow:0 0 20px rgba(50, 50, 50, .2) inset;padding:0 0 0 var(--pad);overflow-wrap:anywhere;scrollbar-width:thin; scrollbar-color:var(--accent2) transparent }nav.pdoc::-webkit-scrollbar{width:.4rem; }nav.pdoc::-webkit-scrollbar-thumb{background-color:var(--accent2); }nav.pdoc > div{padding:var(--pad) 0;}nav.pdoc .module-list-button{display:inline-flex;align-items:center;color:var(--text);border-color:var(--muted);margin-bottom:1rem;}nav.pdoc .module-list-button:hover{border-color:var(--text);}nav.pdoc input[type=search]{display:block;outline-offset:0;width:calc(100% - var(--pad));}nav.pdoc .logo{max-width:calc(100% - var(--pad));max-height:35vh;display:block;margin:0 auto 1rem;transform:translate(calc(-.5 * var(--pad)), 0);}nav.pdoc ul{list-style:none;padding-left:0;}nav.pdoc li{display:block;margin:0;padding:.2rem 0 .2rem var(--indent);transition:all 100ms;}nav.pdoc > div > ul > li{padding-left:0;}nav.pdoc li:hover{background-color:var(--nav-hover);}nav.pdoc a, nav.pdoc a:hover{color:var(--text);}nav.pdoc a{display:block;}nav.pdoc > h2:first-of-type{margin-top:1.5rem;}nav.pdoc .class:before{content:"class ";color:var(--muted);}nav.pdoc .function:after{content:"()";color:var(--muted);}nav.pdoc footer:before{content:"";display:block;width:calc(100% - var(--pad));border-top:solid var(--accent2) 1px;margin-top:1.5rem;padding-top:.5rem;}nav.pdoc footer{font-size:small;}html, main{scroll-behavior:smooth;}.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .visually-hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important;}.pdoc h1, .pdoc h2, .pdoc h3{font-weight:300;margin:.3em 0;padding:.2em 0;}.pdoc a{text-decoration:none;color:var(--link);}.pdoc a:hover{color:var(--link-hover);}.pdoc blockquote{margin-left:2rem;}.pdoc pre{background-color:var(--code);border-top:1px solid var(--accent2);border-bottom:1px solid var(--accent2);margin-bottom:1em;padding:.5rem 0 .5rem .5rem;overflow-x:auto;}.pdoc code{color:var(--text);padding:.2em .4em;margin:0;font-size:85%;background-color:var(--code);border-radius:6px;}.pdoc a > code{color:inherit;}.pdoc pre > code{display:inline-block;font-size:inherit;background:none;border:none;padding:0;}.pdoc .modulename{margin-top:0;font-weight:bold;}.pdoc .modulename a{color:var(--link);transition:100ms all;}.pdoc .git-button{float:right;border:solid var(--link) 1px;}.pdoc .git-button:hover{background-color:var(--link);color:var(--pdoc-background);}.pdoc details{--shift:-40px;text-align:right;margin-top:var(--shift);margin-bottom:calc(0px - var(--shift));clear:both;filter:opacity(1);}.pdoc details:not([open]){height:0;overflow:visible;}.pdoc details > summary{font-size:.75rem;cursor:pointer;color:var(--muted);border-width:0;padding:0 .7em;display:inline-block;display:inline list-item;user-select:none;}.pdoc details > summary:focus{outline:0;}.pdoc details > div{margin-top:calc(0px - var(--shift) / 2);text-align:left;}.pdoc .docstring{margin-bottom:1.5rem;}.pdoc > section:first-of-type > .docstring{margin-bottom:3rem;}.pdoc .docstring pre{margin-left:1em;margin-right:1em;}.pdoc h1:target,.pdoc h2:target,.pdoc h3:target,.pdoc h4:target,.pdoc h5:target,.pdoc h6:target{background-color:var(--active);box-shadow:-1rem 0 0 0 var(--active);}.pdoc div:target > .attr,.pdoc section:target > .attr,.pdoc dd:target > a{background-color:var(--active);}.pdoc .attr:hover{filter:contrast(0.95);}.pdoc .headerlink{position:absolute;width:0;margin-left:-1.5rem;line-height:1.4rem;font-size:1.5rem;font-weight:normal;transition:all 100ms ease-in-out;opacity:0;}.pdoc .attr > .headerlink{margin-left:-2.5rem;}.pdoc *:hover > .headerlink,.pdoc *:target > .attr > .headerlink{opacity:1;}.pdoc .attr{display:block;color:var(--text);margin:1rem 0 .5rem;padding:.4rem 5rem .4rem 1rem;background-color:var(--accent);}.pdoc .classattr{margin-left:2rem;}.pdoc .name{color:var(--name);font-weight:bold;}.pdoc .def{color:var(--def);font-weight:bold;}.pdoc .signature{white-space:pre-wrap;}.pdoc .annotation{color:var(--annotation);}.pdoc .inherited{margin-left:2rem;}.pdoc .inherited dt{font-weight:700;}.pdoc .inherited dt, .pdoc .inherited dd{display:inline;margin-left:0;margin-bottom:.5rem;}.pdoc .inherited dd:not(:last-child):after{content:", ";}.pdoc .inherited .class:before{content:"class ";}.pdoc .inherited .function a:after{content:"()";}.pdoc .search-result .docstring{overflow:auto;max-height:25vh;}.pdoc .search-result.focused > .attr{background-color:var(--active);}.pdoc .attribution{margin-top:2rem;display:block;opacity:0.5;transition:all 200ms;filter:grayscale(100%);}.pdoc .attribution:hover{opacity:1;filter:grayscale(0%);}.pdoc .attribution img{margin-left:5px;height:35px;vertical-align:middle;width:70px;transition:all 200ms;}</style>
</head>
<body> <nav class="pdoc">
<label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
<input id="togglestate" type="checkbox">
<div>
<img src="https://developers.google.com/optimization/images/orLogo.png" class="logo" alt="project logo"/>
<h2>API Documentation</h2>
<ul class="memberlist">
<li>
<a class="class" href="#KnapsackSolver">KnapsackSolver</a>
<ul class="memberlist">
<li>
<a class="function" href="#KnapsackSolver.__init__">KnapsackSolver</a>
</li>
<li>
<a class="variable" href="#KnapsackSolver.thisown">thisown</a>
</li>
<li>
<a class="variable" href="#KnapsackSolver.KNAPSACK_BRUTE_FORCE_SOLVER">KNAPSACK_BRUTE_FORCE_SOLVER</a>
</li>
<li>
<a class="variable" href="#KnapsackSolver.KNAPSACK_64ITEMS_SOLVER">KNAPSACK_64ITEMS_SOLVER</a>
</li>
<li>
<a class="variable" href="#KnapsackSolver.KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER">KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER</a>
</li>
<li>
<a class="variable" href="#KnapsackSolver.KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER">KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER</a>
</li>
<li>
<a class="variable" href="#KnapsackSolver.KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER">KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER</a>
</li>
<li>
<a class="variable" href="#KnapsackSolver.KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER">KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER</a>
</li>
<li>
<a class="function" href="#KnapsackSolver.Init">Init</a>
</li>
<li>
<a class="function" href="#KnapsackSolver.Solve">Solve</a>
</li>
<li>
<a class="function" href="#KnapsackSolver.BestSolutionContains">BestSolutionContains</a>
</li>
<li>
<a class="function" href="#KnapsackSolver.set_use_reduction">set_use_reduction</a>
</li>
<li>
<a class="function" href="#KnapsackSolver.set_time_limit">set_time_limit</a>
</li>
</ul>
</li>
</ul>
<footer>OR-Tools 9.2</footer>
<a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
built with <span class="visually-hidden">pdoc</span><img
alt="pdoc logo"
src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
</a>
</div>
</nav>
<main class="pdoc">
<section>
<h1 class="modulename">
pywrapknapsack_solver </h1>
<details>
<summary>View Source</summary>
<div class="codehilite"><pre><span></span><span class="c1"># This file was automatically generated by SWIG (http://www.swig.org).</span>
<span class="c1"># Version 4.0.2</span>
<span class="c1">#</span>
<span class="c1"># Do not make changes to this file unless you know what you are doing--modify</span>
<span class="c1"># the SWIG interface file instead.</span>
<span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">version_info</span> <span class="k">as</span> <span class="n">_swig_python_version_info</span>
<span class="k">if</span> <span class="n">_swig_python_version_info</span> <span class="o">&lt;</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Python 2.7 or later required&quot;</span><span class="p">)</span>
<span class="c1"># Import the low-level C/C++ module</span>
<span class="k">if</span> <span class="n">__package__</span> <span class="ow">or</span> <span class="s2">&quot;.&quot;</span> <span class="ow">in</span> <span class="vm">__name__</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">_pywrapknapsack_solver</span>
<span class="k">else</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">_pywrapknapsack_solver</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">builtins</span> <span class="k">as</span> <span class="nn">__builtin__</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">__builtin__</span>
<span class="k">def</span> <span class="nf">_swig_repr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">strthis</span> <span class="o">=</span> <span class="s2">&quot;proxy of &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="fm">__repr__</span><span class="p">()</span>
<span class="k">except</span> <span class="n">__builtin__</span><span class="o">.</span><span class="n">Exception</span><span class="p">:</span>
<span class="n">strthis</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">return</span> <span class="s2">&quot;&lt;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">; </span><span class="si">%s</span><span class="s2"> &gt;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">strthis</span><span class="p">,)</span>
<span class="k">def</span> <span class="nf">_swig_setattr_nondynamic_instance_variable</span><span class="p">(</span><span class="nb">set</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">set_instance_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;thisown&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;this&quot;</span><span class="p">:</span>
<span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="n">name</span><span class="p">),</span> <span class="nb">property</span><span class="p">):</span>
<span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;You cannot add instance attributes to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="n">set_instance_attr</span>
<span class="k">def</span> <span class="nf">_swig_setattr_nondynamic_class_variable</span><span class="p">(</span><span class="nb">set</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">set_class_attr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">),</span> <span class="nb">property</span><span class="p">):</span>
<span class="nb">set</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;You cannot add class attributes to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">cls</span><span class="p">)</span>
<span class="k">return</span> <span class="n">set_class_attr</span>
<span class="k">def</span> <span class="nf">_swig_add_metaclass</span><span class="p">(</span><span class="n">metaclass</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="n">metaclass</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__bases__</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
<span class="k">return</span> <span class="n">wrapper</span>
<span class="k">class</span> <span class="nc">_SwigNonDynamicMeta</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Meta class to enforce nondynamic attributes (no new attributes) for a class&quot;&quot;&quot;</span>
<span class="fm">__setattr__</span> <span class="o">=</span> <span class="n">_swig_setattr_nondynamic_class_variable</span><span class="p">(</span><span class="nb">type</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">KnapsackSolver</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This library solves knapsack problems.</span>
<span class="sd"> Problems the library solves include:</span>
<span class="sd"> - 0-1 knapsack problems,</span>
<span class="sd"> - Multi-dimensional knapsack problems,</span>
<span class="sd"> Given n items, each with a profit and a weight, given a knapsack of</span>
<span class="sd"> capacity c, the goal is to find a subset of items which fits inside c</span>
<span class="sd"> and maximizes the total profit.</span>
<span class="sd"> The knapsack problem can easily be extended from 1 to d dimensions.</span>
<span class="sd"> As an example, this can be useful to constrain the maximum number of</span>
<span class="sd"> items inside the knapsack.</span>
<span class="sd"> Without loss of generality, profits and weights are assumed to be positive.</span>
<span class="sd"> From a mathematical point of view, the multi-dimensional knapsack problem</span>
<span class="sd"> can be modeled by d linear constraints:</span>
<span class="sd"> ForEach(j:1..d)(Sum(i:1..n)(weight_ij * item_i) &lt;= c_j</span>
<span class="sd"> where item_i is a 0-1 integer variable.</span>
<span class="sd"> Then the goal is to maximize:</span>
<span class="sd"> Sum(i:1..n)(profit_i * item_i).</span>
<span class="sd"> There are several ways to solve knapsack problems. One of the most</span>
<span class="sd"> efficient is based on dynamic programming (mainly when weights, profits</span>
<span class="sd"> and dimensions are small, and the algorithm runs in pseudo polynomial time).</span>
<span class="sd"> Unfortunately, when adding conflict constraints the problem becomes strongly</span>
<span class="sd"> NP-hard, i.e. there is no pseudo-polynomial algorithm to solve it.</span>
<span class="sd"> That&#39;s the reason why the most of the following code is based on branch and</span>
<span class="sd"> bound search.</span>
<span class="sd"> For instance to solve a 2-dimensional knapsack problem with 9 items,</span>
<span class="sd"> one just has to feed a profit vector with the 9 profits, a vector of 2</span>
<span class="sd"> vectors for weights, and a vector of capacities.</span>
<span class="sd"> E.g.:</span>
<span class="sd"> **Python**:</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> profits = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]</span>
<span class="sd"> weights = [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ],</span>
<span class="sd"> [ 1, 1, 1, 1, 1, 1, 1, 1, 1 ]</span>
<span class="sd"> ]</span>
<span class="sd"> capacities = [ 34, 4 ]</span>
<span class="sd"> solver = pywrapknapsack_solver.KnapsackSolver(</span>
<span class="sd"> pywrapknapsack_solver.KnapsackSolver</span>
<span class="sd"> .KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,</span>
<span class="sd"> &#39;Multi-dimensional solver&#39;)</span>
<span class="sd"> solver.Init(profits, weights, capacities)</span>
<span class="sd"> profit = solver.Solve()</span>
<span class="sd"> **C++**:</span>
<span class="sd"> .. code-block:: c++</span>
<span class="sd"> const std::vector&lt;int64_t&gt; profits = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };</span>
<span class="sd"> const std::vector&lt;std::vector&lt;int64_t&gt;&gt; weights =</span>
<span class="sd"> { { 1, 2, 3, 4, 5, 6, 7, 8, 9 },</span>
<span class="sd"> { 1, 1, 1, 1, 1, 1, 1, 1, 1 } };</span>
<span class="sd"> const std::vector&lt;int64_t&gt; capacities = { 34, 4 };</span>
<span class="sd"> KnapsackSolver solver(</span>
<span class="sd"> KnapsackSolver::KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,</span>
<span class="sd"> &quot;Multi-dimensional solver&quot;);</span>
<span class="sd"> solver.Init(profits, weights, capacities);</span>
<span class="sd"> const int64_t profit = solver.Solve();</span>
<span class="sd"> **Java**:</span>
<span class="sd"> .. code-block:: java</span>
<span class="sd"> final long[] profits = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };</span>
<span class="sd"> final long[][] weights = { { 1, 2, 3, 4, 5, 6, 7, 8, 9 },</span>
<span class="sd"> { 1, 1, 1, 1, 1, 1, 1, 1, 1 } };</span>
<span class="sd"> final long[] capacities = { 34, 4 };</span>
<span class="sd"> KnapsackSolver solver = new KnapsackSolver(</span>
<span class="sd"> KnapsackSolver.SolverType.KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,</span>
<span class="sd"> &quot;Multi-dimensional solver&quot;);</span>
<span class="sd"> solver.init(profits, weights, capacities);</span>
<span class="sd"> final long profit = solver.solve();</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">thisown</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(),</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">v</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(</span><span class="n">v</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;The membership flag&quot;</span><span class="p">)</span>
<span class="fm">__repr__</span> <span class="o">=</span> <span class="n">_swig_repr</span>
<span class="n">KNAPSACK_BRUTE_FORCE_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_BRUTE_FORCE_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Brute force method.</span>
<span class="sd"> Limited to 30 items and one dimension, this</span>
<span class="sd"> solver uses a brute force algorithm, ie. explores all possible states.</span>
<span class="sd"> Experiments show competitive performance for instances with less than</span>
<span class="sd"> 15 items.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_64ITEMS_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_64ITEMS_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Optimized method for single dimension small problems</span>
<span class="sd"> Limited to 64 items and one dimension, this</span>
<span class="sd"> solver uses a branch &amp; bound algorithm. This solver is about 4 times</span>
<span class="sd"> faster than KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Dynamic Programming approach for single dimension problems</span>
<span class="sd"> Limited to one dimension, this solver is based on a dynamic programming</span>
<span class="sd"> algorithm. The time and space complexity is O(capacity *</span>
<span class="sd"> number_of_items).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> CBC Based Solver</span>
<span class="sd"> This solver can deal with both large number of items and several</span>
<span class="sd"> dimensions. This solver is based on Integer Programming solver CBC.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Generic Solver.</span>
<span class="sd"> This solver can deal with both large number of items and several</span>
<span class="sd"> dimensions. This solver is based on branch and bound.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> SCIP based solver</span>
<span class="sd"> This solver can deal with both large number of items and several</span>
<span class="sd"> dimensions. This solver is based on Integer Programming solver SCIP.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_swiginit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">new_KnapsackSolver</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
<span class="n">__swig_destroy__</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">delete_KnapsackSolver</span>
<span class="k">def</span> <span class="nf">Init</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">profits</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; int64_t &gt; const &amp;&quot;</span><span class="p">,</span> <span class="n">weights</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; std::vector&lt; int64_t &gt; &gt; const &amp;&quot;</span><span class="p">,</span> <span class="n">capacities</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; int64_t &gt; const &amp;&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Initializes the solver and enters the problem to be solved.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_Init</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">profits</span><span class="p">,</span> <span class="n">weights</span><span class="p">,</span> <span class="n">capacities</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;int64_t&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Solves the problem and returns the profit of the optimal solution.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">BestSolutionContains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item_id</span><span class="p">:</span> <span class="s2">&quot;int&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;bool&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Returns true if the item &#39;item_id&#39; is packed in the optimal knapsack.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_BestSolutionContains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item_id</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_use_reduction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_reduction</span><span class="p">:</span> <span class="s2">&quot;bool&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_set_use_reduction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_reduction</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_time_limit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time_limit_seconds</span><span class="p">:</span> <span class="s2">&quot;double&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Time limit in seconds.</span>
<span class="sd"> When a finite time limit is set the solution obtained might not be optimal</span>
<span class="sd"> if the limit is reached.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_set_time_limit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time_limit_seconds</span><span class="p">)</span>
<span class="c1"># Register KnapsackSolver in _pywrapknapsack_solver:</span>
<span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_swigregister</span><span class="p">(</span><span class="n">KnapsackSolver</span><span class="p">)</span>
</pre></div>
</details>
</section>
<section id="KnapsackSolver">
<div class="attr class">
<a class="headerlink" href="#KnapsackSolver">#&nbsp;&nbsp</a>
<span class="def">class</span>
<span class="name">KnapsackSolver</span>:
</div>
<details>
<summary>View Source</summary>
<div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">KnapsackSolver</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This library solves knapsack problems.</span>
<span class="sd"> Problems the library solves include:</span>
<span class="sd"> - 0-1 knapsack problems,</span>
<span class="sd"> - Multi-dimensional knapsack problems,</span>
<span class="sd"> Given n items, each with a profit and a weight, given a knapsack of</span>
<span class="sd"> capacity c, the goal is to find a subset of items which fits inside c</span>
<span class="sd"> and maximizes the total profit.</span>
<span class="sd"> The knapsack problem can easily be extended from 1 to d dimensions.</span>
<span class="sd"> As an example, this can be useful to constrain the maximum number of</span>
<span class="sd"> items inside the knapsack.</span>
<span class="sd"> Without loss of generality, profits and weights are assumed to be positive.</span>
<span class="sd"> From a mathematical point of view, the multi-dimensional knapsack problem</span>
<span class="sd"> can be modeled by d linear constraints:</span>
<span class="sd"> ForEach(j:1..d)(Sum(i:1..n)(weight_ij * item_i) &lt;= c_j</span>
<span class="sd"> where item_i is a 0-1 integer variable.</span>
<span class="sd"> Then the goal is to maximize:</span>
<span class="sd"> Sum(i:1..n)(profit_i * item_i).</span>
<span class="sd"> There are several ways to solve knapsack problems. One of the most</span>
<span class="sd"> efficient is based on dynamic programming (mainly when weights, profits</span>
<span class="sd"> and dimensions are small, and the algorithm runs in pseudo polynomial time).</span>
<span class="sd"> Unfortunately, when adding conflict constraints the problem becomes strongly</span>
<span class="sd"> NP-hard, i.e. there is no pseudo-polynomial algorithm to solve it.</span>
<span class="sd"> That&#39;s the reason why the most of the following code is based on branch and</span>
<span class="sd"> bound search.</span>
<span class="sd"> For instance to solve a 2-dimensional knapsack problem with 9 items,</span>
<span class="sd"> one just has to feed a profit vector with the 9 profits, a vector of 2</span>
<span class="sd"> vectors for weights, and a vector of capacities.</span>
<span class="sd"> E.g.:</span>
<span class="sd"> **Python**:</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> profits = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]</span>
<span class="sd"> weights = [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ],</span>
<span class="sd"> [ 1, 1, 1, 1, 1, 1, 1, 1, 1 ]</span>
<span class="sd"> ]</span>
<span class="sd"> capacities = [ 34, 4 ]</span>
<span class="sd"> solver = pywrapknapsack_solver.KnapsackSolver(</span>
<span class="sd"> pywrapknapsack_solver.KnapsackSolver</span>
<span class="sd"> .KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,</span>
<span class="sd"> &#39;Multi-dimensional solver&#39;)</span>
<span class="sd"> solver.Init(profits, weights, capacities)</span>
<span class="sd"> profit = solver.Solve()</span>
<span class="sd"> **C++**:</span>
<span class="sd"> .. code-block:: c++</span>
<span class="sd"> const std::vector&lt;int64_t&gt; profits = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };</span>
<span class="sd"> const std::vector&lt;std::vector&lt;int64_t&gt;&gt; weights =</span>
<span class="sd"> { { 1, 2, 3, 4, 5, 6, 7, 8, 9 },</span>
<span class="sd"> { 1, 1, 1, 1, 1, 1, 1, 1, 1 } };</span>
<span class="sd"> const std::vector&lt;int64_t&gt; capacities = { 34, 4 };</span>
<span class="sd"> KnapsackSolver solver(</span>
<span class="sd"> KnapsackSolver::KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,</span>
<span class="sd"> &quot;Multi-dimensional solver&quot;);</span>
<span class="sd"> solver.Init(profits, weights, capacities);</span>
<span class="sd"> const int64_t profit = solver.Solve();</span>
<span class="sd"> **Java**:</span>
<span class="sd"> .. code-block:: java</span>
<span class="sd"> final long[] profits = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };</span>
<span class="sd"> final long[][] weights = { { 1, 2, 3, 4, 5, 6, 7, 8, 9 },</span>
<span class="sd"> { 1, 1, 1, 1, 1, 1, 1, 1, 1 } };</span>
<span class="sd"> final long[] capacities = { 34, 4 };</span>
<span class="sd"> KnapsackSolver solver = new KnapsackSolver(</span>
<span class="sd"> KnapsackSolver.SolverType.KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,</span>
<span class="sd"> &quot;Multi-dimensional solver&quot;);</span>
<span class="sd"> solver.init(profits, weights, capacities);</span>
<span class="sd"> final long profit = solver.solve();</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">thisown</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(),</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">v</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(</span><span class="n">v</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;The membership flag&quot;</span><span class="p">)</span>
<span class="fm">__repr__</span> <span class="o">=</span> <span class="n">_swig_repr</span>
<span class="n">KNAPSACK_BRUTE_FORCE_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_BRUTE_FORCE_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Brute force method.</span>
<span class="sd"> Limited to 30 items and one dimension, this</span>
<span class="sd"> solver uses a brute force algorithm, ie. explores all possible states.</span>
<span class="sd"> Experiments show competitive performance for instances with less than</span>
<span class="sd"> 15 items.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_64ITEMS_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_64ITEMS_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Optimized method for single dimension small problems</span>
<span class="sd"> Limited to 64 items and one dimension, this</span>
<span class="sd"> solver uses a branch &amp; bound algorithm. This solver is about 4 times</span>
<span class="sd"> faster than KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Dynamic Programming approach for single dimension problems</span>
<span class="sd"> Limited to one dimension, this solver is based on a dynamic programming</span>
<span class="sd"> algorithm. The time and space complexity is O(capacity *</span>
<span class="sd"> number_of_items).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> CBC Based Solver</span>
<span class="sd"> This solver can deal with both large number of items and several</span>
<span class="sd"> dimensions. This solver is based on Integer Programming solver CBC.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Generic Solver.</span>
<span class="sd"> This solver can deal with both large number of items and several</span>
<span class="sd"> dimensions. This solver is based on branch and bound.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> SCIP based solver</span>
<span class="sd"> This solver can deal with both large number of items and several</span>
<span class="sd"> dimensions. This solver is based on Integer Programming solver SCIP.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_swiginit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">new_KnapsackSolver</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
<span class="n">__swig_destroy__</span> <span class="o">=</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">delete_KnapsackSolver</span>
<span class="k">def</span> <span class="nf">Init</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">profits</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; int64_t &gt; const &amp;&quot;</span><span class="p">,</span> <span class="n">weights</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; std::vector&lt; int64_t &gt; &gt; const &amp;&quot;</span><span class="p">,</span> <span class="n">capacities</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; int64_t &gt; const &amp;&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Initializes the solver and enters the problem to be solved.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_Init</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">profits</span><span class="p">,</span> <span class="n">weights</span><span class="p">,</span> <span class="n">capacities</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;int64_t&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Solves the problem and returns the profit of the optimal solution.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">BestSolutionContains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item_id</span><span class="p">:</span> <span class="s2">&quot;int&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;bool&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Returns true if the item &#39;item_id&#39; is packed in the optimal knapsack.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_BestSolutionContains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item_id</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_use_reduction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_reduction</span><span class="p">:</span> <span class="s2">&quot;bool&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_set_use_reduction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_reduction</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_time_limit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time_limit_seconds</span><span class="p">:</span> <span class="s2">&quot;double&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Time limit in seconds.</span>
<span class="sd"> When a finite time limit is set the solution obtained might not be optimal</span>
<span class="sd"> if the limit is reached.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_set_time_limit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time_limit_seconds</span><span class="p">)</span>
</pre></div>
</details>
<div class="docstring"><p>This library solves knapsack problems.</p>
<p>Problems the library solves include:</p>
<ul>
<li>0-1 knapsack problems,</li>
<li>Multi-dimensional knapsack problems,</li>
</ul>
<p>Given n items, each with a profit and a weight, given a knapsack of
capacity c, the goal is to find a subset of items which fits inside c
and maximizes the total profit.
The knapsack problem can easily be extended from 1 to d dimensions.
As an example, this can be useful to constrain the maximum number of
items inside the knapsack.
Without loss of generality, profits and weights are assumed to be positive.</p>
<p>From a mathematical point of view, the multi-dimensional knapsack problem
can be modeled by d linear constraints:</p>
<pre><code>ForEach(j:1..d)(Sum(i:1..n)(weight_ij * item_i) &lt;= c_j
where item_i is a 0-1 integer variable.
</code></pre>
<h6 id="then-the-goal-is-to-maximize">Then the goal is to maximize</h6>
<blockquote>
<p>Sum(i:1..n)(profit_i * item_i).</p>
</blockquote>
<p>There are several ways to solve knapsack problems. One of the most
efficient is based on dynamic programming (mainly when weights, profits
and dimensions are small, and the algorithm runs in pseudo polynomial time).
Unfortunately, when adding conflict constraints the problem becomes strongly
NP-hard, i.e. there is no pseudo-polynomial algorithm to solve it.
That's the reason why the most of the following code is based on branch and
bound search.</p>
<p>For instance to solve a 2-dimensional knapsack problem with 9 items,
one just has to feed a profit vector with the 9 profits, a vector of 2
vectors for weights, and a vector of capacities.
E.g.:</p>
<p><strong>Python</strong>:</p>
<p>.. code-block:: python</p>
<pre><code> profits = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
weights = [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
]
capacities = [ 34, 4 ]
solver = <a href="#KnapsackSolver">pywrapknapsack_solver.KnapsackSolver</a>(
<a href="#KnapsackSolver">pywrapknapsack_solver.KnapsackSolver</a>
.KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,
'Multi-dimensional solver')
solver.Init(profits, weights, capacities)
profit = solver.Solve()
</code></pre>
<p><strong>C++</strong>:</p>
<p>.. code-block:: c++</p>
<pre><code> const std::vector&lt;int64_t&gt; profits = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const std::vector&lt;std::vector&lt;int64_t&gt;&gt; weights =
{ { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1 } };
const std::vector&lt;int64_t&gt; capacities = { 34, 4 };
KnapsackSolver solver(
KnapsackSolver::KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,
"Multi-dimensional solver");
solver.Init(profits, weights, capacities);
const int64_t profit = solver.Solve();
</code></pre>
<p><strong>Java</strong>:</p>
<p>.. code-block:: java</p>
<pre><code> final long[] profits = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
final long[][] weights = { { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1 } };
final long[] capacities = { 34, 4 };
KnapsackSolver solver = new KnapsackSolver(
KnapsackSolver.SolverType.KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,
"Multi-dimensional solver");
solver.init(profits, weights, capacities);
final long profit = solver.solve();
</code></pre>
</div>
<div id="KnapsackSolver.__init__" class="classattr">
<div class="attr function"><a class="headerlink" href="#KnapsackSolver.__init__">#&nbsp;&nbsp</a>
<span class="name">KnapsackSolver</span><span class="signature">(*args)</span>
</div>
<details>
<summary>View Source</summary>
<div class="codehilite"><pre><span></span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_swiginit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">new_KnapsackSolver</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
</pre></div>
</details>
</div>
<div id="KnapsackSolver.thisown" class="classattr">
<div class="attr variable"><a class="headerlink" href="#KnapsackSolver.thisown">#&nbsp;&nbsp</a>
<span class="name">thisown</span>
</div>
<div class="docstring"><p>The membership flag</p>
</div>
</div>
<div id="KnapsackSolver.KNAPSACK_BRUTE_FORCE_SOLVER" class="classattr">
<div class="attr variable"><a class="headerlink" href="#KnapsackSolver.KNAPSACK_BRUTE_FORCE_SOLVER">#&nbsp;&nbsp</a>
<span class="name">KNAPSACK_BRUTE_FORCE_SOLVER</span><span class="default_value"> = 0</span>
</div>
<div class="docstring"><p>Brute force method.</p>
<p>Limited to 30 items and one dimension, this
solver uses a brute force algorithm, ie. explores all possible states.
Experiments show competitive performance for instances with less than
15 items.</p>
</div>
</div>
<div id="KnapsackSolver.KNAPSACK_64ITEMS_SOLVER" class="classattr">
<div class="attr variable"><a class="headerlink" href="#KnapsackSolver.KNAPSACK_64ITEMS_SOLVER">#&nbsp;&nbsp</a>
<span class="name">KNAPSACK_64ITEMS_SOLVER</span><span class="default_value"> = 1</span>
</div>
<div class="docstring"><p>Optimized method for single dimension small problems</p>
<p>Limited to 64 items and one dimension, this
solver uses a branch &amp; bound algorithm. This solver is about 4 times
faster than KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER.</p>
</div>
</div>
<div id="KnapsackSolver.KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER" class="classattr">
<div class="attr variable"><a class="headerlink" href="#KnapsackSolver.KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER">#&nbsp;&nbsp</a>
<span class="name">KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER</span><span class="default_value"> = 2</span>
</div>
<div class="docstring"><p>Dynamic Programming approach for single dimension problems</p>
<p>Limited to one dimension, this solver is based on a dynamic programming
algorithm. The time and space complexity is O(capacity *
number_of_items).</p>
</div>
</div>
<div id="KnapsackSolver.KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER" class="classattr">
<div class="attr variable"><a class="headerlink" href="#KnapsackSolver.KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER">#&nbsp;&nbsp</a>
<span class="name">KNAPSACK_MULTIDIMENSION_CBC_MIP_SOLVER</span><span class="default_value"> = 3</span>
</div>
<div class="docstring"><p>CBC Based Solver</p>
<p>This solver can deal with both large number of items and several
dimensions. This solver is based on Integer Programming solver CBC.</p>
</div>
</div>
<div id="KnapsackSolver.KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER" class="classattr">
<div class="attr variable"><a class="headerlink" href="#KnapsackSolver.KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER">#&nbsp;&nbsp</a>
<span class="name">KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER</span><span class="default_value"> = 5</span>
</div>
<div class="docstring"><p>Generic Solver.</p>
<p>This solver can deal with both large number of items and several
dimensions. This solver is based on branch and bound.</p>
</div>
</div>
<div id="KnapsackSolver.KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER" class="classattr">
<div class="attr variable"><a class="headerlink" href="#KnapsackSolver.KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER">#&nbsp;&nbsp</a>
<span class="name">KNAPSACK_MULTIDIMENSION_SCIP_MIP_SOLVER</span><span class="default_value"> = 6</span>
</div>
<div class="docstring"><p>SCIP based solver</p>
<p>This solver can deal with both large number of items and several
dimensions. This solver is based on Integer Programming solver SCIP.</p>
</div>
</div>
<div id="KnapsackSolver.Init" class="classattr">
<div class="attr function"><a class="headerlink" href="#KnapsackSolver.Init">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">Init</span><span class="signature">(
self,
profits: &#39;std::vector&lt; int64_t &gt; const &amp;&#39;,
weights: &#39;std::vector&lt; std::vector&lt; int64_t &gt; &gt; const &amp;&#39;,
capacities: &#39;std::vector&lt; int64_t &gt; const &amp;&#39;
) -&gt; &#39;void&#39;</span>:
</div>
<details>
<summary>View Source</summary>
<div class="codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Init</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">profits</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; int64_t &gt; const &amp;&quot;</span><span class="p">,</span> <span class="n">weights</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; std::vector&lt; int64_t &gt; &gt; const &amp;&quot;</span><span class="p">,</span> <span class="n">capacities</span><span class="p">:</span> <span class="s2">&quot;std::vector&lt; int64_t &gt; const &amp;&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Initializes the solver and enters the problem to be solved.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_Init</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">profits</span><span class="p">,</span> <span class="n">weights</span><span class="p">,</span> <span class="n">capacities</span><span class="p">)</span>
</pre></div>
</details>
<div class="docstring"><p>Initializes the solver and enters the problem to be solved.</p>
</div>
</div>
<div id="KnapsackSolver.Solve" class="classattr">
<div class="attr function"><a class="headerlink" href="#KnapsackSolver.Solve">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">Solve</span><span class="signature">(self) -&gt; &#39;int64_t&#39;</span>:
</div>
<details>
<summary>View Source</summary>
<div class="codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;int64_t&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Solves the problem and returns the profit of the optimal solution.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_Solve</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</pre></div>
</details>
<div class="docstring"><p>Solves the problem and returns the profit of the optimal solution.</p>
</div>
</div>
<div id="KnapsackSolver.BestSolutionContains" class="classattr">
<div class="attr function"><a class="headerlink" href="#KnapsackSolver.BestSolutionContains">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">BestSolutionContains</span><span class="signature">(self, item_id: int) -&gt; bool</span>:
</div>
<details>
<summary>View Source</summary>
<div class="codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">BestSolutionContains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item_id</span><span class="p">:</span> <span class="s2">&quot;int&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;bool&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Returns true if the item &#39;item_id&#39; is packed in the optimal knapsack.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_BestSolutionContains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item_id</span><span class="p">)</span>
</pre></div>
</details>
<div class="docstring"><p>Returns true if the item 'item_id' is packed in the optimal knapsack.</p>
</div>
</div>
<div id="KnapsackSolver.set_use_reduction" class="classattr">
<div class="attr function"><a class="headerlink" href="#KnapsackSolver.set_use_reduction">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">set_use_reduction</span><span class="signature">(self, use_reduction: bool) -&gt; &#39;void&#39;</span>:
</div>
<details>
<summary>View Source</summary>
<div class="codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">set_use_reduction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_reduction</span><span class="p">:</span> <span class="s2">&quot;bool&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_set_use_reduction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_reduction</span><span class="p">)</span>
</pre></div>
</details>
</div>
<div id="KnapsackSolver.set_time_limit" class="classattr">
<div class="attr function"><a class="headerlink" href="#KnapsackSolver.set_time_limit">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">set_time_limit</span><span class="signature">(self, time_limit_seconds: &#39;double&#39;) -&gt; &#39;void&#39;</span>:
</div>
<details>
<summary>View Source</summary>
<div class="codehilite"><pre><span></span> <span class="k">def</span> <span class="nf">set_time_limit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time_limit_seconds</span><span class="p">:</span> <span class="s2">&quot;double&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;void&quot;</span><span class="p">:</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Time limit in seconds.</span>
<span class="sd"> When a finite time limit is set the solution obtained might not be optimal</span>
<span class="sd"> if the limit is reached.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">_pywrapknapsack_solver</span><span class="o">.</span><span class="n">KnapsackSolver_set_time_limit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time_limit_seconds</span><span class="p">)</span>
</pre></div>
</details>
<div class="docstring"><p>Time limit in seconds.</p>
<p>When a finite time limit is set the solution obtained might not be optimal
if the limit is reached.</p>
</div>
</div>
</section>
</main>
</body>
</html>