{ "metadata": { "name": "", "signature": "sha256:ccf7819616b02b8dbafa513117b865dd8394c5196197378c1cff426c4543b1a5" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "PuLP\u3068PICOS\u306b\u3088\u308b\u6570\u7406\u6700\u9069\u5316\n" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "PuLP\u3068\u306f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6a5f\u80fd : \u3000LP\u306e\u30e2\u30c7\u30ea\u30f3\u30b0\u30c4\u30fc\u30eb" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5b88\u5099\u7bc4\u56f2 : LP\u3068IP \u6574\u6570\u5909\u6570\u3082\u6271\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e\n", "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f[HP](http://packages.python.org/PuLP/)\u304b\u3089\u5165\u624b\u53ef\u80fd\uff0e\u3053\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u304b\u3089\u306e\u5f15\u7528\u3092\u591a\u304f\u4f7f\u7528\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u30bd\u30eb\u30d0\u306f\u5225\u9014\u7528\u610f\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff0e\u4eca\u56de\u306fCBC\u3092\u4f7f\u7528\u3057\u307e\u3059\uff0e\u79c1\u304c\u8abf\u3079\u305f\u7bc4\u56f2\u3067\u306f\u3001GLPK\u3092\u4f7f\u3046\u3068\u3001LP\u306e\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u3053\u3053\u3067\u306f\u5f8c\u307b\u3069\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u7528\u3044\u308b\u5834\u9762\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u305d\u306e\u90e8\u5206\u306fGLPK\u3067\u306f\u5b9f\u884c\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u306a\u3044\u3053\u3068\u306b\u7559\u610f\u304f\u3060\u3055\u3044\u3002" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u7dda\u5f62\u8a08\u753b\u554f\u984c\u306e\u5b9a\u7fa9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6b21\u306e\u7dda\u5f62\u8a08\u753b\u554f\u984c\u3092PuLP\u3067\u5b9a\u7fa9\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(\u753b\u50cf\u8868\u793a\u6e96\u5099)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.display import Image\n", "fig = Image(url='http://mathopt.sakura.ne.jp/LP.png')\n", "fig " ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 67, "text": [ "" ] } ], "prompt_number": 67 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u4f7f\u3046\u6e96\u5099 : import\u3059\u308b" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pulp" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 68 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u554f\u984c\u306e\u5b9a\u7fa9 : " ] }, { "cell_type": "code", "collapsed": false, "input": [ "prob = pulp.LpProblem(\"myProblem\",pulp.LpMinimize)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 69 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6700\u5927\u5316\u306e\u3068\u304d\u306f\uff0cLpMaximize\uff0e\u751f\u6210\u3057\u305f\u554f\u984c\u306b\uff0cprob\u3068\u540d\u524d\u3092\u4ed8\u3051\u3066\u899a\u3048\u3066\u304a\u304d\u307e\u3059\u3002" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u5909\u6570\u306e\u5b9a\u7fa9 : " ] }, { "cell_type": "code", "collapsed": false, "input": [ "z1 = pulp.LpVariable(\"z1\",0,3)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 70 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e09\u3064\u306e\u5f15\u6570\u306f\u305d\u308c\u305e\u308c\u3001\u5909\u6570\u306e\u540d\u524d\u3001\u4e0b\u9650\u5024\u3001\u4e0a\u9650\u5024\u3067\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "z2 = pulp.LpVariable(\"z2\",0,1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 71 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u5236\u7d04\u5f0f\u306e\u5b9a\u7fa9 : " ] }, { "cell_type": "code", "collapsed": false, "input": [ "prob += z1 + z2 <= 2" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 72 }, { "cell_type": "markdown", "metadata": {}, "source": [ "+=\u306e\u53f3\u5074\u304c\uff08\u7dda\u5f62\uff09\u4e0d\u7b49\u5f0f\u3067\u3042\u308c\u3070\uff0c\u305d\u308c\u304c\u5236\u7d04\u5f0f\u3068\u3057\u3066prob\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3059\uff0e\u7d50\u679c\u3092print\u3057\u3066\u307f\u308b\u3068\uff0c" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print prob" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "myProblem:\n", "MINIMIZE\n", "None\n", "SUBJECT TO\n", "_C1: z1 + z2 <= 2\n", "\n", "VARIABLES\n", "z1 <= 3 Continuous\n", "z2 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 73 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u76ee\u7684\u95a2\u6570\u306e\u5b9a\u7fa9 : " ] }, { "cell_type": "code", "collapsed": false, "input": [ "prob += -1*z1 - 2*z2 \n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 74 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5236\u7d04\u5f0f\u306e\u5b9a\u7fa9\u306e\u3068\u3053\u308d\u3067\u8ff0\u3079\u307e\u3057\u305f\u304c\u3001\uff0b\uff1d\u306e\u53f3\u5074\u304c\u7dda\u5f62\u4e0d\u7b49\u5f0f\u3067\u306f\u306a\u304f\u7dda\u5f62\u306e\u95a2\u6570\u3067\u3042\u308c\u3070\u3001\u305d\u308c\u306f\u76ee\u7684\u95a2\u6570\u3068\u3057\u3066\u5b9a\u7fa9\u3055\u308c\u307e\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print prob" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "myProblem:\n", "MINIMIZE\n", "-1*z1 + -2*z2 + 0\n", "SUBJECT TO\n", "_C1: z1 + z2 <= 2\n", "\n", "VARIABLES\n", "z1 <= 3 Continuous\n", "z2 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 75 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3067\u306f\u3001\u76ee\u7684\u95a2\u6570\u3092\u4e8c\u5ea6\u5b9a\u7fa9\u3059\u308b\u3068\u3069\u3046\u306a\u308b\u3067\u3057\u3087\u3046\u304b\uff1f\u91cd\u8907\u3057\u3066\u5b9a\u7fa9\u3059\u308b\u3068\u3001\u6700\u5f8c\u306b\u5b9a\u7fa9\u3057\u305f\u3082\u306e\u304c\u76ee\u7684\u95a2\u6570\u3068\u3057\u3066\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "prob+=20*z1+30*z2" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "print prob" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "myProblem:\n", "MINIMIZE\n", "20*z1 + 30*z2 + 0\n", "SUBJECT TO\n", "_C1: z1 + z2 <= 2\n", "\n", "VARIABLES\n", "z1 <= 3 Continuous\n", "z2 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 77 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3067\u554f\u984c\u304c\u5b9a\u7fa9\u3067\u304d\u307e\u3057\u305f" ] }, { "cell_type": "code", "collapsed": false, "input": [ "prob += -z1-2*z2" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 78 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u89e3\u304f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3046\u3057\u3066\u5b9a\u7fa9\u3057\u305f\u554f\u984cprob\u3092\u89e3\u304f\u306b\u306f\uff0csolve()\u3092\u5b9f\u884c\u3057\u307e\u3059\uff0e\u8907\u6570\u306e\u30bd\u30eb\u30d0\u304c\u5b9f\u884c\u53ef\u80fd\u306a\u74b0\u5883\u3067\u3042\u308c\u3070\uff0c\u5f15\u6570\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\uff0c\u4f7f\u7528\u3059\u308b\u30bd\u30eb\u30d0\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "status = prob.solve()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 79 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5b9f\u884c\u7d50\u679c\u306e\u72b6\u614b\u306f\u3001LpStatus[status]\u3067\u53d6\u5f97\u3057\u307e\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print pulp.LpStatus[status]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n" ] } ], "prompt_number": 80 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6700\u9069\u5024\u3092\u5f97\u308b\u306b\u306f\u3001pulp.value(prob.objective)\u3092\u5b9f\u884c\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print pulp.value(prob.objective)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "-3.0\n" ] } ], "prompt_number": 81 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6700\u9069\u89e3\u3092\u5f97\u308b\u306b\u306f\u3001\u6b21\u306e\u3088\u3046\u306b\u5b9f\u884c\u3057\u307e\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print pulp.value(z1), pulp.value(z2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1.0 1.0\n" ] } ], "prompt_number": 82 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u53cc\u5bfe\u5909\u6570\u306e\u53d6\u5f97" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "LP\u3092\u89e3\u3044\u305f\u3068\u304d\u306b\u306f\uff0c\u5404\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e\u305f\u3060\u3057\uff0c\u30bd\u30eb\u30d0\u3068\u3057\u3066GLPK\u3092\u7528\u3044\u305f\u3068\u304d\u306f\u53d6\u5f97\u3067\u304d\u306a\u3044\u3088\u3046\u3067\u3059\u3002\u79c1\u306e\u74b0\u5883\u304c\u539f\u56e0\u304b\u3001\u4ed5\u69d8\u306a\u306e\u304b\u306f\u3044\u307e\u3060\u4e0d\u660e\u3067\u3059\u3002" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u53cc\u5bfe\u5909\u6570\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b\u306f\uff0cLP\u306e\u5236\u7d04\u5f0f\u306b\u540d\u524d\u3092\u4ed8\u3051\u3066\u304a\u304f\u3068\u4fbf\u5229\u3067\u3059\u3002\u5148\u307b\u3069\u306e\u554f\u984c\u3092\u4e00\u304b\u3089\u5b9a\u7fa9\u3057\u76f4\u3057\u3001\u4eca\u5ea6\u306f\u5236\u7d04\u5f0f\u306b\u540d\u524d\u3092\u4ed8\u3051\u307e\u3057\u3087\u3046\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "prob_d = pulp.LpProblem(\"myProblem\",pulp.LpMinimize)\n", "x1=pulp.LpVariable(\"x1\",0,3)\n", "x2=pulp.LpVariable(\"x2\",0,1)\n", "prob_d+=-x1-2*x2\n", "prob_d+=x1+x2<=2,\"First_Constraint\"\n", "print prob_d" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "myProblem:\n", "MINIMIZE\n", "-1*x1 + -2*x2 + 0\n", "SUBJECT TO\n", "First_Constraint: x1 + x2 <= 2\n", "\n", "VARIABLES\n", "x1 <= 3 Continuous\n", "x2 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 83 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3066\u3001\u3053\u306e\u7dda\u5f62\u8a08\u753b\u554f\u984c\u3092\u89e3\u3044\u3066\u3001\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002\u307e\u305a\u306f\u89e3\u3044\u3066\u3001\u6700\u9069\u89e3\u3092\u5f97\u307e\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "status = prob_d.solve()\n", "print pulp.LpStatus[status]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n" ] } ], "prompt_number": 84 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3064\u304e\u306b\u3001\u5236\u7d04\u5f0f\u306e\u540d\u524d\u3092\u6307\u5b9a\u3057\u3066\u3001\u305d\u308c\u306b\u5bfe\u5fdc\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u5f97\u307e\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print prob_d.constraints.keys()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['First_Constraint']\n" ] } ], "prompt_number": 85 }, { "cell_type": "code", "collapsed": false, "input": [ "print prob_d.constraints[\"First_Constraint\"].pi" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "-1.0\n" ] } ], "prompt_number": 86 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c\u5b9a\u5f0f\u5316 : Vehicle Routing Problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u914d\u9001\u8a08\u753b\u554f\u984c\u306e\u96c6\u5408\u5206\u5272\u554f\u984c\u5b9a\u5f0f\u5316\u306f\uff0c\u6b21\u306e\u3088\u3046\u306b\u66f8\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e\u3000\u8a18\u6cd5\u306f\u82e5\u5e72\u8907\u96d1\u3067\u3059\u304c\uff0c\u96c6\u5408\u5206\u5272\u554f\u984c\u3067\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "fig = Image(url='http://mathopt.sakura.ne.jp/VRP.png')\n", "fig " ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 87, "text": [ "" ] } ], "prompt_number": 87 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vehicle Routing Problem\uff08\u914d\u9001\u8a08\u753b\u554f\u984c\uff09\u306e\u96c6\u5408\u5206\u5272\u554f\u984c\u5b9a\u5f0f\u5316\u3092PuLP\u3092\u7528\u3044\u3066\u8a18\u8ff0\u3057\u3066\u307f\u307e\u3059\uff0e\u307e\u305a\u306f\uff0c\u6700\u5c0f\u5316\u554f\u984c\u3068\u3057\u3066\u554f\u984c\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff0e\u001c" ] }, { "cell_type": "code", "collapsed": false, "input": [ "routing_model=pulp.LpProblem(\"VRP\",pulp.LpMinimize)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 88 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c : \u5909\u6570\u306e\u5b9a\u7fa9" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u30ea\u30b9\u30c8\u304b\u3089\u5909\u6570\u3092\u751f\u6210\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u914d\u9001\u8a08\u753b\u554f\u984c\u306e\u96c6\u5408\u5206\u5272\u554f\u984c\u5b9a\u5f0f\u5316\u3067\u306f\u3001\u8ca8\u7269\u306e\u96c6\u5408\u3092\u3001\u305d\u306e\u90e8\u5206\u96c6\u5408\u306b\u5206\u5272\u3057\u307e\u3059\u3002\u305d\u306e\u305f\u3081\u306b\u3001\u8ca8\u7269\u306e\u90e8\u5206\u96c6\u5408\u4e00\u3064\u306b\u3064\u304d\u30010\uff0d\uff11\u5909\u6570\u3092\u4e00\u3064\u5b9a\u7fa9\u3057\u307e\u3059\u3002\u90e8\u5206\u96c6\u5408\u306e\u6570\u304c\u81a8\u5927\u306b\u306a\u308b\u3068\u3001\u305d\u308c\u3089\u306e\u4e00\u3064\u4e00\u3064\u306b\u540d\u524d\u3092\u4ed8\u3051\u3066\u5909\u6570\u3092\u5b9a\u7fa9\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u305d\u308c\u3092\u7c21\u5358\u306b\u5b9f\u73fe\u3059\u308b\u3053\u3068\u306e\u3067\u304d\u308b\u547d\u4ee4\u304cpulp\u306b\u306f\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3044\u307e\u3001\u8ca8\u7269\u306e\u90e8\u5206\u96c6\u5408\u306e\u540d\u524d\u3092\u8981\u7d20\u3068\u3059\u308b\u30ea\u30b9\u30c8pow_s\u304c\u3042\u308b\u3068\u3057\u307e\u3059\u3002pow_s\u306f\u3001pow_s=['s1','s2','s3']\u3068\u3001\u4e09\u3064\u306e\u8981\u7d20\u304b\u3089\u306a\u308b\u3068\u3057\u307e\u3059\uff0ePuLP\u306b\u306f\u3001\u30ea\u30b9\u30c8\u3092\u4e0e\u3048\u308b\u3068\u3001\u305d\u306e\u5404\u8981\u7d20\u306b\u5bfe\u3057\u3066\u5909\u6570\u3092\u5b9a\u7fa9\u3059\u308b\u3053\u3068\u306e\u3067\u304d\u308b\u547d\u4ee4\u304c\u3042\u308a\u307e\u3059\u3002\u305d\u308c\u306f\u3064\u304e\u306e\u3082\u306e\u3067\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pow_s=['s1','s2','s3']\n", "pow_s_vars=pulp.LpVariable.dicts('x', pow_s, lowBound=0, upBound=1, cat=pulp.LpBinary)\n", "print pow_s_vars" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{'s3': x_s3, 's2': x_s2, 's1': x_s1}\n" ] } ], "prompt_number": 89 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u306e\u547d\u4ee4\u306b\u3088\u308a\u30013\u3064\u306e\u5909\u6570\u304c\u751f\u6210\u3055\u308c\u3001\u305d\u308c\u3089\u306f\u8f9e\u66f8pow_s_vars\u306b\u304a\u3055\u3081\u3089\u308c\u307e\u3057\u305f\u3002\u3053\u306e\u8f9e\u66f8\u306e\u30ad\u30fc\u306f\u3001\u751f\u6210\u306b\u7528\u3044\u305f\u30ea\u30b9\u30c8\u306e\u5404\u8981\u7d20\u3067\u3059\u3002\u30ad\u30fc\u3068\u3057\u3066\u8981\u7d20\u3092\u6307\u5b9a\u3059\u308b\u3068\u3001\u305d\u306e\u8981\u7d20\u306b\u5bfe\u3057\u3066\u751f\u6210\u3055\u308c\u305f\u5909\u6570\u304c\u5024\u3068\u3057\u3066\u5f97\u3089\u308c\u307e\u3059\u3002\u4f8b\u3048\u3070\u3001\uff53\uff11\u306b\u5bfe\u3057\u3066\u5b9a\u7fa9\u3055\u308c\u305f\u5909\u6570\u3092\u5f97\u308b\u306b\u306f\u3001pow_s_vars['s1']\u3068\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print pow_s_vars['s1']" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "x_s1\n" ] } ], "prompt_number": 90 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u547d\u4ee4pulp.LpVariable.dicts()\u306e\u7b2c\u4e00\u5f15\u6570\u306b\u306f\u3001\u751f\u6210\u3059\u308b\u5909\u6570\u306b\u3064\u3051\u308b\u540d\u524d\u306e\u6700\u521d\u306e\u90e8\u5206\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u4eca\u306e\u4f8b\u3067\u306fx\u3092\u6307\u5b9a\u3057\u305f\u306e\u3067\u3001\u751f\u6210\u3055\u308c\u308b\u5909\u6570\u306e\u540d\u524d\u306f\u3001\u30ea\u30b9\u30c8\u306e\u8981\u7d20\u306e\u5148\u982d\u306b\u2019x_\u2019\u3092\u4ed8\u52a0\u3057\u305f\u2019\uff58_s1'\u306b\u306a\u308a\u307e\u3059\u3002" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u7b2c\u4e8c\u5f15\u6570\u306b\u306f\u3001\u30ea\u30b9\u30c8\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u7b2c\u4e09\u5f15\u6570\u306b\u306f\u3001\u5909\u6570\u306e\u4e0b\u9650\u5024\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u7b2c\u56db\u5f15\u6570\u306b\u306f\u4e0a\u9650\u5024\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u7b2c\u4e94\u5f15\u6570\u306b\u306f\u5909\u6570\u306e\u30bf\u30a4\u30d7\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u3053\u3053\u3067\u306f0-1\u5909\u6570\u3092\u5b9a\u7fa9\u3057\u305f\u3044\u306e\u3067\u3001LpBinary\u3092\n", "\u6307\u5b9a\u3057\u307e\u3059\u3002\u9023\u7d9a\u5909\u6570\u3092\u5b9a\u7fa9\u3057\u305f\u3044\u5834\u5408\u306f\u3001LpContinuous\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u306a\u304a\u3001\"lowBound=\",\"upBound=\",\"cat=\"\u306f\u7701\u7565\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u904b\u642c\u8eca\u3054\u3068\u306b\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u3092\u5b9a\u7fa9\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3053\u3067\u306f\uff0c\u6027\u80fd\u306e\u9055\u30462\u53f0\u306e\u904b\u642c\u8eca'v0'\u3068'v1'\u304c\u4f7f\u7528\u53ef\u80fd\u3068\u3057\u307e\u3059\uff0ev0\u3067\u5b9f\u884c\u53ef\u80fd\u306a\u30eb\u30fc\u30c8\u3092\u8981\u7d20\u3068\u3059\u308b\u30ea\u30b9\u30c8\u3092\uff0cv_feas_rt['v0']=[]\u3068\u5b9a\u7fa9\u3057\u3066\u304a\u304d\u307e\u3059\uff0e\u540c\u69d8\u306b\uff0cv1\u304c\u5b9f\u884c\u53ef\u80fd\u306a\u30eb\u30fc\u30c8\u3092\u8981\u7d20\u3068\u3059\u308b\u30ea\u30b9\u30c8\u3092\uff0cv_feas_rt['v1']=[]\u3068\u5b9a\u7fa9\u3057\u3066\u304a\u304d\u307e\u3059\uff0ev0\u306e\u5b9f\u884c\u53ef\u80fd\u306a\u30eb\u30fc\u30c8\u306fs0,s1,s2\u306e3\u3064\uff0cv1\u306e\u5b9f\u884c\u53ef\u80fd\u306a\u30eb\u30fc\u30c8\u306fs3,s4,s5\u306e3\u3064\u3068\u3057\u307e\u3059.\u3055\u3089\u306b\u51e6\u7406\u3059\u308b\u3079\u304d\u8ca8\u7269\u306fc0\uff0cc1\uff0cc2\uff0cc3\u306e4\u3064\u3068\u3057\u307e\u3059\uff0e\u3053\u308c\u3089\u306e\u8ca8\u7269\u3092\u8981\u7d20\u3068\u3059\u308b\u30ea\u30b9\u30c8cargos\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "cargos=[\"c0\",\"c1\",\"c2\",\"c3\"]; print cargos\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['c0', 'c1', 'c2', 'c3']\n" ] } ], "prompt_number": 91 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8s0\u306b\u304a\u3044\u3066\u51e6\u7406\u3059\u308b\u8ca8\u7269\u306f\uff0cc0\u3068\u3057\u307e\u3059\uff0e\u3053\u306e\u3068\u304d\uff0cv_feas_rt['v0']\u306e\u8981\u7d20\u3068\u3057\u3066\uff0c('v0',('c0'))\u3092\u8ffd\u52a0\u3057\u307e\u3059\uff0e\u3059\u306a\u308f\u3061\uff0c\u6700\u521d\u306e\u8981\u7d20\u306b\u904b\u642c\u8eca\u306e\u540d\u524d\u3092\uff0c2\u756a\u76ee\u306e\u8981\u7d20\u3068\u3057\u3066\u305d\u306e\u30eb\u30fc\u30c8\u3067\u51e6\u7406\u3059\u308b\u8ca8\u7269\u306e\u30bf\u30d7\u30eb\u3092\u6307\u5b9a\u3057\u307e\u3059\uff0e\u540c\u69d8\u306b\uff0c\u30eb\u30fc\u30c8s1\u306b\u304a\u3044\u3066\u51e6\u7406\u3059\u308b\u8ca8\u7269\u306fc0\u3068c1\u3068\u3057\u3066\uff0c\u3053\u306e\u30eb\u30fc\u30c8\u3092v_feas_rt['v0']\u306b\u8ffd\u52a0\u3057\u307e\u3059\uff0e\u3055\u3089\u306b\uff0c\u30eb\u30fc\u30c8s2\u306b\u304a\u3044\u3066\u51e6\u7406\u3059\u308b\u8ca8\u7269\u306fc1\u3068c3\u3068\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "v_feas_rt={}; v_feas_rt['v0']=[]\n", "v_feas_rt['v0']+=[('v0',('c0'))]\n", "v_feas_rt['v0']+=[('v0',('c0','c1'))]\n", "v_feas_rt['v0']+=[('v0',('c1','c3'))]\n", "print v_feas_rt['v0']" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[('v0', 'c0'), ('v0', ('c0', 'c1')), ('v0', ('c1', 'c3'))]\n" ] } ], "prompt_number": 92 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5404\u30eb\u30fc\u30c8\u306e\u30b3\u30b9\u30c8\u3092\u5024\u3068\u3057\u3066\u3082\u3064\u8f9e\u66f8route_cost\u3082\u3042\u308f\u305b\u3066\u5b9a\u7fa9\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "route_cost={}" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 93 }, { "cell_type": "code", "collapsed": false, "input": [ "route_cost[('v0',('c0'))]=100\n", "route_cost[('v0',('c0','c1'))]=200\n", "route_cost[('v0',('c1','c3'))]=300\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 94 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u904b\u642c\u8ecav1\u306e\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u3082\u540c\u69d8\u306bv_feas_rt['v1']\u306b\u8a2d\u5b9a\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "v_feas_rt['v1']=[]\n", "v_feas_rt['v1']+=[('v1',('c3'))]\n", "v_feas_rt['v1']+=[('v1',('c0','c2'))]\n", "v_feas_rt['v1']+=[('v1',('c0','c3'))]\n", "print v_feas_rt['v1']" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[('v1', 'c3'), ('v1', ('c0', 'c2')), ('v1', ('c0', 'c3'))]\n" ] } ], "prompt_number": 95 }, { "cell_type": "code", "collapsed": true, "input": [ "route_cost[('v1',('c3'))]=150\n", "route_cost[('v1',('c0','c2'))]=220\n", "route_cost[('v1',('c0','c3'))]=180\n", "print route_cost" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{('v1', ('c0', 'c3')): 180, ('v1', ('c0', 'c2')): 220, ('v0', ('c0', 'c1')): 200, ('v0', ('c1', 'c3')): 300, ('v0', 'c0'): 100, ('v1', 'c3'): 150}\n" ] } ], "prompt_number": 96 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3046\u3057\u3066\u5b9a\u7fa9\u3057\u305f\u30eb\u30fc\u30c8\u3092\uff0c\u96c6\u5408\u5206\u5272\u554f\u984c\u306e\u5236\u7d04\u884c\u5217\u3068\u3057\u3066\u8868\u308f\u3059\u3068\uff0c\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff0e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| | x[0,0] | x[0,1] | x[0,2] | x[1,0] | x[1,1] | x[1,2] | y[c0] | y[c1] | y[c2] | y[c3] | \n", "|:--: |:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|\n", "|c0| 1 |1 | | | 1|1 | 1| | | |\n", "|c1| |1 | 1| | | | |1 | | |\n", "|c2| | | | | 1| | | |1 | |\n", "|c3| | | 1| 1| |1 | | | |1 | |\n", "\n" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c : \u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u3054\u3068\u306b\u5909\u6570\u3092\u5b9a\u7fa9\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5148\u307b\u3069\u904b\u642c\u8eca\u3054\u3068\u306e\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u3092\u8868\u3059v_feas_rt\u3092\u5b9a\u7fa9\u3057\u307e\u3057\u305f\u304c\uff0c\u3053\u308c\u3089\u306e\u8981\u7d20\u3092\u7dcf\u3066\u3042\u308f\u305b\u305ffeas_rt\u3092\u7528\u610f\u3057\u3066\u304a\u304d\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "vehicles,feas_rt=['v0','v1'],[]\n", "for v in vehicles:\n", " feas_rt+=v_feas_rt[v]\n", "print feas_rt" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[('v0', 'c0'), ('v0', ('c0', 'c1')), ('v0', ('c1', 'c3')), ('v1', 'c3'), ('v1', ('c0', 'c2')), ('v1', ('c0', 'c3'))]\n" ] } ], "prompt_number": 97 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5168\u3066\u306e\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u306f\uff0cfeas_rt\u306e\u8981\u7d20\u3068\u3057\u3066\u5f97\u3089\u308c\u307e\u3059\uff0e\u305d\u3053\u3067\uff0cLpVariable.dicts()\u3092\u7528\u3044\u3066feas_rt\u306e\u5404\u8981\u7d20\u306b\u5bfe\u3057\u3066\u5909\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x=pulp.LpVariable.dicts('x',feas_rt,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "print x" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{('v1', ('c0', 'c3')): x_('v1',_('c0',_'c3')), ('v1', ('c0', 'c2')): x_('v1',_('c0',_'c2')), ('v0', ('c0', 'c1')): x_('v0',_('c0',_'c1')), ('v0', ('c1', 'c3')): x_('v0',_('c1',_'c3')), ('v0', 'c0'): x_('v0',_'c0'), ('v1', 'c3'): x_('v1',_'c3')}\n" ] } ], "prompt_number": 98 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3046\u3057\u3066\uff0c\u5404\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u306b\u5bfe\u3057\u3066\u5909\u6570x\u304c\u5b9a\u7fa9\u3067\u304d\u307e\u3057\u305f\uff0e\u5909\u6570\u3068\u3057\u3066\u306f\uff0cx\u306e\u4ed6\u306by\u3082\u5b9a\u7fa9\u3057\u307e\u3059\uff0ey\u306f\uff0c\u5404\u8ca8\u7269\u306b\u5bfe\u3057\u30661\u3064\u5b9a\u7fa9\u3057\u307e\u3059\u001d", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\uff0e\u3053\u308c\u306f\uff0c\u8ca8\u7269\u304c\u3069\u306e\u30eb\u30fc\u30c8\u3067\u3082\u51e6\u7406\u3055\u308c\u306a\u3044\u3068\u304d\u306b1\u3068\u306a\u308b0-1\u5909\u6570\u3067\u3059\uff0e\u3053\u306e\u5909\u6570\u304c\u3042\u308b\u3053\u3068\u306b\u3088\u308a\uff0c\u96c6\u5408\u5206\u5272\u554f\u984c\u306f\u5e38\u306b\u5b9f\u884c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "y=pulp.LpVariable.dicts('y',cargos,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "print y" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{'c3': y_c3, 'c2': y_c2, 'c1': y_c1, 'c0': y_c0}\n" ] } ], "prompt_number": 99 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3053\u3067\uff0cx\u3068y\u306f\uff0c0\u4ee5\u4e0a1\u4ee5\u4e0b\u306e\u9023\u7d9a\u5909\u6570\u3068\u3057\u3066\u5b9a\u7fa9\u3057\u307e\u3057\u305f\uff0e\u672c\u6765\u306f0-1\u5909\u6570\u3067\u3059\u304c\uff0c\u5217\u751f\u6210\u3067\u306fLP\u7de9\u548c\u554f\u984c\u3068\u3057\u3066\u89e3\u3044\u3066\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u53d6\u308a\u51fa\u3057\u3066\u4f7f\u3046\u306e\u3067\uff0c\u6700\u521d\u304b\u3089\u9023\u7d9a\u5909\u6570\u3068\u3057\u3066\u7de9\u548c\u3057\u3066\u3042\u308a\u307e\u3059\uff0e" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c\uff1a\u5236\u7d04\u5f0f\u306e\u5b9a\u7fa9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u307e\u305a\uff0c\u8ca8\u7269\u3092\u8981\u7d20\u3068\u3059\u308b\u30bf\u30d7\u30eb cargos=('c0','c1','c2','c3')\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u001d", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\uff0e\u5236\u7d04\u5f0f\u306f\u5404\u8ca8\u7269\u306b\u5bfe\u3057\u3066\uff11\u3064\u305a\u3064\u5b9a\u7fa9\u3057\u307e\u3059\uff0e\u305d\u306e\u305f\u3081\u306b\u3053\u306e\u30bf\u30d7\u30eb\u3092\u3064\u304b\u3044\u001f\u307e\u3059\uff0e\u4f8b\u3068\u3057\u3066\uff0c\u8ca8\u7269c0\u306b\u5bfe\u3059\u308b\u5236\u7d04\u5f0f\u3092\u53d6\u308a\u4e0a\u3052\u307e\u3059\uff0ec0\u306b\u5bfe\u3059\u308b\u5236\u7d04\u5f0f\u306f\uff0cc0\u3092\u542b\u3080\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u306b\u5bfe\u3059\u308b\u5909\u6570\u3092\u8db3\u3057\u305f\u3082\u306e\u306b\uff0cy[c0]\u3092\u8db3\u3057\u305f\u3082\u306e\uff08\u7dda\u5f62\u5f0f\uff09\u304c\uff0c1\u306b\u7b49\u3057\u3044\uff0c\u3068\u3044\u3046\u3082\u306e\u3068\u3057\u3066\u5b9a\u7fa9\u3057\u307e\u3059\uff0e\u3053\u3053\u3067\uff0cc0\u3092\u542b\u3080\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u306b\u5bfe\u3059\u308b\u5909\u6570\u306f\uff0c\u6b21\u306e\u547d\u4ee4\u3067\u5f97\u3089\u308c\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "[x[route] for route in feas_rt if 'c0' in route[1] ]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 100, "text": [ "[x_('v0',_'c0'),\n", " x_('v0',_('c0',_'c1')),\n", " x_('v1',_('c0',_'c2')),\n", " x_('v1',_('c0',_'c3'))]" ] } ], "prompt_number": 100 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3089\u306e\u5909\u6570\u306e\u548c\u3092\u5f97\u308b\u306b\u306f\uff0c\u3053\u306e\u30ea\u30b9\u30c8\u3092sum()\u306e\u5f15\u6570\u306b\u4e0e\u3048\u307e\u3059\uff0e\u7d50\u5c40\uff0c\u554f\u984crouting_model\u306b\uff0c\u5404\u8ca8\u7269\u306b\u5bfe\u3059\u308b\u5236\u7d04\u5f0f\u3092\u8ffd\u52a0\u3059\u308b\u306b\u306f\u3064\u304e\u306e\u547d\u4ee4\u3092\u5b9f\u884c\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for c in cargos:\n", " routing_model+=sum([x[route] for route in feas_rt if c in route[1]])+y[c]==1,\"Must_assign_%s\"%c" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 101 }, { "cell_type": "code", "collapsed": true, "input": [ "print routing_model" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "VRP:\n", "MINIMIZE\n", "None\n", "SUBJECT TO\n", "Must_assign_c0: x_('v0',_'c0') + x_('v0',_('c0',_'c1'))\n", " + x_('v1',_('c0',_'c2')) + x_('v1',_('c0',_'c3')) + y_c0 = 1\n", "\n", "Must_assign_c1: x_('v0',_('c0',_'c1')) + x_('v0',_('c1',_'c3')) + y_c1 = 1\n", "\n", "Must_assign_c2: x_('v1',_('c0',_'c2')) + y_c2 = 1\n", "\n", "Must_assign_c3: x_('v0',_('c1',_'c3')) + x_('v1',_'c3')\n", " + x_('v1',_('c0',_'c3')) + y_c3 = 1\n", "\n", "VARIABLES\n", "x_('v0',_'c0') <= 1 Continuous\n", "x_('v0',_('c0',_'c1')) <= 1 Continuous\n", "x_('v0',_('c1',_'c3')) <= 1 Continuous\n", "x_('v1',_'c3') <= 1 Continuous\n", "x_('v1',_('c0',_'c2')) <= 1 Continuous\n", "x_('v1',_('c0',_'c3')) <= 1 Continuous\n", "y_c0 <= 1 Continuous\n", "y_c1 <= 1 Continuous\n", "y_c2 <= 1 Continuous\n", "y_c3 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 102 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3067\uff0c\u5404\u8ca8\u7269\u3092\u51e6\u7406\u3059\u308b\u3068\u3044\u3046\u5236\u7d04\u5f0f\u3092\u5b9a\u7fa9\u3067\u304d\u307e\u3057\u305f\uff0e\u5236\u7d04\u5f0f\u3068\u3057\u3066\u3082\u3046\u4e00\u7a2e\u985e\u306e\u3082\u306e\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff0e\u305d\u308c\u306f\uff0c\u5404\u904b\u642c\u8eca\u304c\u5b9f\u884c\u3059\u308b\u30eb\u30fc\u30c8\u306e\u6570\u306f1\u4ee5\u4e0b\uff0c\u3068\u3044\u3046\u5236\u7d04\u3067\u3059\uff0e\u904b\u642c\u8ecav\u304c\u51e6\u7406\u3059\u308b\u30eb\u30fc\u30c8\u306b\u5bfe\u5fdc\u3059\u308b\u5909\u6570\u306f[x[route] for route in v_feas_rt[v]]\u3068\u3057\u3066\u5f97\u3089\u308c\u308b\u306e\u3067\uff0c\u5404\u8239\u306b\u5bfe\u3057\u3066\u3053\u306e\u5236\u7d04\u5f0f\u3092\u5b9a\u7fa9\u3059\u308b\u306b\u306f\u3064\u304e\u306e\u547d\u4ee4\u3092\u5b9f\u884c\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for v in vehicles:\n", " routing_model += sum( [x[route] for route in v_feas_rt[v]])<=1,\"Vehicle_assign_%s\"%v\n", "print routing_model" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "VRP:\n", "MINIMIZE\n", "None\n", "SUBJECT TO\n", "Must_assign_c0: x_('v0',_'c0') + x_('v0',_('c0',_'c1'))\n", " + x_('v1',_('c0',_'c2')) + x_('v1',_('c0',_'c3')) + y_c0 = 1\n", "\n", "Must_assign_c1: x_('v0',_('c0',_'c1')) + x_('v0',_('c1',_'c3')) + y_c1 = 1\n", "\n", "Must_assign_c2: x_('v1',_('c0',_'c2')) + y_c2 = 1\n", "\n", "Must_assign_c3: x_('v0',_('c1',_'c3')) + x_('v1',_'c3')\n", " + x_('v1',_('c0',_'c3')) + y_c3 = 1\n", "\n", "Vehicle_assign_v0: x_('v0',_'c0') + x_('v0',_('c0',_'c1'))\n", " + x_('v0',_('c1',_'c3')) <= 1\n", "\n", "Vehicle_assign_v1: x_('v1',_'c3') + x_('v1',_('c0',_'c2'))\n", " + x_('v1',_('c0',_'c3')) <= 1\n", "\n", "VARIABLES\n", "x_('v0',_'c0') <= 1 Continuous\n", "x_('v0',_('c0',_'c1')) <= 1 Continuous\n", "x_('v0',_('c1',_'c3')) <= 1 Continuous\n", "x_('v1',_'c3') <= 1 Continuous\n", "x_('v1',_('c0',_'c2')) <= 1 Continuous\n", "x_('v1',_('c0',_'c3')) <= 1 Continuous\n", "y_c0 <= 1 Continuous\n", "y_c1 <= 1 Continuous\n", "y_c2 <= 1 Continuous\n", "y_c3 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 103 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c\uff1a\u76ee\u7684\u95a2\u6570\u306e\u5b9a\u7fa9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6b21\u306b\uff0c\u76ee\u7684\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff0e\u76ee\u7684\u95a2\u6570\u306f\uff0c\u63a1\u7528\u3059\u308b\u30eb\u30fc\u30c8\u306e\u30b3\u30b9\u30c8\u306e\u548c\u3068\uff0c\u5909\u6570y\u306b\u30da\u30ca\u30eb\u30c6\u30a3\u3092\u793a\u3059\u5927\u304d\u306a\u4fc2\u6570\u3092\u304b\u3051\u305f\u3082\u306e\u306e\u548c\u3068\u3057\u3066\u5b9a\u7fa9\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "routing_model+=sum([route_cost[route]*x[route] for route in feas_rt])+sum([1000*y[c] for c in cargos])\n", "print routing_model" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "VRP:\n", "MINIMIZE\n", "100*x_('v0',_'c0') + 200*x_('v0',_('c0',_'c1')) + 300*x_('v0',_('c1',_'c3')) + 150*x_('v1',_'c3') + 220*x_('v1',_('c0',_'c2')) + 180*x_('v1',_('c0',_'c3')) + 1000*y_c0 + 1000*y_c1 + 1000*y_c2 + 1000*y_c3 + 0\n", "SUBJECT TO\n", "Must_assign_c0: x_('v0',_'c0') + x_('v0',_('c0',_'c1'))\n", " + x_('v1',_('c0',_'c2')) + x_('v1',_('c0',_'c3')) + y_c0 = 1\n", "\n", "Must_assign_c1: x_('v0',_('c0',_'c1')) + x_('v0',_('c1',_'c3')) + y_c1 = 1\n", "\n", "Must_assign_c2: x_('v1',_('c0',_'c2')) + y_c2 = 1\n", "\n", "Must_assign_c3: x_('v0',_('c1',_'c3')) + x_('v1',_'c3')\n", " + x_('v1',_('c0',_'c3')) + y_c3 = 1\n", "\n", "Vehicle_assign_v0: x_('v0',_'c0') + x_('v0',_('c0',_'c1'))\n", " + x_('v0',_('c1',_'c3')) <= 1\n", "\n", "Vehicle_assign_v1: x_('v1',_'c3') + x_('v1',_('c0',_'c2'))\n", " + x_('v1',_('c0',_'c3')) <= 1\n", "\n", "VARIABLES\n", "x_('v0',_'c0') <= 1 Continuous\n", "x_('v0',_('c0',_'c1')) <= 1 Continuous\n", "x_('v0',_('c1',_'c3')) <= 1 Continuous\n", "x_('v1',_'c3') <= 1 Continuous\n", "x_('v1',_('c0',_'c2')) <= 1 Continuous\n", "x_('v1',_('c0',_'c3')) <= 1 Continuous\n", "y_c0 <= 1 Continuous\n", "y_c1 <= 1 Continuous\n", "y_c2 <= 1 Continuous\n", "y_c3 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 104 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c\uff1a\u53cc\u5bfe\u5909\u6570\u3092\u53d6\u308a\u51fa\u3059" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3067\uff0c\u96c6\u5408\u5206\u5272\u554f\u984c\u306e\u7dda\u5f62\u7de9\u548c\u554f\u984c\u304c\u5b9a\u7fa9\u3067\u304d\u307e\u3057\u305f\uff0e\u3055\u3066\uff0c\u5217\u751f\u6210\u6cd5\u3067\u306f\uff0c\u3053\u306e\u7dda\u5f62\u7de9\u548c\u554f\u984c\u3092\u89e3\u3044\u3066\u5f97\u3089\u308c\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u7528\u3044\u3066\uff0c\u52b9\u7387\u7684\u306a\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u3092\u65b0\u305f\u306b\u751f\u6210\u30fb\u8ffd\u52a0\u3057\u3066\u3044\u304d\u307e\u3059\uff0e\u53cc\u5bfe\u5909\u6570\u306f\u5236\u7d04\u5f0f\u6bce\u306b\u5f97\u3089\u308c\u307e\u3059\uff0e\u8ca8\u7269\u306e\u5272\u5f53\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u8f9e\u66f8dual_cargo\u306b\uff0c\u904b\u642c\u8eca\u306e\u4f7f\u7528\u56de\u6570\u306e\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u8f9e\u66f8dual_ship\u306b\u4fdd\u5b58\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "dual_cargo,dual_vehicle={},{}" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 105 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u307e\u305a\uff0c\u5b9a\u7fa9\u3057\u305f\u7dda\u5f62\u7de9\u548c\u554f\u984c\u3092\u89e3\u304d\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "status = routing_model.solve()\n", "print pulp.LpStatus[status]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n" ] } ], "prompt_number": 106 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3066\uff0crouting_model\u3092\u5b9a\u7fa9\u3059\u308b\u3068\u304d\uff0c\u5236\u7d04\u5f0f\u306b\u540d\u524d\u3092\u4ed8\u3051\u307e\u3057\u305f\uff0e\u3053\u306e\u540d\u524d\u3092\u7528\u3044\u3066\uff0c\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u53d6\u5f97\u3057\u307e\u3059\uff0e\u8ca8\u7269\u306e\u5272\u5f53\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u306f" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for c in cargos:\n", " dual_cargo[c]=routing_model.constraints[\"Must_assign_%s\"%c].pi" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 107 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u904b\u642c\u8eca\u306e\u4f7f\u7528\u56de\u6570\u306e\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u306f" ] }, { "cell_type": "code", "collapsed": true, "input": [ "for v in vehicles:\n", " dual_vehicle[v]=routing_model.constraints[\"Vehicle_assign_%s\"%v].pi" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 108 }, { "cell_type": "code", "collapsed": false, "input": [ "print dual_cargo,dual_vehicle" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{'c3': 150.0, 'c2': 1000.0, 'c1': 150.0, 'c0': 0.0} {'v0': 0.0, 'v1': 0.0}\n" ] } ], "prompt_number": 109 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c\uff1a\u5217\u3092\u751f\u6210\u3059\u308b" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "networkx\u3067\u90e8\u5206\u554f\u984c\u3092\u5b9a\u7fa9\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e0a\u306e\u4f8b\u3067\u306f\uff0c\u5404\u904b\u642c\u8eca\u306e\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u304c\u65e2\u77e5\u3067\u3042\u308b\u3068\u3057\u3066\u3044\u307e\u3057\u305f\uff0e\u3057\u304b\u3057\uff0c\u5b9f\u969b\u306b\u306f\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u306f\u3059\u3079\u3066\u306f\u308f\u304b\u3089\u306a\u3044\u3068\u304d\u3082\u3042\u308a\u307e\u3059\uff0e\u3053\u306e\u3088\u3046\u306a\u3068\u304d\u306f\uff0c\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u304cs-t\u30d1\u30b9\u3068\u3057\u3066\u8868\u308f\u3055\u308c\u308b\u3088\u3046\u306a\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u5b9a\u7fa9\u3057\u3066\uff0c\u305d\u306e\u4e0a\u306e\u30d1\u30b9\u3068\u3057\u3066\u6c42\u3081\u308b\u306e\u304c\u4fbf\u5229\u3067\u3059\uff0e\u3053\u3053\u3067\u306f\uff0c\u30ce\u30fc\u30c9\u96c6\u5408{s,c0,c1,c2,c3,t}\uff0c\u30a2\u30fc\u30af\u96c6\u5408{(s,c0),(s,c1),(c0,c1),(c0,c2),(c0,c3),(c1,c3),(c2,t),(c3,c2),(c3,t)}\u304b\u3089\u5b9a\u7fa9\u3055\u308c\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u7528\u3044\u307e\u3059\uff0e\u5404\u30a2\u30fc\u30af\u306b\u306f\u9069\u5f53\u306b\u30b3\u30b9\u30c8\u3092\u5b9a\u7fa9\u3057\u3066\u304a\u304d\u307e\u3059\u3002\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import networkx as nx\n", "G={}\n", "G['v0']=nx.DiGraph()\n", "G['v0'].add_weighted_edges_from([('s','c0',100),('s','c1',50),('c0','c1',20),('c0','c2',40),('c0','c3',30),('c1','c3',35),('c2','t',70),('c3','c2',15),('c3','t',45)])\n", "G['v1']=nx.DiGraph()\n", "G['v1'].add_weighted_edges_from([('s','c0',150),('s','c1',10),('c0','c2',40),('c0','c3',30),('c1','c3',35),('c2','t',70),('c3','t',45)])\n", "\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 110 }, { "cell_type": "code", "collapsed": false, "input": [ "import networkx as nx\n", "pos=nx.shell_layout(G['v0']);\n", "nx.draw_shell(G['v0'],node_size=1000,node_color='w');\n", "nx.draw_networkx_edge_labels(G['v0'],pos);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 111 }, { "cell_type": "code", "collapsed": false, "input": [ "import networkx as nx\n", "pos=nx.shell_layout(G['v1']);\n", "nx.draw_shell(G['v1'],node_size=1000,node_color='w');\n", "nx.draw_networkx_edge_labels(G['v1'],pos);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nZs1CcnIyNm/eDE1NTfTt2xfm5uYqNZY3K7/y1D8l3b17F+Hh4RCJRNDS0kLNmjXLfavic6t/yoNb\nvnLQpk0bTJ8+vUzrqqmp4dixY5gyZQrMzc0hEAjg5eWFV69e4dmzZ/Dx8YGPjw+AN4/b3Lhx44P7\nu3r1KoyNjavtpZ9BgwbJ/i2RSJCQkICvvvpKgREpnkAgkP3elpaWyMrKwsSJE6Gnp4c5c+agdevW\n2Lp1Ky5evAgLCwu4uLgoOmRWhcpT/5QkEonw008/4d9//4WmpiY6d+6MrVu3lmsfQqEQTk5O5S77\nc8DDS8oBEcHExAQRERFo3ry5XMvu2LEjoqKiYG5ujnHjxmHcuHGwsLCQawxV6fz587J/a2howMLC\nAg0bNlRgRMonPT0d69evx4QJE9CoUSP88MMP2L17N+Li4hASEoK0tDQsWLAAS5cuRZ06dTBlyhRF\nh8wqkSLrn379+sHHx+ezPyF+J4WMq/UZmjNnDk2fPl2uZSYlJVHNmjUJgOxPIBBQ79696c8//6T8\n/Hy5xiMvs2fPVnQISqN4WFGRSERERF9//TW1atWKnjx5IltHKpXS3Llzyc7OjhITExUSJ6saDx48\noDVr1lCrVq1o8uTJci07KSmJjIyMqm09U1GcfOXk/v37ZGhoSK9fv5ZbmZMnTyZNTc1Sybfkn76+\nPn3//fcUGxsrt5gq2+zZs0lfX590dHRkf+rq6qSjo0PLli1TdHhKJT09nbp3707p6elERKUqxeXL\nl8uOTR4DWrXl5+fTn3/+Sb1796bhw4dTQUEBJSYmyr3++eGHH2jWrFlyK0/VcPKVIw8PD5o/f75c\nyrp37x7p6+vT4MGDqVatWu9NwMV/Dg4O5OfnR1lZWXKJr7K0aNHirWRRPOkCe9vixYvpq6++kn1n\n75pwQywWyzssVgliY2Pp+++/J0NDQ+rduzeFhoaWmoBD3vUPT6rwYZx85SgtLY3q1asnm2Wmqkgk\nEurRowf9+uuvRET08uVL2rx5M7Vt2/ajSVhLS4s8PT0pNDRUJWZC8vb2LtOyz13J3/J9Vzr8/Pxk\nrWKmGrKyssjPz48cHBzI3NycFi5cSPfv33/nuoqqf9i7cfKVs507d5KNjQ3l5ORUWRm//fYbtW/f\n/p0tmPj4eJo2bRoZGhp+NBFbWFjQokWL6MGDB1UWK5Of/55M/feKgb+/f6l7we/ahimeRCKh0NBQ\n8vT0JD09PfL09KQzZ86U6bdSdP3D/oeTr5xJpVIaP348OTs7U25ubqXvf9euXdSwYUNKTk7+4HoF\nBQV04MABcnFxIYFA8MEkLBAIqE+fPrRv3z6V6DzRrl07srS0JEtLS0WHopI44SqnBw8e0KJFi8jC\nwoLs7e3Jz8+Pnj9/XqZtpVKp7E8Z6h/GyVchxGIxjR49mjp37kxPnz6tlH1KpVLasGEDffHFF3Tz\n5s1ybZuSkkJLly6lxo0bf7Q1rK+vT5MnT6a4uLhKiZsphlQqJYlEQgMHDqTIyMgPrhscHEzLly+X\nU2SspPz8fNq3bx/16dOHDAwM6LvvvitXB8mwsDCKjo6WvZZIJEpX/3yuOPkqiEQioXnz5lH9+vUp\nODi4QvtKSUkhFxcXcnBwoKSkpArF9M8//5C3t/dbjyi968/R0ZF+//13leukxf4nJSXlnctLtn6f\nP39O3bt3p7Vr18orrM9eXFwcTZ48mQwNDalXr160d+9eysvLK9c+du/eTS1btiQjIyNauHBhqfeU\nsf753HDyVbCoqCiytramAQMGUFhYWKneiR+TlpZGixcvJiMjI/rll1+osLCw0uJ68eIF+fv7U5s2\nbcrUSWvEiBF09uxZuV+y/G/PZu7pXD7Fv9f77s8VV6aZmZnUunVrunr1qtxi+9xkZWXR77//To6O\njmRmZkYLFix4b+epj5FKpRQfH09Eb367Nm3a0IQJE+j+/fu0cOFC+vfff4lIeeufzwEnXyWQn59P\nGzdupFatWpG1tTX98ssvdPLkScrIyCi1nkgkIqFQSFu3biUPDw+qW7cuTZw4kRISEqo0vuvXr9PU\nqVPL1EnL0tKSFi9eTA8fPqzSmFjVS09PJ2dnZzp79ixFR0fT6NGj+XetZBKJhM6ePUsjRowgPT09\n+uqrr+j06dOV3lkpNzeXhgwZQt7e3tS8efNS7yl7/VNd8fCSSoSIcOHCBRw/fhxCoRBCoRACgQA1\na9aEWCxGbm4urKys4OTkhE6dOsHT0xN16tSRW3wikQhHjx5FYGAgTp8+/c55dIsJBAL06dMHvr6+\ncHd3h5aWltziZJ8uNDQULVq0gKmpKQBg//79mD59OlxdXVG3bl38+OOPMDY2VnCUqi8lJQVBQUHY\nvn079PT04OvrCy8vLxgaGlZovxkZGTh69CiMjIxga2uLJk2alHo/ISEB3333HYKCgmBhYVFqzHdl\n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\n", "text": [ "" ] } ], "prompt_number": 112 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u306e\u304f\u3089\u3044\u306e\u898f\u6a21\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3060\u3068\uff0c\u3059\u3079\u3066\u306es-t\u30d1\u30b9\u3092\u5217\u6319\u3057\u3066\u3082\u305f\u3044\u3057\u305f\u6570\u306b\u306f\u306a\u308a\u307e\u305b\u3093\uff0e\u3057\u304b\u3057\uff0c\u5b9f\u52d9\u898f\u6a21\u306e\u554f\u984c\u4f8b\u3060\u3068\uff0cs-t\u30d1\u30b9\u306e\u6570\u306f\u6570\u5341\u4e07\u4ee5\u4e0a\u306b\u306a\u308b\u3053\u3068\u306f\u666e\u901a\u306b\u3042\u308a\u307e\u3059\uff0e\u3057\u305f\u304c\u3063\u3066\uff0c\u3059\u3079\u3066\u306e\u30d1\u30b9\u3092\u5217\u6319\u3059\u308b\u3053\u3068\u306f\u907f\u3051\u305f\u307b\u3046\u304c\u3088\u3044\u3067\u3059\uff0e\u305d\u3053\u3067\uff0c\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u306e\u90e8\u5206\u96c6\u5408\u3067\u5b9a\u7fa9\u3057\u305f\u96c6\u5408\u5206\u5272\u554f\u984c\u306e\u7dda\u5f62\u7de9\u548c\u554f\u984c\u306e\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u7528\u3044\u3066\uff0c\u53cd\u5fa9\u7684\u306b\u30eb\u30fc\u30c8\uff08s-t\u30d1\u30b9\uff09\u3092\u751f\u6210\u3059\u308b\u65b9\u6cd5\u304c\u6709\u52b9\u3067\u3059\uff0e" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u5217\u304c\u7a7a\u306e\u96c6\u5408\u5206\u5272\u554f\u984c\uff08\u7dda\u5f62\u7de9\u548c\u554f\u984c\uff09\u001c", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\u3092\u5b9a\u7fa9\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u307e\u305a\uff0c\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u304c\u7a7a\u306e\u72b6\u614b\u3067\uff0c\u96c6\u5408\u5206\u5272\u554f\u984c\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pulp\n", "cargos=[\"c0\",\"c1\",\"c2\",\"c3\"]\n", "vehicles,feas_rt=['v0','v1'],[]\n", "v_feas_rt={}\n", "v_feas_rt['v0'],v_feas_rt['v1']=[],[]\n", "for v in vehicles:\n", "\tfeas_rt+=v_feas_rt[v]\n", "\n", "master_p=pulp.LpProblem(\"MasterProblem\",pulp.LpMinimize)\n", "x=pulp.LpVariable.dicts('x',feas_rt,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "y=pulp.LpVariable.dicts('y',cargos,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "for c in cargos:\n", " master_p+=sum([x[route] for route in feas_rt if c in route[1]])+y[c]==1,\"Must_assign_%s\"%c\n", "#for v in vehicles:\n", "# master_p += sum( [x[route] for route in v_feas_rt[v]])<=1,\"Vehicle_assign_%s\"%v\n", "master_p+=sum([route_cost[route]*x[route] for route in feas_rt])+sum([1000*y[c] for c in cargos])\n", "print master_p\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "MasterProblem:\n", "MINIMIZE\n", "1000*y_c0 + 1000*y_c1 + 1000*y_c2 + 1000*y_c3 + 0.0\n", "SUBJECT TO\n", "Must_assign_c0: y_c0 = 1\n", "\n", "Must_assign_c1: y_c1 = 1\n", "\n", "Must_assign_c2: y_c2 = 1\n", "\n", "Must_assign_c3: y_c3 = 1\n", "\n", "VARIABLES\n", "y_c0 <= 1 Continuous\n", "y_c1 <= 1 Continuous\n", "y_c2 <= 1 Continuous\n", "y_c3 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 113 }, { "cell_type": "code", "collapsed": false, "input": [ "status=master_p.solve()\n", "print pulp.LpStatus[status]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n" ] } ], "prompt_number": 114 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u53d6\u308a\u51fa\u3057\uff0c\u90e8\u5206\u554f\u984c\u306e\u30b3\u30b9\u30c8\u306b\u53cd\u6620\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u6b21\u306b\uff0c\u5404\u8ca8\u7269\u306e\u5272\u308a\u5f53\u3066\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u53d6\u308a\u51fa\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "dual_cargo={}\n", "for c in cargos:\n", "\tdual_cargo[c]=master_p.constraints[\"Must_assign_%s\"%c].pi\n", "print dual_cargo\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "{'c3': 1000.0, 'c2': 1000.0, 'c1': 1000.0, 'c0': 1000.0}\n" ] } ], "prompt_number": 115 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3089\u306e\u5024\u3092\u4f7f\u3063\u3066\uff0c\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u5404\u30a2\u30fc\u30af\u306e\u30b3\u30b9\u30c8\u3092\u5b9a\u7fa9\u3057\u76f4\u3057\u307e\u3059\uff0e\u5177\u4f53\u7684\u306b\u306f\uff0c\u30a2\u30fc\u30af(i,j)\u306e\u59cb\u70b9i\u304c\u8ca8\u7269\u3092\u8868\u308f\u3059\uff08=\u59cb\u70b9s\u3067\u306a\u3044\uff09\u3068\u304d\u306b\u306f\uff0c\u30b3\u30b9\u30c8\u3092\uff0c[\u30a2\u30fc\u30af\u306e(i,j)\u306e\u91cd\u307f]-dual_cargo[i]\u306b\u66f4\u65b0\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5b9f\u969b\u306e\u914d\u9001\u8a08\u753b\u554f\u984c\u3067\u306f\uff0c\u3053\u3046\u3057\u3066\u30a2\u30fc\u30af\u306e\u30b3\u30b9\u30c8\u3092\u5b9a\u7fa9\u3057\u76f4\u3057\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u3067\uff08\u8ca0\u306e\u30b3\u30b9\u30c8\u3092\u6301\u3064\uff09\u6700\u77ed\u8def\u554f\u984c\u3092\u89e3\u304f\u3053\u3068\u306b\u3088\u3063\u3066\uff0c\u96c6\u5408\u5206\u5272\u554f\u984c\u306b\u8ffd\u52a0\u3059\u308b\u3079\u304d\u5b9f\u884c\u30eb\u30fc\u30c8\u3092\u751f\u6210\u3057\u307e\u3059\uff0e\u3053\u3053\u3067\u306f\u7c21\u5358\u306e\u305f\u3081\uff0c\u6700\u77ed\u8def\u554f\u984c\u3092\u89e3\u304f\u3053\u3068\u306f\u305b\u305a\uff0c\u5168\u5217\u6319\u3057\u305fs-t\u30d0\u30b9\u306e\u4e2d\u304b\u3089\u6700\u3082\u8cbb\u7528\u304c\u3061\u3044\u3055\u304f\u306a\u308b\u3082\u306e\u3092\u9078\u3076\u3053\u3068\u306b\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u5148\u307b\u3069\u5b9a\u7fa9\u3057\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u3067\u306es-t\u30d1\u30b9\u3092\u5217\u6319\u3059\u308b\u306b\u306f\uff0cnetworkx\u306eall_simple_paths()\u3068\u3044\u3046\u547d\u4ee4\u3092\u4f7f\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3066\uff0call_simple_paths(G['v0']\uff09\u3067\u5f97\u3089\u308c\u308b\u5404s-t\u30d1\u30b9\u306b\u5bfe\u3057\u3066\uff0c\u542b\u307e\u308c\u308b\u30a2\u30fc\u30af\u306e\u30b3\u30b9\u30c8\u306e\u548c\u3092\u6c42\u3081\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"s-t paths for v0\"\n", "for path in nx.all_simple_paths(G['v0'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v0'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "\t" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "s-t paths for v0\n", "['s', 'c1', 'c3', 'c2', 't'] -2830.0\n", "['s', 'c1', 'c3', 't'] -1870.0\n", "['s', 'c0', 'c3', 'c2', 't'] -2785.0\n", "['s', 'c0', 'c3', 't'] -1825.0\n", "['s', 'c0', 'c2', 't'] -1790.0\n", "['s', 'c0', 'c1', 'c3', 'c2', 't'] -3760.0\n", "['s', 'c0', 'c1', 'c3', 't'] -2800.0\n" ] } ], "prompt_number": 116 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3089\u304b\u3089\uff0c\u6700\u3082\u30b3\u30b9\u30c8\u306e\u3061\u3044\u3055\u3044s-t\u30d1\u30b9\u306f\uff0c['s', 'c0', 'c1', 'c3', 'c2', 't'] \u3067\u3042\u308b\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3059\uff0e\u540c\u69d8\u306b\uff0c\u904b\u642c\u8ecav1\u306b\u5bfe\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u306es-t\u30d1\u30b9\u306e\u30b3\u30b9\u30c8\u3092\u6c42\u3081\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for path in nx.all_simple_paths(G['v1'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v0'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "\t" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['s', 'c1', 'c3', 't'] -1870.0\n", "['s', 'c0', 'c3', 't'] -1825.0\n", "['s', 'c0', 'c2', 't'] -1790.0\n" ] } ], "prompt_number": 117 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u306e\u3046\u3061\u6700\u3082\u30b3\u30b9\u30c8\u306e\u5c0f\u3055\u3044s-t\u30d1\u30b9\u306f\uff0c['s', 'c1', 'c3', 't'] \u3067\u3042\u308b\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3059\uff0e" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "s-t\u30d1\u30b9\u3092\u96c6\u5408\u5206\u5272\u554f\u984c\u306e\u5217\u306b\u8ffd\u52a0\u3059\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3068\u3044\u3046\u3053\u3068\u3067\uff0cv0\u306b\u5bfe\u3059\u308b\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u3068\u3057\u3066\uff0c['s', 'c0', 'c1', 'c3', 'c2', 't']\u3092\uff0cv1\u306b\u5bfe\u3059\u308b\u5b9f\u884c\u53ef\u80fd\u30eb\u30fc\u30c8\u3068\u3057\u3066\uff0c['s', 'c1', 'c3', 't']\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\uff0e\u5177\u4f53\u7684\u306b\u306f\uff0cv_feas_rt['v0']\uff0cv_feas_rt['v1']\u306b\uff0c\u305d\u306e\u30eb\u30fc\u30c8\u3067\u51e6\u7406\u3055\u308c\u308b\u8ca8\u7269\u3092\u8981\u7d20\u3068\u3059\u308b\u8981\u7d20\u3092\u52a0\u3048\u307e\u3059\uff0e\u540c\u6642\u306b\uff0croute_cost\u306b\u3082\u30b3\u30b9\u30c8\u3092\u8868\u308f\u3059\u8981\u7d20\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304c\uff0c\u3053\u306e\u30b3\u30b9\u30c8\u3068\u3057\u3066\u306f\uff0c\u53cc\u5bfe\u5909\u6570\u306e\u5024\u3092\u53d6\u308a\u9664\u3044\u305f\u6b63\u5473\u306e\u30a2\u30fc\u30af\u306e\u30b3\u30b9\u30c8\u306e\u548c\u3092\u6307\u5b9a\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": true, "input": [ "route_cost={}\n", "v_feas_rt['v0']+=[('v0',('c0','c1','c2','c3'))]\n", "v_feas_rt['v1']+=[('v1',('c1','c3'))]\n", "route_cost[('v0',('c0','c1','c2','c3'))]=240\n", "route_cost[('v1',('c1','c3'))]=90" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 118 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3067\uff0c\u4e00\u5ea6\u306e\u53cd\u5fa9\u304c\u7d42\u4e86\u3067\u3059\uff0e\u6b21\u306b\uff0c\u4e8c\u756a\u306e\u53cd\u5fa9\u3092\u958b\u59cb\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c\u306e\u7dda\u5f62\u7de9\u548c\u3092\u518d\u5ea6\u89e3\u304f" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pulp\n", "cargos=[\"c0\",\"c1\",\"c2\",\"c3\"]\n", "for v in vehicles:\n", "\tfeas_rt+=v_feas_rt[v]\n", "master_p=pulp.LpProblem(\"MasterProblem\",pulp.LpMinimize)\n", "x=pulp.LpVariable.dicts('x',feas_rt,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "y=pulp.LpVariable.dicts('y',cargos,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "for c in cargos:\n", " master_p+=sum([x[route] for route in feas_rt if c in route[1]])+y[c]==1,\"Must_assign_%s\"%c\n", "for v in vehicles:\n", " master_p += sum( [x[route] for route in v_feas_rt[v]])<=1,\"Vehicle_assign_%s\"%v\n", "master_p+=sum([route_cost[route]*x[route] for route in feas_rt])+sum([1000*y[c] for c in cargos])\n", "print master_p\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "MasterProblem:\n", "MINIMIZE\n", "240*x_('v0',_('c0',_'c1',_'c2',_'c3')) + 90*x_('v1',_('c1',_'c3')) + 1000*y_c0 + 1000*y_c1 + 1000*y_c2 + 1000*y_c3 + 0\n", "SUBJECT TO\n", "Must_assign_c0: x_('v0',_('c0',_'c1',_'c2',_'c3')) + y_c0 = 1\n", "\n", "Must_assign_c1: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v1',_('c1',_'c3'))\n", " + y_c1 = 1\n", "\n", "Must_assign_c2: x_('v0',_('c0',_'c1',_'c2',_'c3')) + y_c2 = 1\n", "\n", "Must_assign_c3: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v1',_('c1',_'c3'))\n", " + y_c3 = 1\n", "\n", "Vehicle_assign_v0: x_('v0',_('c0',_'c1',_'c2',_'c3')) <= 1\n", "\n", "Vehicle_assign_v1: x_('v1',_('c1',_'c3')) <= 1\n", "\n", "VARIABLES\n", "x_('v0',_('c0',_'c1',_'c2',_'c3')) <= 1 Continuous\n", "x_('v1',_('c1',_'c3')) <= 1 Continuous\n", "y_c0 <= 1 Continuous\n", "y_c1 <= 1 Continuous\n", "y_c2 <= 1 Continuous\n", "y_c3 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 119 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3067\u65b0\u3057\u3044\u96c6\u5408\u5206\u5272\u554f\u984c\uff08\u306e\u7dda\u5f62\u7de9\u548c\u554f\u984c\uff09\u304c\u5b9a\u7fa9\u3055\u308c\u307e\u3057\u305f\uff0e\u3053\u308c\u3092\u89e3\u304d\u307e\u3059\uff0e\u4eca\u5ea6\u306f\uff0c\u8239\u8236\u306e\u4f7f\u7528\u56de\u6570\u306b\u95a2\u3059\u308b\u5236\u7d04\u5f0f\u304c\u7a7a\u3067\u306f\u306a\u3044\u306e\u3067\uff0c\u3053\u308c\u3089\u306e\u5236\u7d04\u5f0f\u306b\u5bfe\u3059\u308b\u53cc\u5bfe\u5909\u6570\u3082\u53d6\u308a\u51fa\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "status=master_p.solve()\n", "print pulp.LpStatus[status]\n", "dual_cargo,dual_vehicle={},{}\n", "for c in cargos:\n", "\tdual_cargo[c]=master_p.constraints[\"Must_assign_%s\"%c].pi\n", "for v in vehicles:\n", " dual_vehicle[v]=master_p.constraints[\"Vehicle_assign_%s\"%v].pi\n", "print dual_cargo,dual_vehicle" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n", "{'c3': 0.0, 'c2': 1000.0, 'c1': 90.0, 'c0': 1000.0} {'v0': 0.0, 'v1': 0.0}\n" ] } ], "prompt_number": 120 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u6700\u3082\u52b9\u7387\u306e\u826f\u3044s-t\u30d1\u30b9\u3092\u307f\u3064\u3051\u308b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3089\u306e\u5024\u3092\u30a2\u30fc\u30af\u306e\u30b3\u30b9\u30c8\u306b\u53cd\u6620\u3057\u305f\u72b6\u614b\u3067\uff0c\u6700\u3082\u30b3\u30b9\u30c8\u306e\u5c0f\u3055\u3044s-t\u30d1\u30b9\u3092\u6c42\u3081\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"s-t paths for v0\"\n", "for path in nx.all_simple_paths(G['v0'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v0'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "print \"s-t paths for v1\"\n", "for path in nx.all_simple_paths(G['v1'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v1'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "\n", "\t" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "s-t paths for v0\n", "['s', 'c1', 'c3', 'c2', 't'] -920.0\n", "['s', 'c1', 'c3', 't'] 40.0\n", "['s', 'c0', 'c3', 'c2', 't'] -1785.0\n", "['s', 'c0', 'c3', 't'] -825.0\n", "['s', 'c0', 'c2', 't'] -1790.0\n", "['s', 'c0', 'c1', 'c3', 'c2', 't'] -1850.0\n", "['s', 'c0', 'c1', 'c3', 't'] -890.0\n", "s-t paths for v1\n", "['s', 'c1', 'c3', 't'] 0.0\n", "['s', 'c0', 'c3', 't'] -775.0\n", "['s', 'c0', 'c2', 't'] -1740.0\n" ] } ], "prompt_number": 121 }, { "cell_type": "markdown", "metadata": {}, "source": [ "v0\u306b\u5bfe\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u3067\u6700\u5c0f\u306e\u30b3\u30b9\u30c8\u3092\u3082\u3064s-t\u30d1\u30b9\u306f\uff0c['s', 'c0', 'c1', 'c3', 'c2', 't']\uff0cv1\u306b\u5bfe\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u3067\u306f['s', 'c0', 'c2', 't']\u3067\u3042\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3057\u305f\uff0ev0\u306b\u5bfe\u3059\u308b\u6700\u5c0f\u30b3\u30b9\u30c8\u306es-t\u30d1\u30b9\u306f\u5148\u307b\u3069\u8ffd\u52a0\u3057\u305f\u306e\u3068\u540c\u3058\u3067\u3059\u306e\u3067\uff0c\u4eca\u56de\u306f\uff0cv1\u306b\u5bfe\u3059\u308b\u30eb\u30fc\u30c8['s', 'c0', 'c2', 't']\u306e\u307f\u8ffd\u52a0\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "v_feas_rt['v1']+=[('v1',('c0','c2'))]\n", "route_cost[('v1',('c0','c2'))]=260" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 122 }, { "cell_type": "code", "collapsed": false, "input": [ "import pulp\n", "feas_rt=[]\n", "for v in vehicles:\n", "\tfeas_rt+=v_feas_rt[v]\n", "print feas_rt\n", "master_p=pulp.LpProblem(\"MasterProblem\",pulp.LpMinimize)\n", "x=pulp.LpVariable.dicts('x',feas_rt,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "y=pulp.LpVariable.dicts('y',cargos,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "for c in cargos:\n", " master_p+=sum([x[route] for route in feas_rt if c in route[1]])+y[c]==1,\"Must_assign_%s\"%c\n", "for v in vehicles:\n", " master_p+= sum( [x[route] for route in v_feas_rt[v]])<=1,\"Vehicle_assign_%s\"%v\n", "master_p+=sum([route_cost[route]*x[route] for route in feas_rt])+sum([1000*y[c] for c in cargos])\n", "print master_p" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[('v0', ('c0', 'c1', 'c2', 'c3')), ('v1', ('c1', 'c3')), ('v1', ('c0', 'c2'))]\n", "MasterProblem:\n", "MINIMIZE\n", "240*x_('v0',_('c0',_'c1',_'c2',_'c3')) + 260*x_('v1',_('c0',_'c2')) + 90*x_('v1',_('c1',_'c3')) + 1000*y_c0 + 1000*y_c1 + 1000*y_c2 + 1000*y_c3 + 0\n", "SUBJECT TO\n", "Must_assign_c0: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v1',_('c0',_'c2'))\n", " + y_c0 = 1\n", "\n", "Must_assign_c1: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v1',_('c1',_'c3'))\n", " + y_c1 = 1\n", "\n", "Must_assign_c2: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v1',_('c0',_'c2'))\n", " + y_c2 = 1\n", "\n", "Must_assign_c3: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v1',_('c1',_'c3'))\n", " + y_c3 = 1\n", "\n", "Vehicle_assign_v0: x_('v0',_('c0',_'c1',_'c2',_'c3')) <= 1\n", "\n", "Vehicle_assign_v1: x_('v1',_('c0',_'c2')) + x_('v1',_('c1',_'c3')) <= 1\n", "\n", "VARIABLES\n", "x_('v0',_('c0',_'c1',_'c2',_'c3')) <= 1 Continuous\n", "x_('v1',_('c0',_'c2')) <= 1 Continuous\n", "x_('v1',_('c1',_'c3')) <= 1 Continuous\n", "y_c0 <= 1 Continuous\n", "y_c1 <= 1 Continuous\n", "y_c2 <= 1 Continuous\n", "y_c3 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 123 }, { "cell_type": "code", "collapsed": false, "input": [ "status=master_p.solve()\n", "print pulp.LpStatus[status]\n", "dual_cargo,dual_vehicle={},{}\n", "for c in cargos:\n", "\tdual_cargo[c]=master_p.constraints[\"Must_assign_%s\"%c].pi\n", "for v in vehicles:\n", " dual_vehicle[v]=master_p.constraints[\"Vehicle_assign_%s\"%v].pi\n", "print dual_cargo,dual_vehicle" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n", "{'c3': 0.0, 'c2': 240.0, 'c1': 0.0, 'c0': 0.0} {'v0': 0.0, 'v1': 0.0}\n" ] } ], "prompt_number": 124 }, { "cell_type": "code", "collapsed": false, "input": [ "print \"s-t paths for v0\"\n", "for path in nx.all_simple_paths(G['v0'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v0'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "print \"s-t paths for v1\"\n", "for path in nx.all_simple_paths(G['v1'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v1'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "\n", "\t" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "s-t paths for v0\n", "['s', 'c1', 'c3', 'c2', 't'] -70.0\n", "['s', 'c1', 'c3', 't'] 130.0\n", "['s', 'c0', 'c3', 'c2', 't'] -25.0\n", "['s', 'c0', 'c3', 't'] 175.0\n", "['s', 'c0', 'c2', 't'] -30.0\n", "['s', 'c0', 'c1', 'c3', 'c2', 't'] 0.0\n", "['s', 'c0', 'c1', 'c3', 't'] 200.0\n", "s-t paths for v1\n", "['s', 'c1', 'c3', 't'] 90.0\n", "['s', 'c0', 'c3', 't'] 225.0\n", "['s', 'c0', 'c2', 't'] 20.0\n" ] } ], "prompt_number": 125 }, { "cell_type": "markdown", "metadata": {}, "source": [ "v0\u306b\u5bfe\u3059\u308b\u6700\u5c0f\u30b3\u30b9\u30c8\u306es-t\u3000\u30d1\u30b9\u306f\uff0c['s', 'c1', 'c3', 'c2', 't'] ,v1\u306b\u5bfe\u3059\u308bs-t\u30d1\u30b9\u306f['s', 'c0', 'c2', 't'] \u3067\u3059\u304c\uff0cv1\u306b\u5bfe\u3059\u308b\u3000\u30d1\u30b9\u306f\u30b3\u30b9\u30c8\u304c\u6b63\u306a\u306e\u3067\uff0c\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u306f\u3042\u308a\u307e\u305b\u3093\uff0ev0\u306b\u5bfe\u3059\u308bs-t\u30d1\u30b9\u306e\u307f\u8ffd\u52a0\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002" ] }, { "cell_type": "code", "collapsed": false, "input": [ "v_feas_rt['v0']+=[('v0',('c1','c2','c3'))]\n", "route_cost[('v0',('c1','c2','c3'))]=170" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 126 }, { "cell_type": "code", "collapsed": false, "input": [ "import pulp\n", "feas_rt=[]\n", "for v in vehicles:\n", "\tfeas_rt+=v_feas_rt[v]\n", "master_p=pulp.LpProblem(\"MasterProblem\",pulp.LpMinimize)\n", "x=pulp.LpVariable.dicts('x',feas_rt,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "y=pulp.LpVariable.dicts('y',cargos,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "for c in cargos:\n", " master_p+=sum([x[route] for route in feas_rt if c in route[1]])+y[c]==1,\"Must_assign_%s\"%c\n", "for v in vehicles:\n", " master_p+= sum( [x[route] for route in v_feas_rt[v]])<=1,\"Vehicle_assign_%s\"%v\n", "master_p+=sum([route_cost[route]*x[route] for route in feas_rt])+sum([1000*y[c] for c in cargos])\n", "print master_p" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "MasterProblem:\n", "MINIMIZE\n", "240*x_('v0',_('c0',_'c1',_'c2',_'c3')) + 170*x_('v0',_('c1',_'c2',_'c3')) + 260*x_('v1',_('c0',_'c2')) + 90*x_('v1',_('c1',_'c3')) + 1000*y_c0 + 1000*y_c1 + 1000*y_c2 + 1000*y_c3 + 0\n", "SUBJECT TO\n", "Must_assign_c0: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v1',_('c0',_'c2'))\n", " + y_c0 = 1\n", "\n", "Must_assign_c1: x_('v0',_('c0',_'c1',_'c2',_'c3'))\n", " + x_('v0',_('c1',_'c2',_'c3')) + x_('v1',_('c1',_'c3')) + y_c1 = 1\n", "\n", "Must_assign_c2: x_('v0',_('c0',_'c1',_'c2',_'c3'))\n", " + x_('v0',_('c1',_'c2',_'c3')) + x_('v1',_('c0',_'c2')) + y_c2 = 1\n", "\n", "Must_assign_c3: x_('v0',_('c0',_'c1',_'c2',_'c3'))\n", " + x_('v0',_('c1',_'c2',_'c3')) + x_('v1',_('c1',_'c3')) + y_c3 = 1\n", "\n", "Vehicle_assign_v0: x_('v0',_('c0',_'c1',_'c2',_'c3'))\n", " + x_('v0',_('c1',_'c2',_'c3')) <= 1\n", "\n", "Vehicle_assign_v1: x_('v1',_('c0',_'c2')) + x_('v1',_('c1',_'c3')) <= 1\n", "\n", "VARIABLES\n", "x_('v0',_('c0',_'c1',_'c2',_'c3')) <= 1 Continuous\n", "x_('v0',_('c1',_'c2',_'c3')) <= 1 Continuous\n", "x_('v1',_('c0',_'c2')) <= 1 Continuous\n", "x_('v1',_('c1',_'c3')) <= 1 Continuous\n", "y_c0 <= 1 Continuous\n", "y_c1 <= 1 Continuous\n", "y_c2 <= 1 Continuous\n", "y_c3 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 127 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u306e\u554f\u984c\u3092\u89e3\u304f\u3068\uff0c\u3064\u304e\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "status=master_p.solve()\n", "print pulp.LpStatus[status]\n", "dual_cargo,dual_vehicle={},{}\n", "for c in cargos:\n", "\tdual_cargo[c]=master_p.constraints[\"Must_assign_%s\"%c].pi\n", "for v in vehicles:\n", " dual_vehicle[v]=master_p.constraints[\"Vehicle_assign_%s\"%v].pi\n", "print dual_cargo,dual_vehicle" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n", "{'c3': 0.0, 'c2': 170.0, 'c1': 0.0, 'c0': 70.0} {'v0': 0.0, 'v1': 0.0}\n" ] } ], "prompt_number": 128 }, { "cell_type": "code", "collapsed": false, "input": [ "print \"s-t paths for v0\"\n", "for path in nx.all_simple_paths(G['v0'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v0'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "print \"s-t paths for v1\"\n", "for path in nx.all_simple_paths(G['v1'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v1'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "\n", "\t" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "s-t paths for v0\n", "['s', 'c1', 'c3', 'c2', 't'] 0.0\n", "['s', 'c1', 'c3', 't'] 130.0\n", "['s', 'c0', 'c3', 'c2', 't'] -25.0\n", "['s', 'c0', 'c3', 't'] 105.0\n", "['s', 'c0', 'c2', 't'] -30.0\n", "['s', 'c0', 'c1', 'c3', 'c2', 't'] 0.0\n", "['s', 'c0', 'c1', 'c3', 't'] 130.0\n", "s-t paths for v1\n", "['s', 'c1', 'c3', 't'] 90.0\n", "['s', 'c0', 'c3', 't'] 155.0\n", "['s', 'c0', 'c2', 't'] 20.0\n" ] } ], "prompt_number": 129 }, { "cell_type": "markdown", "metadata": {}, "source": [ "v0\u306es-t\u30d1\u30b9\u3067\uff0c\u30b3\u30b9\u30c8\u304c\u8ca0\u306b\u306a\u308b\u3082\u306e\u304c2\u3064\u3042\u308a\u307e\u3059\u306e\u3067\uff0c\u4e21\u65b9\u5165\u308c\u3066\u3057\u307e\u3044\u307e\u3057\u3087\u3046\u3002\u3000" ] }, { "cell_type": "code", "collapsed": false, "input": [ "v_feas_rt['v0']+=[('v0',('c0','c2','c3'))]\n", "v_feas_rt['v0']+=[('v0',('c0','c2'))]\n", "route_cost[('v0',('c0','c2','c3'))]=215\n", "route_cost[('v0',('c0','c2'))]=210" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 130 }, { "cell_type": "code", "collapsed": false, "input": [ "import pulp\n", "feas_rt=[]\n", "for v in vehicles:\n", "\tfeas_rt+=v_feas_rt[v]\n", "master_p=pulp.LpProblem(\"MasterProblem\",pulp.LpMinimize)\n", "x=pulp.LpVariable.dicts('x',feas_rt,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "y=pulp.LpVariable.dicts('y',cargos,lowBound=0,upBound=1,cat=pulp.LpContinuous)\n", "for c in cargos:\n", " master_p+=sum([x[route] for route in feas_rt if c in route[1]])+y[c]==1,\"Must_assign_%s\"%c\n", "for v in vehicles:\n", " master_p+= sum( [x[route] for route in v_feas_rt[v]])<=1,\"Vehicle_assign_%s\"%v\n", "master_p+=sum([route_cost[route]*x[route] for route in feas_rt])+sum([1000*y[c] for c in cargos])\n", "print master_p" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "MasterProblem:\n", "MINIMIZE\n", "240*x_('v0',_('c0',_'c1',_'c2',_'c3')) + 210*x_('v0',_('c0',_'c2')) + 215*x_('v0',_('c0',_'c2',_'c3')) + 170*x_('v0',_('c1',_'c2',_'c3')) + 260*x_('v1',_('c0',_'c2')) + 90*x_('v1',_('c1',_'c3')) + 1000*y_c0 + 1000*y_c1 + 1000*y_c2 + 1000*y_c3 + 0\n", "SUBJECT TO\n", "Must_assign_c0: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v0',_('c0',_'c2'))\n", " + x_('v0',_('c0',_'c2',_'c3')) + x_('v1',_('c0',_'c2')) + y_c0 = 1\n", "\n", "Must_assign_c1: x_('v0',_('c0',_'c1',_'c2',_'c3'))\n", " + x_('v0',_('c1',_'c2',_'c3')) + x_('v1',_('c1',_'c3')) + y_c1 = 1\n", "\n", "Must_assign_c2: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v0',_('c0',_'c2'))\n", " + x_('v0',_('c0',_'c2',_'c3')) + x_('v0',_('c1',_'c2',_'c3'))\n", " + x_('v1',_('c0',_'c2')) + y_c2 = 1\n", "\n", "Must_assign_c3: x_('v0',_('c0',_'c1',_'c2',_'c3'))\n", " + x_('v0',_('c0',_'c2',_'c3')) + x_('v0',_('c1',_'c2',_'c3'))\n", " + x_('v1',_('c1',_'c3')) + y_c3 = 1\n", "\n", "Vehicle_assign_v0: x_('v0',_('c0',_'c1',_'c2',_'c3')) + x_('v0',_('c0',_'c2'))\n", " + x_('v0',_('c0',_'c2',_'c3')) + x_('v0',_('c1',_'c2',_'c3')) <= 1\n", "\n", "Vehicle_assign_v1: x_('v1',_('c0',_'c2')) + x_('v1',_('c1',_'c3')) <= 1\n", "\n", "VARIABLES\n", "x_('v0',_('c0',_'c1',_'c2',_'c3')) <= 1 Continuous\n", "x_('v0',_('c0',_'c2')) <= 1 Continuous\n", "x_('v0',_('c0',_'c2',_'c3')) <= 1 Continuous\n", "x_('v0',_('c1',_'c2',_'c3')) <= 1 Continuous\n", "x_('v1',_('c0',_'c2')) <= 1 Continuous\n", "x_('v1',_('c1',_'c3')) <= 1 Continuous\n", "y_c0 <= 1 Continuous\n", "y_c1 <= 1 Continuous\n", "y_c2 <= 1 Continuous\n", "y_c3 <= 1 Continuous\n", "\n" ] } ], "prompt_number": 131 }, { "cell_type": "code", "collapsed": false, "input": [ "status=master_p.solve()\n", "print pulp.LpStatus[status]\n", "dual_cargo,dual_vehicle={},{}\n", "for c in cargos:\n", "\tdual_cargo[c]=master_p.constraints[\"Must_assign_%s\"%c].pi\n", "for v in vehicles:\n", " dual_vehicle[v]=master_p.constraints[\"Vehicle_assign_%s\"%v].pi\n", "print dual_cargo,dual_vehicle" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n", "{'c3': 0.0, 'c2': 140.0, 'c1': 30.0, 'c0': 70.0} {'v0': 0.0, 'v1': 0.0}\n" ] } ], "prompt_number": 132 }, { "cell_type": "code", "collapsed": false, "input": [ "print \"s-t paths for v0\"\n", "for path in nx.all_simple_paths(G['v0'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v0'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "print \"s-t paths for v1\"\n", "for path in nx.all_simple_paths(G['v1'],source='s',target='t'):\n", "\ttcost=0\n", "\tfor i in range(len(path)-1):\n", "\t\ttcost+=G['v1'][path[i]][path[i+1]]['weight']\n", "\t\tif path[i]!='s':\n", "\t\t\ttcost-=dual_cargo[path[i]]\n", "\tprint path,tcost\t\n", "\n", "\t" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "s-t paths for v0\n", "['s', 'c1', 'c3', 'c2', 't'] 0.0\n", "['s', 'c1', 'c3', 't'] 100.0\n", "['s', 'c0', 'c3', 'c2', 't'] 5.0\n", "['s', 'c0', 'c3', 't'] 105.0\n", "['s', 'c0', 'c2', 't'] 0.0\n", "['s', 'c0', 'c1', 'c3', 'c2', 't'] 0.0\n", "['s', 'c0', 'c1', 'c3', 't'] 100.0\n", "s-t paths for v1\n", "['s', 'c1', 'c3', 't'] 60.0\n", "['s', 'c0', 'c3', 't'] 155.0\n", "['s', 'c0', 'c2', 't'] 50.0\n" ] } ], "prompt_number": 133 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3067\uff0c\u3059\u3079\u3066\u306e\u30b3\u30b9\u30c8\u304c\u975e\u8ca0\u306b\u306a\u308a\u307e\u3057\u305f\uff0e\u3053\u308c\u306f\uff0c\u3082\u3046\u8ffd\u52a0\u3059\u3079\u304ds-t\u3000\u30d1\u30b9\u304c\u306a\u3044\u3053\u3068\u3092\u793a\u3057\u3066\u3044\u307e\u3059\uff0e\u3053\u306e\u72b6\u614b\u304c\uff0c\u7dda\u5f62\u7de9\u548c\u554f\u984c\u304c\u6700\u9069\u306b\u89e3\u3051\u3066\u3044\u308b\u3053\u3068\u3092\u8868\u308f\u3057\u3066\u3044\u307e\u3059\uff0e" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "\u96c6\u5408\u5206\u5272\u554f\u984c : 0-1\u5909\u6570\u306b\u623b\u3057\u3066\u89e3\u304f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3066\uff0c\u3053\u3053\u304b\u3089\uff0c\u3082\u3068\u306e\u96c6\u5408\u5206\u5272\u554f\u984c\u306e\u8fd1\u4f3c\u89e3\u3092\u5f97\u307e\u3059\uff0e\u5177\u4f53\u7684\u306b\u306f\uff0c0-1\u306e\u9023\u7d9a\u5909\u6570\u3068\u3057\u3066\u5b9a\u7fa9\u3057\u3066\u3044\u305f\u3082\u306e\u30920-1\u5909\u6570\u3068\u3057\u3066\u96c6\u5408\u5206\u5272\u554f\u984c\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff0e\u305d\u3057\u3066\uff0c\u3053\u306e\u96c6\u5408\u5206\u5272 \u554f\u984c\u306e\u89e3\u3092\uff0c\u3082\u3068\u306eVRP\u306e\u8fd1\u4f3c\u89e3\u3068\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pulp\n", "feas_rt=[]\n", "for v in vehicles:\n", "\tfeas_rt+=v_feas_rt[v]\n", "spp=pulp.LpProblem(\"MasterProblem\",pulp.LpMinimize)\n", "x=pulp.LpVariable.dicts('x',feas_rt,lowBound=0,upBound=1,cat=pulp.LpBinary)\n", "y=pulp.LpVariable.dicts('y',cargos,lowBound=0,upBound=1,cat=pulp.LpBinary)\n", "for c in cargos:\n", " spp+=sum([x[route] for route in feas_rt if c in route[1]])+y[c]==1,\"Must_assign_%s\"%c\n", "for v in vehicles:\n", " spp+= sum( [x[route] for route in v_feas_rt[v]])<=1,\"Vehicle_assign_%s\"%v\n", "spp+=sum([route_cost[route]*x[route] for route in feas_rt])+sum([1000*y[c] for c in cargos])\n", "status=spp.solve()\n", "print pulp.LpStatus[status]\n", "\n", "for v in spp.variables():\n", " if v.varValue>0.1:\n", " print v.name,v.varValue" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Optimal\n", "x_('v0',_('c0',_'c1',_'c2',_'c3')) 1.0\n" ] } ], "prompt_number": 134 } ], "metadata": {} } ] }