#!/use/bin/env python
# -*- coding: UTF-8 -*-
from numpy import *
from scipy import *
from scipy import linalg
import string
import sys
def main( ) :
args = sys .argv [ 1 :]
problem = 1
method = 1
search = 1
if problem == 1 :
n = 2
x = array ( [ -36 ., 114 .] )
def evalf( x) :
f = x[ 0 ] **2 + math .exp ( x[ 0 ] ) + x[ 1 ] **4 + x[ 1 ] **2 - 2 *x[ 0 ] *x[ 1 ] + 3
return f
def evalg( x) :
g = array ( [ 2 *x[ 0 ] + math .exp ( x[ 0 ] ) - 2 *x[ 1 ] , 4 *x[ 1 ] **3 + 2 *x[ 1 ] - 2 *x[ 0 ] ] )
return g
def evalh( x) :
H = array ( [ [ 2 + math .exp ( x[ 0 ] ) , -2 ] , [ -2 , 12 *x[ 1 ] **2 + 2 ] ] )
return H
elif problem == 2 :
n = 2
x = array ( [ 1 ., 1 .] )
def evalf( x) :
f = 0.0
for i in range ( 0 , 3 ) :
f += evalf_i( i, x) **2
return f
def evalf_i( i, x) :
y = array ( [ 1.5 , 2.25 , 2.625 ] )
f = y[ i] - x[ 0 ] * ( 1 - x[ 1 ] **( i+1 ) )
return f
def evalg_i( i, x) :
g = array ( [ x[ 1 ] **( i+1 ) - 1 , ( i+1 ) * x[ 0 ] * x[ 1 ] **i] )
return g
def evalh_i( i, x) :
h = array ( [ [ 0 , ( i+1 ) * x[ 1 ] **i] , [ ( i+1 ) * x[ 1 ] **i, ( i+1 ) * i * x[ 0 ] * x[ 1 ] **( i-1 ) ] ] )
return h
def evalg( x) :
g = zeros( 2 )
for i in range ( 0 , 3 ) :
g += 2 * evalf_i( i, x) * evalg_i( i, x)
return g
def evalh( x) :
H = array ( [ [ 0.0 , 0.0 ] , [ 0.0 , 0.0 ] ] )
for i in range ( 0 , 3 ) :
H += 2 * ( evalf_i( i, x) * evalh_i( i, x) + dot( evalg_i( i, x) .reshape ( -1 , 1 ) , evalg_i( i, x) .reshape ( 1 , -1 ) ) )
return H
elif problem == 3 :
n = 20
Z = random .rand ( n, n)
A = dot( Z.T , Z)
x = ones( n)
def evalf( x) :
f = inner( dot( A, x) , x)
return f
def evalg( x) :
g = dot( A, x)
return g
def evalh( x) :
H = A
return H
elif problem == 4 :
n = 2
x = array ( [ 0 ., 0 .] )
l = array ( [ -5 , 0 ] )
u = array ( [ 10 , 15 ] )
def evalf( x) :
f = ( x[ 1 ] - 5.1 *x[ 0 ] **2 / ( 4 *math .pi **2 ) + 5 *x[ 0 ] / math .pi -6 ) **2 + 10 *( 1 - 1 /( 8 *math .pi ) ) *math .cos ( x[ 0 ] ) + 10
return f
def evalg( x) :
g = array ( [ 2 *( x[ 1 ] - 5.1 *x[ 0 ] **2 / ( 4 *math .pi **2 ) + 5 *x[ 0 ] / math .pi -6 ) *( -5.1 *x[ 0 ] / ( 2 *math .pi **2 ) + 5 /math .pi ) - 10 *( 1 - 1 / ( 8 *math .pi ) ) *math .sin ( x[ 0 ] ) , 2 *( x[ 1 ] - 5.1 *x[ 0 ] **2 / ( 4 *math .pi **2 ) + 5 *x[ 0 ] / math .pi -6 ) ] )
return g
def evalh( x) :
h = array ( [ [ 2 *( -5.1 *x[ 0 ] / ( 2 *math .pi **2 ) + 5 /math .pi ) **2 -5.1 *( x[ 1 ] - 5.1 *x[ 0 ] **2 / ( 4 *math .pi **2 ) + 5 *x[ 0 ] / math .pi -6 ) / math .pi **2 , 2 *( -5.1 *x[ 0 ] / ( 2 *math .pi **2 ) + 5 /math .pi ) ] , [ 2 *( -5.1 *x[ 0 ] / ( 2 *math .pi **2 ) + 5 /math .pi ) , 2 ] ] )
return h
elif problem == 5 :
n = 2
x = array ( [ -1 ., -22 .] )
l = -32.768 * ones( n)
u = 32.768 * ones( n)
def evalf1( x) :
f1 = 0
for i in range ( 0 , n) :
f1 += x[ i] **2
f1 = -0.2 * sqrt( f1/n)
return f1
def evalg1( x) :
g1 = zeros( n)
for i in range ( 0 , n) :
g1[ i] = 0.04 * x[ i] / ( n * evalf1( x) )
return g1
def evalf2( x) :
f2 = 0
for i in range ( 0 , n) :
f2 += math .cos ( 2 * math .pi * x[ i] )
f2 = f2/n
return f2
def evalg2( x) :
g2 = zeros( n)
for i in range ( 0 , n) :
g2[ i] = -2 * math .pi * math .sin ( 2 * math .pi * x[ i] ) / n
return g2
def evalf( x) :
f = -20 * math .exp ( evalf1( x) ) - math .exp ( evalf2( x) ) + 20 + e
return f
def evalg( x) :
g = -20 * math .exp ( evalf1( x) ) * evalg1( x) - math .exp ( evalf2( x) ) * evalg2( x)
return g
else :
print 'Error!'
return 0
xi = 1e-4
rho = 0.5
epsilon = n * 1e-6
k = 0
f_num = 0
while True :
if k >= 200000 :
print 'k =' , k, '\n 許容最大反復回数を超えました.'
return 0
if method == 1 :
g = evalg( x)
if linalg.norm ( g) <= epsilon:
break
d = - g
elif method == 2 :
g = evalg( x)
if linalg.norm ( g) <= epsilon:
break
tau = 0
B = evalh( x)
I = identity( n)
while True :
try :
L = linalg.cho_factor ( B + tau * I)
d = linalg.cho_solve ( L, -g)
break
except :
if tau == 0 :
tau = 2
else :
tau = tau * 2
elif method == 3 :
s = 1
d = fmax( l, fmin( x - s * evalg( x) , u) ) - x
if linalg.norm ( d) <= epsilon:
break
else :
print 'Error!'
return 0
t = 1
f = evalf( x)
f_num = f_num + 1
dg = inner( d, evalg( x) )
while True :
f_step = evalf( x + t * d)
f_num = f_num + 1
if f_step <= f + xi * t * dg:
break
if search == 1 :
t = rho * t
elif search == 2 :
t_prev = t
t = - dg * t**2 / ( 2 * ( f_step - f - dg * t) )
if t < 0.1 * t_prev or t > 0.9 * t_prev:
t = t_prev / 2.0
else :
print 'Error!'
return 0
if method == 3 :
if t * max ( abs ( d) ) <= 1e-16 * max ( 1 , max ( abs ( x) ) ) :
break
x = x + t * d
k = k + 1
print 'g =' , linalg.norm ( evalg( x) ) , '\n x =' , x
print 'f =' , evalf( x) , '\n x =' , x, '\n k =' , k, '\n 評価回数 =' , f_num
if __name__ == '__main__' : main( )
IyEvdXNlL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogVVRGLTggLSotCgpmcm9tIG51bXB5IGltcG9ydCAqCmZyb20gc2NpcHkgaW1wb3J0ICoKZnJvbSBzY2lweSBpbXBvcnQgbGluYWxnCmltcG9ydCBzdHJpbmcKaW1wb3J0IHN5cwoKZGVmIG1haW4oKToKICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KICAgIHByb2JsZW0gPSAxCiAgICBtZXRob2QgPSAxCiAgICBzZWFyY2ggPSAxCgogICAgaWYgcHJvYmxlbSA9PSAxOgogICAgICAgIG4gPSAyCiAgICAgICAgeCA9IGFycmF5KFstMzYuLDExNC5dKQoKICAgICAgICBkZWYgZXZhbGYoeCk6CiAgICAgICAgICAgIGYgPSB4WzBdKioyICsgbWF0aC5leHAoeFswXSkgKyB4WzFdKio0ICsgeFsxXSoqMiAtIDIqeFswXSp4WzFdICsgMwogICAgICAgICAgICByZXR1cm4gZgoKICAgICAgICBkZWYgZXZhbGcoeCk6CiAgICAgICAgICAgIGcgPSBhcnJheSAoWzIqeFswXSArICBtYXRoLmV4cCh4WzBdKSAtIDIqeFsxXSw0KnhbMV0qKjMgKyAyKnhbMV0gLSAyKnhbMF1dKQogICAgICAgICAgICByZXR1cm4gZwoKICAgICAgICBkZWYgZXZhbGgoeCk6CiAgICAgICAgICAgIEggPSBhcnJheShbWzIgKyBtYXRoLmV4cCh4WzBdKSwtMl0sWy0yLDEyKnhbMV0qKjIgKyAyXV0pCiAgICAgICAgICAgIHJldHVybiBICgogICAgZWxpZiBwcm9ibGVtID09IDI6CiAgICAgICAgbiA9IDIKICAgICAgICB4ID0gYXJyYXkoWzEuLDEuXSkKCiAgICAgICAgZGVmIGV2YWxmKHgpOgogICAgICAgICAgICBmID0gMC4wCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsMyk6CiAgICAgICAgICAgICAgICBmICs9IGV2YWxmX2koaSx4KSoqMgogICAgICAgICAgICByZXR1cm4gZgoKICAgICAgICBkZWYgZXZhbGZfaShpLHgpOgogICAgICAgICAgICB5ID0gYXJyYXkoWzEuNSwyLjI1LDIuNjI1XSkKICAgICAgICAgICAgZiA9IHlbaV0gLSB4WzBdICogKDEgLSB4WzFdKiooaSsxKSkKICAgICAgICAgICAgcmV0dXJuIGYKCiAgICAgICAgZGVmIGV2YWxnX2koaSx4KToKICAgICAgICAgICAgZyA9IGFycmF5KFt4WzFdKiooaSsxKSAtIDEsKGkrMSkgKiB4WzBdICogeFsxXSoqaV0pCiAgICAgICAgICAgIHJldHVybiBnCgogICAgICAgIGRlZiBldmFsaF9pKGkseCk6CiAgICAgICAgICAgIGggPSBhcnJheShbWzAsKGkrMSkgKiB4WzFdKippXSxbKGkrMSkgKiB4WzFdKippLChpKzEpICogaSAqIHhbMF0gKiB4WzFdKiooaS0xKV1dKQogICAgICAgICAgICByZXR1cm4gaAoKICAgICAgICBkZWYgZXZhbGcoeCk6CiAgICAgICAgICAgIGcgPSB6ZXJvcygyKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLDMpOgogICAgICAgICAgICAgICAgZyArPSAyICogZXZhbGZfaShpLHgpICogZXZhbGdfaShpLHgpCiAgICAgICAgICAgIHJldHVybiBnCgogICAgICAgIGRlZiBldmFsaCh4KToKICAgICAgICAgICAgSCA9IGFycmF5KFtbMC4wLDAuMF0sWzAuMCwwLjBdXSkKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwzKToKICAgICAgICAgICAgICAgIEggKz0gMiAqIChldmFsZl9pKGkseCkgKiBldmFsaF9pKGkseCkgKyBkb3QoZXZhbGdfaShpLHgpLnJlc2hhcGUoLTEsMSksZXZhbGdfaShpLHgpLnJlc2hhcGUoMSwtMSkpKQogICAgICAgICAgICByZXR1cm4gSAoKICAgIGVsaWYgcHJvYmxlbSA9PSAzOgogICAgICAgIG4gPSAyMAogICAgICAgIFogPSByYW5kb20ucmFuZChuLG4pCiAgICAgICAgQSA9IGRvdChaLlQsWikKICAgICAgICB4ID0gb25lcyhuKQoKICAgICAgICBkZWYgZXZhbGYoeCk6CiAgICAgICAgICAgIGYgPSBpbm5lcihkb3QoQSx4KSx4KQogICAgICAgICAgICByZXR1cm4gZgoKICAgICAgICBkZWYgZXZhbGcoeCk6CiAgICAgICAgICAgIGcgPSBkb3QoQSx4KQogICAgICAgICAgICByZXR1cm4gZwoKICAgICAgICBkZWYgZXZhbGgoeCk6CiAgICAgICAgICAgIEggPSBBCiAgICAgICAgICAgIHJldHVybiBICgogICAgZWxpZiBwcm9ibGVtID09IDQ6CiAgICAgICAgbiA9IDIKICAgICAgICB4ID0gYXJyYXkoWzAuLDAuXSkKICAgICAgICBsID0gYXJyYXkoWy01LDBdKQogICAgICAgIHUgPSBhcnJheShbMTAsMTVdKQoKICAgICAgICBkZWYgZXZhbGYoeCk6CiAgICAgICAgICAgIGYgPSAoeFsxXSAtIDUuMSp4WzBdKioyIC8gKDQqbWF0aC5waSoqMikgKyA1KnhbMF0gLyBtYXRoLnBpIC02KSoqMiArIDEwKigxIC0gMS8oOCptYXRoLnBpKSkqbWF0aC5jb3MoeFswXSkgKyAxMAogICAgICAgICAgICByZXR1cm4gZgoKICAgICAgICBkZWYgZXZhbGcoeCk6CiAgICAgICAgICAgIGcgPSBhcnJheShbMiooeFsxXSAtIDUuMSp4WzBdKioyIC8gKDQqbWF0aC5waSoqMikgKyA1KnhbMF0gLyBtYXRoLnBpIC02KSooLTUuMSp4WzBdIC8gKDIqbWF0aC5waSoqMikgKyA1L21hdGgucGkpIC0gMTAqKDEgLSAxLyAoOCptYXRoLnBpKSkqbWF0aC5zaW4oeFswXSksMiooeFsxXSAtIDUuMSp4WzBdKioyIC8gKDQqbWF0aC5waSoqMikgKyA1KnhbMF0gLyBtYXRoLnBpIC02KV0pCiAgICAgICAgICAgIHJldHVybiBnCgogICAgICAgIGRlZiBldmFsaCh4KToKICAgICAgICAgICAgaCA9IGFycmF5KFtbMiooLTUuMSp4WzBdIC8gKDIqbWF0aC5waSoqMikgKyA1L21hdGgucGkpKioyIC01LjEqKHhbMV0gLSA1LjEqeFswXSoqMiAvICg0Km1hdGgucGkqKjIpICsgNSp4WzBdIC8gbWF0aC5waSAtNikgLyBtYXRoLnBpKioyLDIqKC01LjEqeFswXSAvICgyKm1hdGgucGkqKjIpICsgNS9tYXRoLnBpKV0sWzIqKC01LjEqeFswXSAvICgyKm1hdGgucGkqKjIpICsgNS9tYXRoLnBpKSwyXV0pCiAgICAgICAgICAgIHJldHVybiBoCgogICAgZWxpZiBwcm9ibGVtID09IDU6CiAgICAgICAgbiA9IDIKICAgICAgICB4ID0gYXJyYXkoWy0xLiwtMjIuXSkKICAgICAgICBsID0gLTMyLjc2OCAqIG9uZXMobikKICAgICAgICB1ID0gMzIuNzY4ICogb25lcyhuKQoKICAgICAgICBkZWYgZXZhbGYxKHgpOgogICAgICAgICAgICBmMSA9IDAKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCxuKToKICAgICAgICAgICAgICAgIGYxICs9IHhbaV0qKjIKICAgICAgICAgICAgZjEgPSAtMC4yICogc3FydChmMS9uKQogICAgICAgICAgICByZXR1cm4gZjEKCiAgICAgICAgZGVmIGV2YWxnMSh4KToKICAgICAgICAgICAgZzEgPSB6ZXJvcyhuKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLG4pOgogICAgICAgICAgICAgICAgZzFbaV0gPSAwLjA0ICogeFtpXSAvIChuICogZXZhbGYxKHgpKQogICAgICAgICAgICByZXR1cm4gZzEKCiAgICAgICAgZGVmIGV2YWxmMih4KToKICAgICAgICAgICAgZjIgPSAwCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsbik6CiAgICAgICAgICAgICAgICBmMiArPSBtYXRoLmNvcygyICogbWF0aC5waSAqIHhbaV0pCiAgICAgICAgICAgIGYyID0gZjIvbgogICAgICAgICAgICByZXR1cm4gZjIKCiAgICAgICAgZGVmIGV2YWxnMih4KToKICAgICAgICAgICAgZzIgPSB6ZXJvcyhuKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLG4pOgogICAgICAgICAgICAgICAgZzJbaV0gPSAtMiAqIG1hdGgucGkgKiBtYXRoLnNpbigyICogbWF0aC5waSAqIHhbaV0pIC8gbgogICAgICAgICAgICByZXR1cm4gZzIgCgogICAgICAgIGRlZiBldmFsZih4KToKICAgICAgICAgICAgZiA9IC0yMCAqIG1hdGguZXhwKGV2YWxmMSh4KSkgLSBtYXRoLmV4cChldmFsZjIoeCkpICsgMjAgKyBlCiAgICAgICAgICAgIHJldHVybiBmCgogICAgICAgIGRlZiBldmFsZyh4KToKICAgICAgICAgICAgZyA9IC0yMCAqIG1hdGguZXhwKGV2YWxmMSh4KSkgKiBldmFsZzEoeCkgLSBtYXRoLmV4cChldmFsZjIoeCkpICogZXZhbGcyKHgpCiAgICAgICAgICAgIHJldHVybiBnCgogICAgZWxzZToKICAgICAgICBwcmludCAnRXJyb3IhJwogICAgICAgIHJldHVybiAwCgogICAgeGkgPSAxZS00CiAgICByaG8gPSAwLjUKICAgIGVwc2lsb24gPSBuICogMWUtNgogICAgayA9IDAKICAgIGZfbnVtID0gMAoKICAgIHdoaWxlIFRydWU6CiAgICAgICAgaWYgayA+PSAyMDAwMDA6CiAgICAgICAgICAgIHByaW50ICdrID0nLGssJ1xu6Kix5a655pyA5aSn5Y+N5b6p5Zue5pWw44KS6LaF44GI44G+44GX44GfLicKICAgICAgICAgICAgcmV0dXJuIDAKCgogICAgICAgIGlmIG1ldGhvZCA9PSAxOgogICAgICAgICAgICBnID0gZXZhbGcoeCkKICAgICAgICAgICAgaWYgbGluYWxnLm5vcm0oZykgPD0gZXBzaWxvbjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGQgPSAtIGcKCiAgICAgICAgZWxpZiBtZXRob2QgPT0gMjoKICAgICAgICAgICAgZyA9IGV2YWxnKHgpCiAgICAgICAgICAgIGlmIGxpbmFsZy5ub3JtKGcpIDw9IGVwc2lsb246CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB0YXUgPSAwCiAgICAgICAgICAgIEIgPSBldmFsaCh4KQogICAgICAgICAgICBJID0gaWRlbnRpdHkobikKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBMID0gbGluYWxnLmNob19mYWN0b3IoQiArIHRhdSAqIEkpCiAgICAgICAgICAgICAgICAgICAgZCA9IGxpbmFsZy5jaG9fc29sdmUoTCwtZykKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgIGlmIHRhdSA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICB0YXUgPSAyCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdGF1ID0gdGF1ICogMgoKICAgICAgICBlbGlmIG1ldGhvZCA9PSAzOgogICAgICAgICAgICBzID0gMQogICAgICAgICAgICBkID0gZm1heChsLGZtaW4oeCAtIHMgKiBldmFsZyh4KSx1KSkgLSB4CiAgICAgICAgICAgIGlmIGxpbmFsZy5ub3JtKGQpIDw9IGVwc2lsb246CiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCAnRXJyb3IhJwogICAgICAgICAgICByZXR1cm4gMAoKICAgICAgICB0ID0gMQogICAgICAgIGYgPSBldmFsZih4KQogICAgICAgIGZfbnVtID0gZl9udW0gKyAxCiAgICAgICAgZGcgPSBpbm5lcihkLGV2YWxnKHgpKQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGZfc3RlcCA9IGV2YWxmKHggKyB0ICogZCkKICAgICAgICAgICAgZl9udW0gPSBmX251bSArIDEKICAgICAgICAgICAgaWYgZl9zdGVwIDw9IGYgKyB4aSAqIHQgKiBkZzoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIHNlYXJjaCA9PSAxOgogICAgICAgICAgICAgICAgdCA9IHJobyAqIHQKICAgICAgICAgICAgZWxpZiBzZWFyY2ggPT0gMjoKICAgICAgICAgICAgICAgIHRfcHJldiA9IHQKICAgICAgICAgICAgICAgIHQgPSAtIGRnICogdCoqMiAvICgyICogKGZfc3RlcCAtIGYgLSBkZyAqIHQpKQogICAgICAgICAgICAgICAgaWYgdCA8IDAuMSAqIHRfcHJldiBvciB0ID4gMC45ICogdF9wcmV2OgogICAgICAgICAgICAgICAgICAgIHQgPSB0X3ByZXYgLyAyLjAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50ICdFcnJvciEnCiAgICAgICAgICAgICAgICByZXR1cm4gMAoKICAgICAgICBpZiBtZXRob2QgPT0gMzoKICAgICAgICAgICAgaWYgdCAqIG1heChhYnMoZCkpIDw9IDFlLTE2ICogbWF4KDEsbWF4KGFicyh4KSkpOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgeCA9IHggKyB0ICogZAogICAgICAgIGsgPSBrICsgMQogICAgICAgIHByaW50ICdnID0nLGxpbmFsZy5ub3JtKGV2YWxnKHgpKSwgJ1xueCA9Jyx4CiAgICBwcmludCAnZiA9JyxldmFsZih4KSwnXG54ID0nLHgsJ1xuayA9JyxrLCdcbuipleS+oeWbnuaVsCA9JyxmX251bQppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOiBtYWluKCk=