In [1]:
import scipy.optimize as csyopt
import math
import tensorflow as tf
import numpy as np
import datetime
In [2]:
#http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.641.3566&rep=rep1&type=pdf
#rosenbrock f=0 at (1,1) start = (-1.2, 1)
def rosenbrock(x):
return (10 * (x[0] - (x[1] ** 2))) ** 2 + ((1 -x[0]) ** 2)
#freudenstein and Roth function f= 0 at (5,4) start = (0.5 ,-2)
def freudenstein(x):
return (-13 + x[0] + ((5 - x[1])* x[1] - 2) * x[1]) ** 2 + (-29 +x[0]+((x[1]+1)*x[1]- 14)* x[1]) ** 2
#Powell badly scaled function f=0 at (1.098 * (10 ** -5),9.106) start = (0, 1)
def powell(x):
return (((10 ** 4)* x[0] * x[1] - 1) ** 2) + ((math.exp(-x[0]) + math.exp(-x[1]) - 1.0001) ** 2)
#brown badly scaled function [unpublished] start = (1, 1) f=0 at (10*6, 2*10 ** -6)
def brown(x):
f1 = x[0] - (10 ** 6)
f2 = x[1] - (2*10 ** -6)
f3 = x[0]*x[1] - 2
return (f1 ** 2) + (f2 ** 2) + (f3 ** 2)
#beale function start = (1, 1) f=0 at (3, 0.5)
def beale(x):
y= (1.5,2.25,2.625)
result = 0
for i in range(3):
result += (y[i] - x[0]*(1 - x[1]** (i+1))) ** 2
return result
#Jennrich and Sampson function fmin = 22.86657580612254 start = (0.3, 0.4)
def jennrich(x):
result = 0
for i in range(1,11):
result += 2 + 2* i - (math.exp(i*x[0]) + math.exp(i*x[1]))
return result
#Helical valley function start x0=(-1,0,0) f0 = (1,0,0)
def helical_valley(x):
def theta():
value = (1/(2 * math.pi)) * math.atan2(x[1],x[0])
if(x[0] < 0):
value += 0.5
return value
f1 = 10 * (x[2] - 10 * theta())
f2 = 10* ((((x[0]**2 + x[1]**2)) ** (1/2)) -1)
f3 = x[2]
return (f1 ** 2) + (f2 ** 2) + (f3 ** 2)
#bard function start in (1,1,1) min (0.8406,-inf,-inf)
def bard(x):
y = (0.14,0.18,0.33,0.25, 0.29, 0.32,0.35,0.39,0.37,0.58,0.73,0.96,1.34,2.10,4.39)
result = 0
for i in range(1,16):
v =(16- i)
u = i
w = min(u,v)
result += (y[i-1] - (x[0] + u/(v*x[1] + w*x[2] ) ) ) ** 2
return result
#Gaussian function Xo = (0.4, 1, 0) f= 1.12793 10-8
def gaussian(x):
y= (0.0009,.0044, 0.0175, 0.0540, 0.1295, 0.2420, 0.3521, 0.3989, 0.3521, 0.2420,0.1295,0.0540, 0.0175, 0.0044, 0.0009)
result = 0
for i in range(1,16):
t = (8 - i) /2
result += (x[0]* math.exp((-x[1] * (t - x[2]) ** 2 ) / 2 ) - y[i-1]) ** 2
return result
#meyer function f = 87.9458 start = (.02, 4000, 250)
def meyer(x):
y = (34780, 28610, 23650, 19630,16370, 13720,11540, 9744, 8261, 7030, 6005, 5147,4427, 3820,3307,2872)
result = 0
for i in range(1,17):
t = 45 + (5 * i)
result += (x[0] * math.exp(x[1]/(t+ x[2])) - y[i-1]) ** 2
return result
#gulf research and development function start (5, 2.5, 0.15) f= 0 at (50,25,1.5) revisar no da 0
def gulf(x):
iterations = 3
result = 0
for i in range(1,iterations + 1):
t= i/100
y= 25 + (-50* math.log(t)) ** (2/3)
result += (math.exp(-(abs(y* iterations * i * x[1]) ** x[2] )/ x[0] ) -t) ** 2
return result
#Box three-dimensional function start = (0, 10, 20) f=0 at (1,10,1),(10,1,-1) wherever (xl = x2 and x3 = 0)
def box3dimecional(x):
iterations = 4
result = 0
for i in range(1,iterations + 1):
t = .1* i
result += (math.exp(-t * x[0]) - math.exp(-t * x[1]) - x[2] * (math.exp(-t) - math.exp(-10 * t))) ** 2
return result
#powell singular function f = 0 at the origin start = (3, -1, 0, 1)
def powell_singular(x):
f1 = x[0] + 10 * x[1]
f2 = (5 ** (1/2)) * (x[2] - x[3])
f3 = (x[1] -2*x[2]) ** 2
f4 = (10 ** (1/2)) * ((x[0] - x[3]) ** 2)
return (f1 ** 2) + (f2 ** 2) + (f3 ** 2) + (f4 ** 2)
#Wood function Xo= (-3,-1,-3,-1) f = 0 at (1,1,1,1)
def wood(x):
f1 = 10 * (x[0] - (x[1]** 2))
f2 = 1 - x[0]
f3= (x[3] - (x[2]** 2)) * (90 ** (1/2))
f4 = 1- x[2]
return (f1 ** 2) + (f2 ** 2) + (f3 ** 2) + (f4 ** 2)
#kowalik and osborne funcion no funciona 1.02734 x 10 ** -3 at (10 ** 99, -14.07, -10** 99, -10** 99)
def kowalik(x):
y = (0.1957, 0.1947, 0.1735, 0.1600, 0.0844, 0.0627, 0.0456, 0.0342, 0.0323, 0.0235, 0.0246)
u = (4.0000, 2.0000, 1.0000, 0.5000, 0.2500, 0.1670, 0.1250, 0.1000, 0.0833, 0.0714, 0.0625)
result = 0
for i in range(11):
result += (y[i] - ((x[0] * ((u[i] ** 2) + (u[i] * x[1]))) / ((u[i] ** 2) + (u[i] * x[2]) + x[3] ))) ** 2
return result
In [3]:
init = datetime.datetime.now()
print(csyopt.minimize(rosenbrock , (-1.2, 1) , method = 'Nelder-Mead' ))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [4]:
init = datetime.datetime.now()
print(csyopt.minimize(freudenstein , (0.5 ,-2), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [5]:
init = datetime.datetime.now()
print(csyopt.minimize(powell , (0, 1), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [6]:
init = datetime.datetime.now()
print(csyopt.minimize(brown , (1, 1), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [7]:
init = datetime.datetime.now()
print(csyopt.minimize(beale , (1, 1), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [8]:
init = datetime.datetime.now()
#print(csyopt.minimize(jennrich , (0.3, 0.4), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [9]:
init = datetime.datetime.now()
print(csyopt.minimize(helical_valley , (-1,0,0) , method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [10]:
init = datetime.datetime.now()
print(csyopt.minimize(bard ,(1,1,1), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [11]:
init = datetime.datetime.now()
print(csyopt.minimize(gaussian ,(0.4, 1, 0), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [12]:
init = datetime.datetime.now()
print(csyopt.minimize(meyer , (.02, 4000, 250), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [13]:
init = datetime.datetime.now()
print(csyopt.minimize(gulf ,(5, 2.5, 0.15), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [14]:
init = datetime.datetime.now()
print(csyopt.minimize(box3dimecional , (0, 10, 20) , method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [15]:
init = datetime.datetime.now()
print(csyopt.minimize(powell_singular ,(3, -1, 0, 1), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [16]:
init = datetime.datetime.now()
print(csyopt.minimize(wood , (-3,-1,-3,-1), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [17]:
init = datetime.datetime.now()
print(csyopt.minimize(kowalik , (0.25, 0.39, 0.415, 0.39), method = 'Nelder-Mead'))
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [18]:
@tf.function
def tf_rosenbrock(x):
return tf.convert_to_tensor(rosenbrock(x))
@tf.function
def tf_freudenstein(x):
return freudenstein(x)
@tf.function
def tf_powell(x):
return powell(x)
@tf.function
def tf_brown(x):
return brown(x)
@tf.function
def tf_beale(x):
return beale(x)
@tf.function
def tf_jennrich(x):
return jennrich(x)
@tf.function
def tf_helical_valley(x):
return helical_valley(x)
@tf.function
def tf_bard(x):
return bard(x)
@tf.function
def tf_gaussian(x):
return gaussian(x)
@tf.function
def tf_meyer(x):
return meyer(x)
@tf.function
def tf_gulf(x):
return gulf(x)
@tf.function
def tf_box3dimecional(x):
return box3dimecional(x)
@tf.function
def tf_powell_singular(x):
return powell_singular(x)
@tf.function
def tf_wood(x):
return wood(x)
@tf.function
def tf_kowalik(x):
return kowalik(x)
In [19]:
#modo sin tensor:
class basic_nelder():
p = 1
d = 2
r = 0.5
g = 0.5
def __init__(self,x,f):
self.f = f
self.x = x
self.points = [self.evaluation(x)]
self.generate()
def evaluation(self,x):
return np.array([x,self.f(x)])
def generate(self):
x2 = self.evaluation(self.x + np.random.rand(self.x.shape[0]))
x3 = self.evaluation(self.x + np.random.rand(self.x.shape[0]))
self.points.append(x2)
self.points.append(x3)
def sorting(self):
self.points = sorted(self.points, key=lambda x: x[-1])
def create_centroide(self):
size = len(self.points) - 1
self.centroide = np.sum(self.points[:-1], axis = 0) / size
def create_xr(self):
self.xr = self.centroide + self.p * ( self.centroide - self.points[-1])
self.xr = self.evaluation(self.xr[0])
def create_xe(self):
self.xe = (1 + self.p * self.d ) * self.centroide - (self.p* self.d*self.points[-1])
self.xe = self.evaluation(self.xe[0])
def create_xce(self):
self.xce = (1 + self.p * self.r ) * self.centroide - (self.p* self.r *self.points[-1])
self.xce = self.evaluation(self.xce[0])
def create_xci(self):
self.xci = (1 - self.r ) * self.centroide + ( self.r *self.points[-1])
self.xci = self.evaluation(self.xci[0])
def iteration(self):
self.sorting()
self.create_centroide()
self.create_xr()
if self.points[0][-1] <= self.xr[-1] and self.xr[-1] < self.points[-2][-1]:
self.points.append(self.xr)
self.points = self.points[1:]
return
if self.xr[-1] <= self.points[0][-1]:
self.create_xe()
if self.xr[-1] <= self.xe[-1]:
self.points = self.points[:-1]
self.points.append(self.xr)
else:
self.points = self.points[:-1]
self.points.append(self.xe)
return
if self.points[-2][-1] <= self.xr[-1] and self.xr[-1] <= self.points[-1][-1]:
self.create_xce()
if self.xce[-1] <= self.xr[-1]:
self.points = self.points[:-1]
self.points.append(self.xce)
else:
self.contract()
return
if self.points[-1][-1] <= self.xr[-1] :
self.create_xci()
if self.xci[-1] <= self.points[-1][-1]:
self.points = self.points[:-1]
self.points.append(self.xci)
else:
self.contract()
def contract(self):
newpoints = [self.points[0]]
for xi in self.points[1:]:
point = self.points[0][0] +self.d* (xi[0] - self.points[0][0])
newpoints.append( self.evaluation (point))
self.points = newpoints
def solve(self, iterations):
for i in range(iterations):
self.iteration()
print(self.points)
In [20]:
init = datetime.datetime.now()
method = basic_nelder(np.array([-1.2, 1]) ,rosenbrock)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [21]:
init = datetime.datetime.now() #rectificar
method = basic_nelder(np.array([0.5 ,-2]) ,freudenstein)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [22]:
init = datetime.datetime.now()
method = basic_nelder(np.array([0, 1]) ,powell)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [23]:
init = datetime.datetime.now()
method = basic_nelder(np.array([1, 1]) ,brown)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [24]:
init = datetime.datetime.now()
method = basic_nelder(np.array( [1, 1]) ,beale )
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [25]:
init = datetime.datetime.now()
method = basic_nelder(np.array([0.3, 0.4]) ,jennrich )
#method.solve(100)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [26]:
init = datetime.datetime.now()
method = basic_nelder(np.array([-1,0,0]) ,helical_valley )
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [27]:
init = datetime.datetime.now()
method = basic_nelder(np.array([1,1,1]) ,bard )
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [28]:
init = datetime.datetime.now()
method = basic_nelder(np.array([0.4, 1, 0]) ,gaussian)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [29]:
init = datetime.datetime.now()
method = basic_nelder(np.array([.02, 4000, 250]) ,meyer )
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [30]:
init = datetime.datetime.now()
method = basic_nelder(np.array([5, 2.5, 0.15]) ,gulf)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [31]:
init = datetime.datetime.now()
method = basic_nelder(np.array([0, 10, 20]) ,box3dimecional)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [32]:
init = datetime.datetime.now()
method = basic_nelder(np.array([3, -1, 0, 1]) ,powell_singular)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [33]:
init = datetime.datetime.now()
method = basic_nelder(np.array([-3,-1,-3,-1]) ,wood)
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [34]:
init = datetime.datetime.now()
method = basic_nelder(np.array([0.25, 0.39, 0.415, 0.39]) ,kowalik )
method.solve(1000)
end = datetime.datetime.now()
print((end - init).total_seconds() * 1000)
In [58]:
x = tf.Variable([-1.2, 1])
f = tf_rosenbrock(x)
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op);
#la funcion solo returna los nodos del grafo que deben ser ejecutados, a la final yo los encadeno en evaluar el assign del
#valor en el que deben terminar las variables
x0 = tf.convert_to_tensor([1,1])
x1 = tf.convert_to_tensor([[2,1],[1,1]])
x2 = tf.convert_to_tensor([[3,1],[1,1]])
evaluatex0 = tf_rosenbrock(x0)
evaluatex1 = tf_rosenbrock(x1)
evaluatex2 = tf_rosenbrock(x2)
#compare = tf.reduce_min([evaluatex0,evaluatex1])
getmin = tf.equal(x1,x2)
print(tf.math.reduce_any(getmin).eval())
c = tf.constant([[8,2,9,4], [4, 3, 2, 1], [5,6,7,2]])
print(tf.segment_max(c, tf.constant([0,0,1])).eval())
print(compare.eval())
print(sess.run(evaluatex1))
print(sess.run(compare))
In [36]:
# nelder-mead con tensores
class Nelder_Mead(list):
p = 1
d = 2
r = 0.5
g = 0.5
def __init__(self,x,f):
self.f = f
self.x = x
evalx = self.evaluation(x)
self.points = [[x, evalx]]
self.evaluations = [evalx]
self.generate()
def evaluation(self,x):
return self.f(x)
def generate(self):
x2 = self.x + tf.random.uniform()
x2eval = self.evaluation(x2)
x3 = self.x + tf.random.uniform()
x3eval = self.evaluation(x3)
self.points.append([x2, x2eval])
self.points.append([x3, x3eval])
def sorting(self):
self.points = sorted(self.points, key=lambda x: x[-1])
def create_centroide(self):
size = len(self.points) - 1
self.centroide = np.sum(self.points[:-1], axis = 0) / size
def create_xr(self):
self.xr = self.centroide + self.p * ( self.centroide - self.points[-1])
self.xr = self.evaluation(self.xr[0])
def create_xe(self):
self.xe = (1 + self.p * self.d ) * self.centroide - (self.p* self.d*self.points[-1])
self.xe = self.evaluation(self.xe[0])
def create_xce(self):
self.xce = (1 + self.p * self.r ) * self.centroide - (self.p* self.r *self.points[-1])
self.xce = self.evaluation(self.xce[0])
def create_xci(self):
self.xci = (1 - self.r ) * self.centroide + ( self.r *self.points[-1])
self.xci = self.evaluation(self.xci[0])
def iteration(self):
self.sorting()
self.create_centroide()
self.create_xr()
if self.points[0][-1] <= self.xr[-1] and self.xr[-1] < self.points[-2][-1]:
self.points.append(self.xr)
self.points = self.points[1:]
return
if self.xr[-1] <= self.points[0][-1]:
self.create_xe()
if self.xr[-1] <= self.xe[-1]:
self.points = self.points[:-1]
self.points.append(self.xr)
else:
self.points = self.points[:-1]
self.points.append(self.xe)
return
if self.points[-2][-1] <= self.xr[-1] and self.xr[-1] <= self.points[-1][-1]:
self.create_xce()
if self.xce[-1] <= self.xr[-1]:
self.points = self.points[:-1]
self.points.append(self.xce)
else:
self.contract()
return
if self.points[-1][-1] <= self.xr[-1] :
self.create_xci()
if self.xci[-1] <= self.points[-1][-1]:
self.points = self.points[:-1]
self.points.append(self.xci)
else:
self.contract()
def contract(self):
newpoints = [self.points[0]]
for xi in self.points[1:]:
point = self.points[0][0] +self.d* (xi[0] - self.points[0][0])
newpoints.append( self.evaluation (point))
self.points = newpoints
def solve(self, iterations):
for i in range(iterations):
self.iteration()
print(self.points)
In [76]:
centroide([[1,2],[3,4]])
Out[76]:
In [97]:
q = [tf.convert_to_tensor([13,1,20]), tf.convert_to_tensor([2,10,10]),tf.convert_to_tensor([3,2,30])]
t =tf.argsort(q)
with tf.Session() as sess:
print(sess.run(t))
print(sess.run(b))
print(d)
In [72]:
sorted(array, key=lambda x: x[-1])
Out[72]:
In [115]:
for i in rep(1,1000):
i
In [ ]: