{
"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": {}
}
]
}