{"id":596,"date":"2018-11-11T20:42:12","date_gmt":"2018-11-11T18:42:12","guid":{"rendered":"https:\/\/markusheinemann.com\/wordpress\/?p=596"},"modified":"2018-11-12T00:12:11","modified_gmt":"2018-11-11T22:12:11","slug":"das-knapsack-problem","status":"publish","type":"post","link":"https:\/\/markusheinemann.com\/wordpress\/?p=596","title":{"rendered":"Das Knapsack-Problem"},"content":{"rendered":"<p>Zun\u00e4chst soll das Knapsack-Problem als abstraktes Modell in Google-OR-Tools implementiert werden.<\/p>\n<p><strong>Beschreibung des Knapsack-Problems<\/strong><br \/>\nDas Knapsack-Problem entspringt der Aufgabe einen Rucksack (engl. Knapsack) mit beschr\u00e4nkter Kapazit\u00e4t zu packen. Dabei k\u00f6nnen verschieden Gegenst\u00e4nde <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-b80aeecc36ecd77089b33684f6f2b8db_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#105;&#61;&#49;&#44;&#46;&#46;&#46;&#44;&#73;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"93\" style=\"vertical-align: -4px;\"\/> entweder eingepackt werden, oder zur\u00fcckgelassen werden. F\u00fcr jeden Gegenstand <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-eeb631e2c4c46bed3b8d96f16edc5a2a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#105;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"7\" style=\"vertical-align: 0px;\"\/> gibt es im Modell eine Bin\u00e4rvariable <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-593ad0e591b6ba68a877f9a51e8bc42b_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#123;&#105;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"17\" style=\"vertical-align: -3px;\"\/>, die den Wert eins annimmt, wenn der Gegenstand in einer L\u00f6sung dem Rucksack zugeordnet wurde.<\/p>\n<p><strong>Kapazit\u00e4tsrestriktion<\/strong><\/p>\n<p>Der Rucksack verf\u00fcgt \u00fcber eine beschr\u00e4nkte Kapazit\u00e4t <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-f8fd9dc625548a0900f992f3975237a2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"19\" style=\"vertical-align: 0px;\"\/>. Jeder Gegenstand nimmt einen bestimmten Anteil der Kapazit\u00e4t in Anspruch. F\u00fcr Gegenstand <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-eeb631e2c4c46bed3b8d96f16edc5a2a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#105;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"7\" style=\"vertical-align: 0px;\"\/> ist dessen Kapazit\u00e4tsbedarf <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-afa16bb8ac89ed65bd605e8a34044751_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#103;&#95;&#123;&#105;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"13\" width=\"15\" style=\"vertical-align: -4px;\"\/> als Parameter vorgegeben.<\/p>\n<p style=\"text-align: left;\">Als Nebenbedingung ergibt sich daraus:<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-0e125d6df6ca10efacba82d7708cb5d9_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#100;&#105;&#115;&#112;&#108;&#97;&#121;&#115;&#116;&#121;&#108;&#101;&#92;&#115;&#117;&#109;&#95;&#123;&#105;&#61;&#49;&#125;&#94;&#123;&#73;&#125;&#32;&#120;&#95;&#123;&#105;&#125;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#103;&#95;&#123;&#105;&#125;&#32;&#92;&#108;&#101;&#113;&#32;&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"63\" width=\"130\" style=\"vertical-align: -26px;\"\/><\/p>\n<p>Sie stellt sicher, dass nur die Gegenst\u00e4nde in den Rucksack gepackt werden k\u00f6nnen, die die Kapazit\u00e4t gemeinsam nicht \u00fcbersteigen.<\/p>\n<p><strong>Dazu ein kleines Beispiel:<\/strong> Es gibt drei Gegenst\u00e4nde Schlafsack: <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-7d79895c1c37380d95898d83a482781c_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#105;&#61;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"17\" width=\"44\" style=\"vertical-align: -1px;\"\/>, Waschbeutel: <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-e6a329f90c3669d69f6cc051b8130445_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#105;&#61;&#50;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"45\" style=\"vertical-align: 0px;\"\/> und Winterjacke: <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-dcc74f8c187622c7af1268746bd4dac2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#105;&#61;&#51;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"45\" style=\"vertical-align: 0px;\"\/>. Die Kapazit\u00e4t sei das zul\u00e4ssige Gesamtgewicht, dass der Rucksack haben darf <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-18b87801929b67674fb475a164d9ab8a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#75;&#61;&#55;&#107;&#103;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"80\" style=\"vertical-align: -4px;\"\/>. Weiterhin gegeben sind die Gewichte (Kapazit\u00e4tsbedarf der Gegenst\u00e4nde). Der Schlafsack wiegt <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-b1b6b09f7756a33ffa013d5a032e0dbc_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;&#95;&#49;&#61;&#52;&#107;&#103;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"84\" style=\"vertical-align: -4px;\"\/> (Naturdaune). Das Gewicht des Waschbeutels ist <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-43b0a2e0490b9f7adf357aef479c57f1_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;&#95;&#50;&#61;&#51;&#107;&#103;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"84\" style=\"vertical-align: -4px;\"\/> und die Winterjacke wiegt <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-3083eb9bf2ce9aa73eb070c4a2fdbe84_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;&#95;&#51;&#61;&#51;&#107;&#103;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"84\" style=\"vertical-align: -4px;\"\/>.<\/p>\n<p style=\"padding-left: 30px;\">Die Kapazit\u00e4tsrestriktion baut sich nun wie folgt f\u00fcr die drei Gegenst\u00e4nde auf:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-8fcc92b2058afb5c20b8d5152a2e95a8_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#119;&#95;&#49;&#32;&#43;&#32;&#120;&#95;&#50;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#119;&#95;&#50;&#32;&#43;&#32;&#120;&#95;&#51;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#119;&#95;&#51;&#32;&#92;&#108;&#101;&#113;&#32;&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"280\" style=\"vertical-align: -4px;\"\/><br \/>\nSetzt man die Werte ein erh\u00e4lt man:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-2bc348ab7a54b0b94bba318d53d86d96_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#52;&#107;&#103;&#32;&#43;&#32;&#120;&#95;&#50;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#51;&#107;&#103;&#32;&#43;&#32;&#120;&#95;&#51;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#51;&#107;&#103;&#32;&#92;&#108;&#101;&#113;&#32;&#55;&#107;&#103;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"320\" style=\"vertical-align: -4px;\"\/><\/p>\n<p>Wenn man die Gewichte betrachtet, zeigt sich, dass nicht alle drei Gegenst\u00e4nde mitgenommen werden k\u00f6nnen, wenn Kapazit\u00e4tsrestriktion eingehalten werden soll. W\u00fcrde man nun jede der drei Bin\u00e4rvariablen <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-efee1d079d8b7e4de8a36994714afea6_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#44;&#32;&#120;&#95;&#50;&#44;&#32;&#120;&#95;&#51;\" title=\"Rendered by QuickLaTeX.com\" height=\"13\" width=\"81\" style=\"vertical-align: -4px;\"\/> auf den Wert eins setzen (alle Gegenst\u00e4nde einpacken), w\u00e4re die Kapazit\u00e4t von <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-249ea61a80249b85bc4087134f618d2f_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#55;&#107;&#103;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"31\" style=\"vertical-align: -4px;\"\/> \u00fcberschritten.<\/p>\n<p style=\"padding-left: 30px;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-54236bb8bde09943389cdcdaa4471cbf_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#52;&#107;&#103;&#32;&#43;&#32;&#51;&#107;&#103;&#32;&#43;&#32;&#51;&#107;&#103;&#32;&#61;&#32;&#49;&#48;&#107;&#103;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"221\" style=\"vertical-align: -4px;\"\/><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-da53e7a4d40739691cf8fe289c1caa9f_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#49;&#48;&#107;&#103;&#32;&#92;&#108;&#101;&#113;&#32;&#55;&#107;&#103;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"103\" style=\"vertical-align: -4px;\"\/> &#8211; womit die Kapazit\u00e4tsrestriktion offensichtlich nicht einghalten ist.<\/p>\n<p style=\"padding-left: 30px;\">Es lassen sich demnach in dieser <strong>Beispielinstanz<\/strong> nur zwei der drei Gegenst\u00e4nde des Beispiels mitnehmen. Die zul\u00e4ssigen L\u00f6sungen sind:<br \/>\n&#8211; Schlafsack und Waschbeutel (<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-866912489fcf8fe2b97b4492a6be73de_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#61;&#49;&#44;&#32;&#120;&#95;&#50;&#61;&#49;&#44;&#32;&#120;&#95;&#51;&#61;&#48;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"198\" style=\"vertical-align: -4px;\"\/>)<br \/>\n&#8211; Schlafsack und Wintermantel (<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-15e8b82838f92d8245c3417986bc3f07_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#61;&#49;&#44;&#32;&#120;&#95;&#50;&#61;&#48;&#44;&#32;&#120;&#95;&#51;&#61;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"197\" style=\"vertical-align: -4px;\"\/>)<br \/>\n&#8211; Waschbeutel und Wintermantel (<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-97165c5fdcef4342bd88d5b6855f7536_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#61;&#48;&#44;&#32;&#120;&#95;&#50;&#61;&#49;&#44;&#32;&#120;&#95;&#51;&#61;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"197\" style=\"vertical-align: -4px;\"\/>)<br \/>\n&#8211; nur den Schlafsack (<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-09674cc7d9a01e73ef2f5eca1c061899_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#61;&#49;&#44;&#32;&#120;&#95;&#50;&#61;&#48;&#44;&#32;&#120;&#95;&#51;&#61;&#48;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"198\" style=\"vertical-align: -4px;\"\/>)<br \/>\n&#8211; nur den Waschbeutel (<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-a7d1b656827fd876c42a3fd479976187_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#61;&#48;&#44;&#32;&#120;&#95;&#50;&#61;&#49;&#44;&#32;&#120;&#95;&#51;&#61;&#48;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"198\" style=\"vertical-align: -4px;\"\/>)<br \/>\n&#8211; nur den Wintermantel (<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-46a773e317feb1c82617c63a9c2f9a05_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#49;&#61;&#48;&#44;&#32;&#120;&#95;&#50;&#61;&#48;&#44;&#32;&#120;&#95;&#51;&#61;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"197\" style=\"vertical-align: -4px;\"\/>)<\/p>\n<p><strong>Zielfunktion<\/strong><br \/>\nJeder Gegenstand <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-eeb631e2c4c46bed3b8d96f16edc5a2a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#105;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"7\" style=\"vertical-align: 0px;\"\/> im Rucksack hat einen bestimmten Nutzen <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-6bb64628b9408f2d022578a7e0bf76f8_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#117;&#95;&#123;&#105;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"17\" style=\"vertical-align: -3px;\"\/>. Die Zielfunktion addiert nun den Nutzen s\u00e4mtlicher eingepackter Gegenst\u00e4nde. Damit wird versucht, die gegenbene Kapazit\u00e4t bestm\u00f6glich auszunutzen.<br \/>\nDie Zielfunktion ergibt sich demnach wie folgt:<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-2c738c363d319019bc43a6287a5f8cf1_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#109;&#97;&#120;&#105;&#109;&#105;&#101;&#114;&#101;&#32;&#92;&#44;&#32;&#70;&#40;&#120;&#41;&#32;&#61;&#32;&#92;&#100;&#105;&#115;&#112;&#108;&#97;&#121;&#115;&#116;&#121;&#108;&#101;&#92;&#115;&#117;&#109;&#95;&#123;&#105;&#61;&#49;&#125;&#94;&#123;&#73;&#125;&#32;&#120;&#95;&#123;&#105;&#125;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#117;&#95;&#123;&#105;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"63\" width=\"266\" style=\"vertical-align: -26px;\"\/><\/p>\n<p>F ist der Gesamtnutzen, der sich aus einer L\u00f6sung ergibt. Dieser Gesamtnutzen soll maximiert werden.<br \/>\nDen h\u00f6chsten Wert den die Zielfunktion jemals annehmen k\u00f6nnte, w\u00e4re die Summe der Nutzenwerte s\u00e4mtlicher Gegenst\u00e4nde. Dies k\u00f6nnte aber nur eintreten, wenn jeder Gegenstand eingepackt werden k\u00f6nnte. Das wird jedoch ggf. von der Kapazit\u00e4tsrestriktion verhindert (wie das Beispiel oben zeigt).<\/p>\n<blockquote><p>Hier nochmal das gesamte Modell:<\/p>\n<p style=\"padding-left: 30px;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-86afc24c05971990e4c3af5ad90cfcd7_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#109;&#97;&#120;&#32;&#92;&#44;&#32;&#70;&#40;&#120;&#41;&#32;&#61;&#32;&#92;&#100;&#105;&#115;&#112;&#108;&#97;&#121;&#115;&#116;&#121;&#108;&#101;&#92;&#115;&#117;&#109;&#95;&#123;&#105;&#61;&#49;&#125;&#94;&#123;&#73;&#125;&#32;&#120;&#95;&#123;&#105;&#125;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#117;&#95;&#123;&#105;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"63\" width=\"203\" style=\"vertical-align: -26px;\"\/><br \/>\nunter den Nebenbedingungen:<\/p>\n<p style=\"padding-left: 30px;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-0e125d6df6ca10efacba82d7708cb5d9_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#100;&#105;&#115;&#112;&#108;&#97;&#121;&#115;&#116;&#121;&#108;&#101;&#92;&#115;&#117;&#109;&#95;&#123;&#105;&#61;&#49;&#125;&#94;&#123;&#73;&#125;&#32;&#120;&#95;&#123;&#105;&#125;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#103;&#95;&#123;&#105;&#125;&#32;&#92;&#108;&#101;&#113;&#32;&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"63\" width=\"130\" style=\"vertical-align: -26px;\"\/><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-f79a6610c55f4b389fe23e9f98d6a46e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#120;&#95;&#105;&#32;&#92;&#105;&#110;&#32;&#92;&#123;&#48;&#59;&#49;&#92;&#125;&#32;&#92;&#44;&#32;&#92;&#102;&#111;&#114;&#97;&#108;&#108;&#32;&#92;&#44;&#32;&#105;&#61;&#49;&#44;&#46;&#46;&#46;&#44;&#73;\" title=\"Rendered by QuickLaTeX.com\" height=\"23\" width=\"208\" style=\"vertical-align: -6px;\"\/><\/p>\n<p>&nbsp;<\/p><\/blockquote>\n<p><strong>Implementation in Google-OR-Tools<\/strong><\/p>\n<p>Zu Beginn des Programms wird eine Instanz des Solvers importiert.<br \/>\n<code>from ortools.linear_solver import pywraplp<\/code><\/p>\n<p>Anschlie\u00dfend werden die Problemdaten definiert. Hier werden die Daten aus dem oben beschriebenen Beispiel verwendet.<br \/>\nZun\u00e4chst die Anzahl der Gegenst\u00e4nde <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/Markusheinemann.com\/wordpress\/wp-content\/ql-cache\/quicklatex.com-cf0bc68ff431cea489741a3979ee463a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#73;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"11\" style=\"vertical-align: 0px;\"\/>:<br \/>\n<code>I=3<\/code><br \/>\nDie Gewichte der Gegenst\u00e4nde ist eine Liste.<br \/>\n<code>g_i=[4,3,3]<\/code><br \/>\nAls Nutzwerte f\u00fcr die drei Gegenst\u00e4nde wird 10, 5 und 9 festgelegt.<br \/>\n<code>u_i=[10,5,9]<\/code><br \/>\nDie Kapazit\u00e4t des Rucksacks ist 7kg.<br \/>\n<code>K=7<\/code><br \/>\nZur besseren Darstellung werden auch die Namen der Gegenst\u00e4nde als Liste hinterlegt.<br \/>\n<code>Namen_der_Gegenstaende=[\"Schlafsack\",\"Waschbeutel\",\"Wintermantel\"]<\/code><\/p>\n<p>Zum Modell:<\/p>\n<p>Jede der drei Bin\u00e4rvariablen wird auch im Python-Modell eine eigene Variable angelegt. Jeder Variable k\u00f6nnte nun ein eigener Name zugeordnet werden. Z.B. &#8222;ZuordnenVonGegenstand1&#8220;. Der Nachteil daran w\u00e4re, dass bei einer gro\u00dfen Anzahl an Variablen das Programmieren extrem aufwendig w\u00e4re.<\/p>\n<p>Damit nicht jeder Variable ein eigener Name zugeordnet werden muss, werden die Variablen in einer Liste oder einem Dictionary gesammelt. Das dict ist zwar etwas aufwendiger, erleichtert aber bei gro\u00dfen Modellen enorm den Zugriff. Hier wird gleich das Dictionary verwendet. Jedes Dictionary ist in Python eine Menge aus Paaren von Schl\u00fcsselwerten und dazugeh\u00f6rigen Elemente. Das hier verwendete Dictionary hei\u00dft &#8222;Variablen&#8220;. Zun\u00e4chst wird es initialisiert.<\/p>\n<p><code>Variablen = {}<\/code><\/p>\n<p>Wir verwenden als Schl\u00fcssel den Index des Gegenstands um eins reduziert (0,1,2). Eine Schleife l\u00e4uft alle Elemente von 0 bis I-1 durch (0,1,2).<code><\/code><\/p>\n<p><code>for i in range(I):<br \/>\n&nbsp;Variablen[i] = solver.IntVar(0, 1, 'Gegenstand[%i]' % i)<\/code><\/p>\n<p>In jedem Schleifenschritt wird eine ganzzahlige Variable generiert (rechte Seite der Gleichung). Der erste Parameter ist der kleinstm\u00f6gliche Wert, den die Variable annehmen kann (hier 0). Danach folgt der gr\u00f6\u00dftm\u00f6gliche Wert (1 f\u00fcr Einpacken des Gegenstandes). Der letzte Parameter der Funktion \u00fcbergibt eine Variablenbezeichnung. Diese lautet hier Gegenstand[%i] f\u00fcr %i setzt Python den aktuellen Indexwert i ein. Jede Variable kann damit eindeutig auseinandergehalten werden. Es ist aber auch ein anderer Variablenname m\u00f6glich.<\/p>\n<p>Und schon geht&#8217;s zur Nebenbedingung. Sie enth\u00e4lt eine Summe \u00fcber jeden Gegenstand. Diese wird zun\u00e4chst als Variable &#8222;linkeSeite&#8220; gespeichert.<\/p>\n<p><code>linkeSeite=solver.Sum([g_i[i] * Variablen[i] for i in range(I)])<\/code><\/p>\n<p>Dabei wird die Funktion solver.Sum der OR-tools verwendet. Als Parameter erh\u00e4lt sie eine Liste an Variablen. Diese kann man entweder beliebig erstellen, oder wie hier in einer inline Funktion erstellen. \u00dcber die bekannten Indizes for i in range(I) wird der jeweilige Gewichtswert mit dem Variablenwert multipliziert (genau wie in der echten Nebenbedingung).<\/p>\n<p>Die Kapazit\u00e4tsrestriktion wird nun an den Solver \u00fcbergeben. Das macht die Funktion Solver.Add.<\/p>\n<p><code>solver.Add(linkeSeite&lt;=K)<\/code><\/p>\n<p>Der Parameter K beinhaltet unseren oben definierten Paramter f\u00fcr die Kapazit\u00e4t (K=7).<\/p>\n<p>Zielfunktion<br \/>\nGanz \u00e4hnlich zur Restriktion wird nun die Zielfunktion als eigenes Objekt ZF definiert.<\/p>\n<p><code>ZF=solver.Sum([Variablen[i] * u_i[i] for i in range(I)])<\/code><\/p>\n<p>Anstelle des Gewichtes werden hier die Nutzwerte (jeweils das ite Element aus der Liste u_i) mit dem zugeh\u00f6rigen Variablenwert von i multipliziert.<\/p>\n<p>Zuletzt wird die Optimierungsrichtung festgelegt:<\/p>\n<p><code>objective=solver.Maximize(ZF)<\/code><\/p>\n<p>Und schon beauftragen wir den Solver mit der L\u00f6sung des Modells:<\/p>\n<p><code>solver.Solve()<\/code><\/p>\n<p>Hier noch einige Zeilen zur Auswertung der L\u00f6sung. Diese beinhalten Ausgabe des Zielfunktionswertes, der ben\u00f6tigten Rechenzeit, Iterationen und der L\u00f6sung selbst.<\/p>\n<p><code>print('Zielfunktionswert:', solver.Objective().Value())<br \/>\nprint('WallTime:', solver.WallTime())<br \/>\nprint('iterations:', solver.Iterations())<br \/>\nprint()<\/p>\n<p>for i in range(I):<br \/>\n&nbsp;print(\"Variablenwert Gegenstand %i: %i\" % (i,Variablen[i].SolutionValue()))<\/p>\n<p>optimale_Loesung=[]<br \/>\nfor i in range(I):<br \/>\n&nbsp;if Variablen[i].SolutionValue()==1:<br \/>\n&nbsp;&nbsp;optimale_Loesung.append(Namen_der_Gegenstaende[i])<\/p>\n<p>print(\"Inhalt des Rucksacks: \",optimale_Loesung )<\/code><\/p>\n<p>Hier die fertige <a href=\"https:\/\/Markusheinemann.com\/downloads\/knapsack.py\" target=\"_blank\" rel=\"noopener\">Python-Datei<\/a> zum Download.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zun\u00e4chst soll das Knapsack-Problem als abstraktes Modell in Google-OR-Tools implementiert werden. Beschreibung des Knapsack-Problems Das Knapsack-Problem entspringt der Aufgabe einen Rucksack (engl. Knapsack) mit beschr\u00e4nkter Kapazit\u00e4t zu packen. Dabei k\u00f6nnen verschieden Gegenst\u00e4nde entweder eingepackt werden, oder zur\u00fcckgelassen werden. F\u00fcr jeden Gegenstand gibt es im Modell eine Bin\u00e4rvariable , die den Wert eins annimmt, wenn der [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-596","post","type-post","status-publish","format-standard","hentry","category-google-or-tools"],"_links":{"self":[{"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=596"}],"version-history":[{"count":53,"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/596\/revisions"}],"predecessor-version":[{"id":657,"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/596\/revisions\/657"}],"wp:attachment":[{"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/markusheinemann.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}