{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 정수 계획법\n", "\n", "정수 계획법(integer programming)\n", "\n", "## Example 6-4\n", "\n", "**이강우 & 김정자. (2012). _EXCEL 2010 경영과학_. 한경사, 380.**\n", "\n", "**Table 6-1**는 배낭에 넣어 갖고 갈 수 있는 3개의 상이한 품목에 대한 품목별 무게와 효용 및 배낭의 보관능력을 나타내고 있다. 배낭의 보관능력 제약을 만족하면서 배낭에 넣어 갖고 갈 수 있는 품목의 효용을 최대화하는 정수계획모형을 작성한 후 최적 정수해를 구하라. 단, 같은 품목을 중복으로 배낭에 넣을 수 없다.\n", "\n", "|Item|Weight|Value|\n", "|:-:|:-:|:-:|\n", "|1|3|6|\n", "|2|4|8|\n", "|3|2|3|\n", "\n", "단일품목 배낭문제를 0-1정수계획모형으로 정식화하기 위해서는 배낭에 넣을 수 있는 품목 $j$를 결정변수 $X_{j}$라고 정의하고 $X_{j}$가 0과 1 중에서 하나의 값만 갖도록 하여야 한다. 왜냐하면 배낭에 넣어 갖고 갈 수 있는 품목은 단일품목 배낭문제의 성격상 그 품목을 선택하거나 또는 선택하지 않기 때문이다. 따라서 $X_{j}$가 1의 값을 가질 때는 품목 $j$가 선택되고, 0의 값을 가질 때는 품목 $j$가 선택되지 않는다고 하자. 만일 각 품목에 대해 전체가 아닌 일부분의 선택이 가능하다면 이 문제는 분할성의 가정이 성립하므로 선형계획문제로 정식화할 수 있다.\n", "\n", "$$X_{j} = \\begin{cases}\n", "1, \\text{ 배낭에 품목 $j$를 넣는 경우 $(j=1,2,3)$}\\\\\n", "0, \\text{ 배낭에 품목 $j$를 넣지 않는 경우 $(j=1,2,3)$}\\\\\n", "\\end{cases}$$" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Status Optimal\n", "Z = 11.0\n", "X1 = 0.0\n", "X2 = 1.0\n", "X3 = 1.0\n" ] } ], "source": [ "from pulp import *\n", "\n", "prob = LpProblem(name='0-1 Knapsack Problem', sense=LpMaximize)\n", "\n", "x1 = LpVariable(name='X1', lowBound=0, cat='Binary')\n", "x2 = LpVariable(name='X2', lowBound=0, cat='Binary')\n", "x3 = LpVariable(name='X3', lowBound=0, cat='Binary')\n", "\n", "prob += 7*x1 + 8*x2 + 3*x3\n", "\n", "prob += 3*x1 + 4*x2 + 2*x3 <= 6\n", "\n", "# Solving problem\n", "prob.solve()\n", "print('Status', LpStatus[prob.status])\n", "\n", "print('Z = {}'.format(value(prob.objective)))\n", "for i in prob.variables():\n", " print('{} = {}'.format(i.name, i.varValue))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiple Knapsack Problem\n", "\n", "### Example 6-5\n", "\n", "**이강우 & 김정자. (2012). _EXCEL 2010 경영과학_. 한경사, 389.**\n", "\n", "
Table 6-3는 트럭에 적재할 수 있는 3개의 상이한 품목에 대하여 이들 품목별 단위당 무게, 적재가능 수량, 단위당 수익 및 트럭의 적재능력을 나타내고 있다. 트럭의 적재능력의 제약을 만족하면서 트럭에 품목들을 적재하여 최대의 수익을 얻을려고 한다. 트럭의 수익을 최대로 하는 적재 품목의 수량을 결정하기 위한 정수계획 모형을 작성하고 최적해를 구하라. 단, 트럭에 적재하는 품목의 수량은 정수단위로 결정해야 한다.
\n", "\n", "품목 | \n", "단위당 무게(kg) | \n", "적재가능수량(개) | \n", "단위당 수익(천원) | \n", "적재능력(kg) | \n", "
---|---|---|---|---|
1 | \n", "30 | \n", "100 | \n", "70 | \n", "6 | \n", "
2 | \n", "40 | \n", "200 | \n", "80 | \n", "|
3 | \n", "20 | \n", "300 | \n", "30 | \n", "