{ "metadata": { "name": "", "signature": "sha256:ac1df3a7c4f1f293c973a9b7a5f70e3d1657295c9c78051cd3c1c2c3c1dec5f3" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "PICOS\u306b\u3088\u308b\u9310\u8a08\u753b" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "PICOS\u3068\u306f?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[PICOS](http://picos.zib.de/)\u306f\uff0c\u9310\u8a08\u753b\u306e\u30e2\u30c7\u30ea\u30f3\u30b0\u306e\u305f\u3081\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3067\u3059\uff0e\u9310\u8a08\u753b\u306f\u7dda\u5f62\u8a08\u753b\u554f\u984c\u3092\u62e1\u5f35\u3057\u305f\u3082\u306e\u3068\u8003\u3048\u308b\u3053\u3068\u304c\u3067\u304d\uff0c\u4e8c\u6b21\u9310\u8a08\u753b\u554f\u984c\uff08Second-Order Cone Programming, SOCP\uff09\u3084\uff0c\u534a\u6b63\u5b9a\u5024\u8a08\u753b\u554f\u984c\uff08SemiDefinite Programming,SDP\uff09\u304c\u9310\u8a08\u753b\u306e\u4f8b\u3067\u3059\uff0e" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "LP\u3092PICOS\u3067\u66f8\u304f" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u5236\u7d04\u5f0f\u30921\u3064\u305a\u3064\u66f8\u304f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "PICOS\u306etutorial\u306b\u3042\u308b\uff0c\u6b21\u306eLP\u3092\u89e3\u3044\u3066\u307f\u307e\u3057\u3087\u3046\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.display import Image\n", "fig=Image(url='http://mathopt.sakura.ne.jp/LP1.png')\n", "fig" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 66, "text": [ "" ] } ], "prompt_number": 66 }, { "cell_type": "code", "collapsed": false, "input": [ "import picos as pic\n", "P=pic.Problem()\n", "x=P.add_variable('x',2)\n", "P.add_constraint(x[0]>x[1])\n", "P.add_constraint(x[0]<=3)\n", "P.add_constraint(x[0]+x[1]<=4)\n", "objective=0.5*x[0]+x[1]\n", "P.set_objective('max',objective)\n", "print P\n", "P.solve(solver='cvxopt',verbose=False);\n", "print P.obj_value()\n", "\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "---------------------\n", "optimization problem (LP):\n", "2 variables, 3 affine constraints\n", "\n", "x \t: (2, 1), continuous\n", "\n", "\tmaximize 0.5*x[0] + x[1]\n", "such that\n", " x[0] > x[1]\n", " x[0] < 3.0\n", " x[0] + x[1] < 4.0\n", "---------------------\n", "3.0000000002\n" ] } ], "prompt_number": 67 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "\u5236\u7d04\u5f0f\u3092\u884c\u5217\u3067\u66f8\u304f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4e0a\u306e\u5b9a\u7fa9\u3067\u306f\uff0c\u5236\u7d04\u5f0f\u3092\u3072\u3068\u3064\u305a\u3064\u5b9a\u7fa9\u3057\u307e\u3057\u305f\u304c\uff0c\u304a\u306a\u3058\u3053\u3068\u3092\u884c\u5217\u3068\u30d9\u30af\u30c8\u30eb\u3092\u4f7f\u3063\u3066\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e\u884c\u5217\u3068\u30d9\u30af\u30c8\u30eb\u3092\u7528\u3044\u3066\u66f8\u304f\u3068\u3053\u306eLP\u306f\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "fig2=Image(url='http://mathopt.sakura.ne.jp/LP2.png')\n", "fig2" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 68, "text": [ "" ] } ], "prompt_number": 68 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u306e\u305f\u3081\u306b\u306f\uff0c\u5236\u7d04\u884c\u5217A, \u30d9\u30af\u30c8\u30ebb, \u305d\u3057\u3066\u76ee\u7684\u95a2\u6570\u3092\u5b9a\u3081\u308b\u30d9\u30af\u30c8\u30ebc\u3092\u5b9a\u7fa9\u3057\u307e\u3059\uff0eA\u306e\u5b9a\u7fa9\u306b\u306fcvxopt\u306e\u884c\u5217\u751f\u6210\u6a5f\u80fd\u3092\u4f7f\u3044\u307e\u3059\uff0ecvx.matrix()\u306e\u5f15\u6570\u306b\u306f\uff0c\u884c\u5217\u306e\u5217\u3092\u9806\u306b\u6307\u5b9a\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import cvxopt as cvx\n", "A=pic.new_param('A',cvx.matrix([[-1,1,1],[1,0,1]]))\n", "b=[0,3,4]\n", "c=[0.5,1]\n", "\n", "P=pic.Problem()\n", "x=P.add_variable('x',2)\n", "objective=(c|x)\n", "P.set_objective('max',objective)\n", "P.add_constraint(A*x<=b)\n", "print P\n", "P.solve(solver='cvxopt',verbose=False);\n", "print P.obj_value()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "---------------------\n", "optimization problem (LP):\n", "2 variables, 3 affine constraints\n", "\n", "x \t: (2, 1), continuous\n", "\n", "\tmaximize \u2329 [ 2 x 1 MAT ] | x \u232a\n", "such that\n", " A*x < [ 3 x 1 MAT ]\n", "---------------------\n", "3.0000000002\n" ] } ], "prompt_number": 69 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3053\u3067\u306f\uff0c\u30d9\u30af\u30c8\u30ebc\u3068\u30d9\u30af\u30c8\u30ebx\u306e\u5185\u7a4d\u3092\u5b9a\u7fa9\u3059\u308b\u306e\u306b\uff0c(c|x)\u3068\u3044\u3046\u8868\u73fe\u3092\u7528\u3044\u3066\u3044\u307e\u3059\uff0epicos\u3067\u306f\uff0c\u9069\u5b9c\u30aa\u30fc\u30d0\u30fc\u30ed\u30fc\u30c9\u3055\u308c\u3066\u304a\u308a\uff0c\u76f4\u611f\u7684\u306a\u8a18\u8ff0\u304c\u53ef\u80fd\u3067\u3059\uff0e\u5236\u7d04\u5f0f\u306e\u5b9a\u7fa9\u3067\u306f\uff0cA*x\u3068\u3044\u3046\u8868\u73fe\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\uff0e\u3053\u308c\u306f\uff0c\u884c\u5217A\u3068\u30d9\u30af\u30c8\u30ebx\u306e\u7a4d\u3092\u5b9a\u7fa9\u3057\u3066\u3044\u307e\u3059\uff0e" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "SDP\u3092PICOS\u3067\u66f8\u304f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3066\uff0c\u3053\u308c\u3092\u3082\u3068\u306b\uff0c\u7c21\u5358\u306a\u534a\u6b63\u5b9a\u5024\u8a08\u753b\u554f\u984c\u3092\u5b9a\u7fa9\u3057\u3066\u307f\u307e\u3059\uff0e\u534a\u6b63\u5b9a\u5024\u8a08\u753b\u554f\u984c\u306f\uff0c\u6570\u5f0f\u3067\u306f\u6b21\u306e\u3088\u3046\u306b\u8868\u308f\u305b\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "SDP1=Image(url='http://mathopt.sakura.ne.jp/SDP1.png')\n", "SDP1" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 70, "text": [ "" ] } ], "prompt_number": 70 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3053\u3067\uff0c2\u756a\u76ee\u306e\u5236\u7d04\u5f0f\u306f\uff0c\u884c\u5217Y\u304c\u534a\u6b63\u5b9a\u5024\u3067\u3042\u308b\u3053\u3068\u3092\u8868\u308f\u3057\u307e\u3059\uff0eLP\u306f\u534a\u6b63\u5b9a\u5024\u8a08\u753b\u554f\u984c\u3068\u3057\u3066\u66f8\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e\u4e0a\u306e\u534a\u6b63\u5b9a\u5024\u8a08\u753b\u554f\u984c\u306b\u3042\u308f\u305b\u3066\uff0c\u5148\u306eLP\u3092\u66f8\u304d\u76f4\u3057\u3066\u307f\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "SDP2=Image(url='http://mathopt.sakura.ne.jp/SDP2.png')\n", "SDP2" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 71, "text": [ "" ] } ], "prompt_number": 71 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3089\u306b\u66f8\u304d\u63db\u3048\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "SDP3=Image(url='http://mathopt.sakura.ne.jp/SDP3.png')\n", "SDP3" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 72, "text": [ "" ] } ], "prompt_number": 72 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u306e\u5404\u30d9\u30af\u30c8\u30eb\u3092(3,3)\u884c\u5217\u3068\u3057\u3066\u66f8\u304d\u63db\u3048\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "SDP4=Image(url='http://mathopt.sakura.ne.jp/SDP4.png')\n", "SDP4" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 73, "text": [ "" ] } ], "prompt_number": 73 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3068\u3044\u3046\u3053\u3068\u3067\uff0c" ] }, { "cell_type": "code", "collapsed": false, "input": [ "SDP5=Image(url='http://mathopt.sakura.ne.jp/SDP5.png')\n", "SDP5" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 74, "text": [ "" ] } ], "prompt_number": 74 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3068\u3059\u308c\u3070\uff0c\u4e0a\u8a18\u306e\u5f62\u5f0f\u306e\u534a\u6b63\u5b9a\u5024\u8a08\u753b\u554f\u984c\u3068\u3057\u3066\u8868\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3055\u3066\uff0c\u3053\u306e\u534a\u6b63\u5b9a\u5024\u8a08\u753b\u554f\u984c\u3092picos\u3067\u5b9a\u7fa9\u3057\u3066\u307f\u307e\u3057\u3087\u3046\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "A={}\n", "A[0]=pic.new_param('A0',cvx.matrix([[0,0,0],[0,3,0],[0,0,4]]))\n", "A[1]=pic.new_param('A1',cvx.matrix([[-1,0,0],[0,1,0],[0,0,1]]))\n", "A[2]=pic.new_param('A2',cvx.matrix([[1,0,0],[0,0,0],[0,0,1]]))\n", "b=[0.5,1.0]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 75 }, { "cell_type": "code", "collapsed": false, "input": [ "sdp=pic.Problem()\n", "z=sdp.add_variable('z',2)\n", "objective=(b|z)\n", "sdp.set_objective('max',objective)\n", "sdp.add_constraint(A[0]-z[0]*A[1]-z[1]*A[2]>>0)\n", "print sdp" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "---------------------\n", "optimization problem (SDP):\n", "2 variables, 0 affine constraints, 6 vars in 1 SD cones\n", "\n", "z \t: (2, 1), continuous\n", "\n", "\tmaximize \u2329 [ 2 x 1 MAT ] | z \u232a\n", "such that\n", " A0 -z[0]*A1 -z[1]*A2 \u227d |0|\n", "---------------------\n" ] } ], "prompt_number": 76 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3053\u3067\u306f\uff0c>>\u3068\u3044\u3046\u4e8c\u9805\u6f14\u7b97\u5b50\u3092\u7528\u3044\u3066\u3044\u307e\u3059\uff0e\u3053\u308c\u306f\uff0cX>>0\u306f\u884c\u5217X\u304c\u534a\u6b63\u5b9a\u5024\u3067\u3042\u308b\u3053\u3068\u3092\u8868\u308f\u3059\u3088\u3046\u306b\u30aa\u30fc\u30d0\u30fc\u30ed\u30fc\u30c9\u3055\u308c\u3066\u3044\u307e\u3059\uff0e\u3057\u305f\u304c\u3063\u3066\uff0c\u4e0a\u306e\u3088\u3046\u306badd_constraint()\u3092\u7528\u3044\u3066\u534a\u6b63\u5b9a\u5024\u8a08\u753b\u554f\u984c\u3092\u5b9a\u7fa9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u308c\u3092\u89e3\u304f\u3068\uff0cLP\u3068\u3057\u3066\u5b9a\u7fa9\u3057\u305f\u6642\u3068\u540c\u3058\u6700\u9069\u5024\u304c\u5f97\u3089\u308c\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sdp.solve(solver='cvxopt',verbose=False);\n", "print sdp.obj_value()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "3.0000000002\n" ] } ], "prompt_number": 77 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "SOCP\u3092PICOS\u3067\u66f8\u304f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u4eca\u5ea6\u306f\uff0c\u4e8c\u6b21\u9310\u8a08\u753b\u554f\u984c(socp)\u3092\u5b9a\u7fa9\u3057\u3066\u307f\u307e\u3059\uff0e\u4e8c\u6b21\u9310\u8a08\u753b\u554f\u984c\u306f\uff0c\u6570\u5f0f\u3067\u306f\u6b21\u306e\u3088\u3046\u306b\u8868\u308f\u305b\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "SOCP1=Image(url='http://mathopt.sakura.ne.jp/SOCP1.png')\n", "SOCP1" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 78, "text": [ "" ] } ], "prompt_number": 78 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u3053\u3053\u3067\uff0ca_i\u3068y\u306f\u9069\u5f53\u306a\u6b21\u5143\u306e\u30d9\u30af\u30c8\u30eb\u3068\u3057\u307e\u3059\uff0e\u307e\u305f\uff0c2\u756a\u76ee\u306e\u5236\u7d04\u5f0f\u306f\uff0c\u30d9\u30af\u30c8\u30eby=(y_0,y_1,y_2,...,y_n)\u304c2\u6b21\u9310\u306b\u5165\u3063\u3066\u3044\u308b\uff0c\u3059\u306a\u308f\u3061\uff0cy_0 >= \u00a5sqrt{ y_1^2 + y_2^2 + ... + y_n^2}\u3092\u6e80\u305f\u3059\u3053\u3068\u3092\u610f\u5473\u3057\u307e\u3059\uff0e" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import math\n", "import random\n", "a={}\n", "a[0]=[random.randint(1,5)*10 for i in range(1,4)]\n", "a[1]=[random.randint(1,5)*10 for i in range(1,4)]\n", "a[2]=[random.randint(1,5)*10 for i in range(1,4)]\n", "b=[0.5,1]\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 79 }, { "cell_type": "code", "collapsed": false, "input": [ "socp=pic.Problem()\n", "z=socp.add_variable('z',2)\n", "objective=(b|z)\n", "socp.set_objective('max',objective)\n", "socp.add_constraint(abs((a[0]-z[0]*a[1]-z[1]*a[2])[1:] )< (a[0]-z[0]*a[1]-z[1]*a[2])[0])\n", "print socp" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "---------------------\n", "optimization problem (SOCP):\n", "2 variables, 0 affine constraints, 3 vars in 1 SO cones\n", "\n", "z \t: (2, 1), continuous\n", "\n", "\tmaximize \u2329 [ 2 x 1 MAT ] | z \u232a\n", "such that\n", " ||( -z[0]*[ 3 x 1 MAT ] + [ 3 x 1 MAT ] -z[1]*[ 3 x 1 MAT ] )[1:]|| < ( -z[0]*[ 3 x 1 MAT ] + [ 3 x 1 MAT ] -z[1]*[ 3 x 1 MAT ] )[0]\n", "---------------------\n" ] } ], "prompt_number": 80 }, { "cell_type": "code", "collapsed": false, "input": [ "socp.solve(solver='cvxopt');\n", "print socp.obj_value()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "--------------------------\n", " cvxopt CONELP solver\n", "--------------------------\n", " pcost dcost gap pres dres k/t\n", " 0: -5.8955e-01 -5.8955e-01 7e-01 4e-01 3e-16 1e+00\n", " 1: -1.0115e-01 -1.0507e-01 7e-02 4e-02 4e-16 1e-01\n", " 2: -1.0089e-01 -1.0120e-01 2e-03 1e-03 2e-16 3e-03\n", " 3: -1.0031e-01 -1.0031e-01 3e-05 1e-05 2e-16 4e-05\n", " 4: -1.0030e-01 -1.0031e-01 7e-07 4e-07 4e-15 9e-07\n", " 5: -1.0030e-01 -1.0030e-01 2e-08 9e-09 5e-13 2e-08\n", " 6: -1.0030e-01 -1.0030e-01 2e-10 1e-10 4e-12 3e-10\n", "Optimal solution found.\n", "cvxopt status: optimal\n", "0.100304937556\n" ] } ], "prompt_number": 81 } ], "metadata": {} } ] }