Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import random
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits import mplot3d
- from random import uniform
- #a=[-5,5]
- #a=[-5.12,5.12]
- a=[-10,10]
- def f1(x):
- return (x[0] - 3) ** 2 + (x[1] + 1) ** 2
- def f2(x):
- return (1 - x[0]) ** 2 + 100 * (x[1] - x[0] ** 2) ** 2
- def f3(x):
- return (20 + (x[0] ** 2 - 10 * np.cos(2 * 3.14 * x[0])) + (x[1] ** 2 - 10 * np.cos(2 * 3.14 * x[1])))
- def f4(x):
- return (-abs(np.sin(x[0]) * np.cos(x[1]) * np.e**(abs(1 - (np.sqrt((x[0] ** 2) + (x[1] ** 2)) / 3.14)))))
- def TS(f,x0,delta_x,N,eps,L):
- i=0
- t=[]
- x=x0
- v=f(x0)
- r=x
- while True:
- i=i+1
- x1 = x[0]
- x2 = x[1]
- dx1 = delta_x[0]
- dx2 = delta_x[1]
- omega=[]
- okolina=[[x1+dx1, x2+dx2],[x1+dx1, x2],[x1+dx1, x2-dx2],[x1, x2-dx2],[x1-dx1, x2-dx2],[x1-dx1, x2],[x1-dx1, x2+dx2],[x1, x2+dx2]]
- for j in okolina:
- if j[0]<a[0]:
- j[0]=a[0]
- elif j[0]>a[1]:
- j[0]=a[1]
- if j[1]<a[0]:
- j[1]=a[0]
- elif j[1]>a[1]:
- j[1]=a[1]
- for k in okolina:
- if k in t:
- continue
- else:
- if not omega:
- omega.append(k)
- elif f(k)<f(omega[0]):
- omega[0]=k
- if not omega:
- omega.append(okolina[0])
- else:
- x=omega[0]
- if(len(t)>L):
- t=t[1:]
- t.append(x)
- if i>N or np.abs(f(x)-f(r))<eps:
- break
- if f(x)<f(r):
- r=x
- return r,f(r)
- def LS(f, x0, delta_x, N, eps):
- x=x0
- i=0
- for i in range(N):
- v=f(x)
- x1 = x[0]
- x2 = x[1]
- dx1 = delta_x[0]
- dx2 = delta_x[1]
- omega=[]
- okolina=[[x1+dx1, x2+dx2],[x1+dx1, x2],[x1+dx1, x2-dx2],[x1, x2-dx2],[x1-dx1, x2-dx2],[x1-dx1, x2],[x1-dx1, x2+dx2],[x1, x2+dx2]]
- for j in range(0,len(okolina)):
- xpom = okolina[j]
- if (xpom[0]<a[0]):
- xpom[0]=a[0]
- if (xpom[0]>a[1]):
- xpom[0]=a[1]
- if (xpom[1]<a[0]):
- xpom[1]=a[0]
- if (xpom[1]>a[1]):
- xpom[1]=a[1]
- vpom = f(xpom)
- if (vpom < v):
- omega.append(xpom)
- if (omega==[]):
- return (x, f(x))
- else:
- mini=f(omega[0])
- for k in range(0,len(omega)):
- if (f(omega[k])<=mini):
- x=omega[k]
- mini=f(x)
- if abs(f(x) - f(xpom)) < eps:
- break;
- return (x, f(x))
- def ILS(f,x0,delta_x,N,eps):
- br=0
- memorija=[]
- x = LS(f, x0, delta_x,N, eps)
- memorija.append(x0)
- while br<N:
- x1=LS(f, Perturbacija(x,memorija),delta_x,N, eps)
- d = abs(x1[1] - x[1])
- if ((x1[1] < x[1]) and (x1[0] not in memorija)):
- x = x1
- memorija = AzuriranjeMemorije(x, x1, memorija)
- if (d >= eps):
- br=br+1
- else:
- return (x[0], x[1])
- return (x[0], x[1])
- def Perturbacija(x,memorija):
- tacka = [uniform(a[0],a[1]),uniform(a[0],a[1])]
- if ((tacka in memorija) or (tacka == x[0])):
- tacka = Perturbacija(x, memorija)
- memorija.append(tacka)
- return tacka
- def AzuriranjeMemorije(xpom,xrand,memorija):
- if (xpom[0] not in memorija):
- memorija.append(xpom[0])
- if (xrand[0] not in memorija):
- memorija.append(xrand[0])
- return memorija
- primjer=TS(f4, [3, 3],[0.1, 0.1], 10000, 0, 1000)
- print(primjer)
- novi=[]
- novi.append(primjer[0])
- drugi = ILS(f4, [3, 3],[0.1, 0.1],10000, 0)
- print("ILS: ",drugi)
- novi.append(drugi[0])
- a=novi[0] #tacka dobijena funkcijom TS
- b=novi[1] #tacka dobijena funkcijom ILS
- x1=np.linspace(-10,10,100)
- x2=np.linspace(-10,10,100)
- X1,X2=np.meshgrid(x1,x2)
- X=[X1,X2]
- Y=f4(X)
- fig=plt.figure()
- ax=plt.axes(projection='3d')
- ax.contour(X1,X2,Y,50,cmap='binary')
- ax.scatter(a[0],a[1],f4(a), color='blue',marker='x')
- ax.scatter(b[0],b[1],f4(b), color='green',marker='x')
- MIN=[3,-1]
- MIN2=[1,1]
- #ax.scatter(1,1,f2(MIN2),color='red',marker='o') #ekstremi za drugu funkciju
- #ax.scatter(3,-1,f1(MIN),color='red',marker='o') #ekstremi za prvu funkciju
- ax.set_xlabel('$x_1$')
- ax.set_ylabel('$x_2$')
- ax.set_zlabel('$f(x_1,x_2)$')
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement