Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- from sympy import *
- import sympy as sym
- from sympy.abc import *
- x, y, r = sym.symbols('x y r')
- def nelder_mead(func):
- alpha = 1
- beta = 0.5
- gamma = 2
- i = 3000
- v1 = (0, 1)
- v2 = (1, 0)
- v3 = (1, 1)
- for i in range(i):
- a = func.subs({x: v1[0], y: v1[1]})
- b = func.subs({x: v2[0], y: v2[1]})
- c = func.subs({x: v3[0], y: v3[1]})
- adict = {v1: a, v2: b, v3: c}
- points = sorted(adict.items(), key=lambda p: p[0])
- b = points[0][0]
- g = points[1][0]
- w = points[2][0]
- mid = ((g[0] + b[0]) / 2, (g[1] + b[1]) / 2)
- # отражение
- xr = (mid[0] + alpha * (mid[0] - w[0]), mid[1] + alpha * (mid[1] - w[1]))
- if func.subs({x: xr[0], y: xr[1]}) < func.subs({x: g[0], y: g[1]}):
- w = xr
- else:
- if func.subs({x: xr[0], y: xr[1]}) < func.subs({x: w[0], y: w[1]}):
- w = xr
- c = ((w[0] + mid[0]) / 2, (w[1] + mid[1]) / 2)
- if func.subs({x: b[0], y: b[1]}) < func.subs({x: w[0], y: w[1]}):
- w = c
- if func.subs({x: xr[0], y: xr[1]}) < func.subs({x: b[0], y: b[1]}):
- # растяжение
- xe = (mid[0] + gamma * (xr[0] - mid[0]), mid[1] + gamma * (xr[1] - mid[1]))
- if func.subs({x: xe[0], y: xe[1]}) < func.subs({x: xr[0], y: xr[1]}):
- w = xe
- else:
- w = xr
- if func.subs({x: xr[0], y: xr[1]}) > func.subs({x: g[0], y: g[1]}):
- # сжатие
- xc = (mid[0] + beta * (w[0] - mid[0]), mid[1] + beta * (w[1] - mid[1]))
- if func.subs({x: xc[0], y: xc[1]}) < func.subs({x: w[0], y: w[1]}):
- w = xc
- # переобозначим точки: b = best, g = good, w = worst — соответственно.
- v1 = w
- v2 = g
- v3 = b
- if math.sqrt((((func.subs({x: g[0], y: g[1]}) - func.subs({x: mid[0], y: mid[1]})) ** 2) / 3)) > 10 ** (-10):
- continue
- return b
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement