MDAF/tests/SimmulatedAnnealing.py
2021-09-11 16:53:22 -04:00

85 lines
2.1 KiB
Python

import math as m
import numpy as np
from numpy import random as r
import time
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import copy as cp
#def func(Sc):
# x1 = Sc[0]
# x2 = Sc[1]
# return m.sqrt(x1**2+x2**2)
def tweak(St,p,sigma,high,low):
for i in range(len(St)):
if p > r.random():
while True:
n = r.normal(loc=0, scale=sigma)
if (high > St[i]+n) and (low < St[i]+n):
St[i]+=n
break
return St
def Quality(Sc,objective,func):
func_output = func(Sc)
if type(func_output) == list:
error = [func_output[i]-objective[i] for i in range(len(func_output))]
else:
error = func_output - objective
print("Error is: "+str(error))
return 1/abs(error)
def main(func, S, args):
r.seed(int(time.time()))
route = list()
#Parsing arguments
y = args["objs"]
t = args["t"]
p = args["p"]
high = 20
low = -20
Best = list()
Best[:] = cp.deepcopy(S)
sigma = 0.1
route.append(Best[:])
while True:
#print('\n\n\n')
R = tweak(cp.deepcopy(S),p,sigma,high, low)
print(R)
print(S)
Qr = Quality(R,y,func)
Qs = Quality(S,y,func)
try:
P = m.e**((Qr-Qs)/t)
except:
pass
print('QUALITY_R///{}'.format(Qr))
print('QUALITY_S///{}'.format(Qs))
print('fraction is:{}'.format(P))
if (Qr > Qs) or (r.random() < P):
print('NEW_S')
S[:] = R[:]
if t > 0.01:
t-= t/10
print('t = {}'.format(t))
if (Quality(S,y,func) > Quality(Best,y,func)):
print('new Best****:{}'.format(Best))
Best[:] = S[:]
route.append(Best[:])
print(route)
if t < 0 or Quality(Best,y,func) > 50:
break
#print('the Best Quality obtained was:{}'.format(Quality(Best,y)))
print("Final Quality is: {}".format(Quality(Best,y,func)))
print("final Temperature is: {}".format(t))
return Quality(Best,y,func)