diff options
author | terminaldweller <thabogre@gmail.com> | 2022-01-27 17:51:54 +0000 |
---|---|---|
committer | terminaldweller <thabogre@gmail.com> | 2022-01-27 17:51:54 +0000 |
commit | 02c8661250be26dc35b71c7fa9fb0f2eb9890b44 (patch) | |
tree | 708839587fb6e16b6e37465e15259461fb0b13fe /SA.py | |
parent | update (diff) | |
download | seer-02c8661250be26dc35b71c7fa9fb0f2eb9890b44.tar.gz seer-02c8661250be26dc35b71c7fa9fb0f2eb9890b44.zip |
black and update
Diffstat (limited to 'SA.py')
-rwxr-xr-x | SA.py | 97 |
1 files changed, 97 insertions, 0 deletions
@@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +from random import seed, random +from time import time +import math + + +class X: + def __init__(self, x: float, y: float, z: float): + self.x_now = 0 + self.y_now = 0 + self.z_now = 0 + self.x_k = x + self.y_k = y + self.z_k = z + self.x_k1 = 0 + self.y_k1 = 0 + self.z_k1 = 0 + self.k = 0 + + def neighbour(self): + self.X_k_to_now() + self.x_now = self.x_now + ( + random() / 100 if random() > 0.5 else -random() / 100 + ) + self.y_now = self.y_now + ( + random() / 100 if random() > 0.5 else -random() / 100 + ) + self.z_now = self.z_now + ( + random() / 100 if random() > 0.5 else -random() / 100 + ) + self.k = self.k + 1 + + def function(self, x: float, y: float, z: float): + return ( + (x ** 5) - ((x ** 2) * y * z) + (z * x) + (y ** 2) - (z ** 3) - 10 + ) + + def X_now(self): + return self.function(self.x_now, self.y_now, self.z_now) + + def X_k(self): + return self.function(self.x_k, self.y_k, self.z_k) + + def X_k_to_now(self): + self.x_now = self.x_k + self.y_now = self.y_k + self.z_now = self.z_k + + def X_now_to_k1(self): + self.x_k1 = self.x_now + self.y_k1 = self.y_now + self.z_k1 = self.z_now + + def X_k_to_k1(self): + self.x_k1 = self.x_k + self.y_k1 = self.y_k + self.z_k1 = self.z_k + + def X_k1_to_k(self): + self.x_k = self.x_k1 + self.y_k = self.y_k1 + self.z_k = self.z_k1 + + +def SA(): + K_max = 600 + T_zero = 30 + alpha = 0.90 + alpha_step = 20 + x = X(1, 0, -1) + T = T_zero + seed(time()) + for k in range(1, K_max): + x.neighbour() + if x.X_now() <= x.X_k(): + x.X_now_to_k1() + else: + p = math.e ** ((-(x.X_now() - x.X_k())) / T) + seed(time()) + r = random() + if p >= r: + x.X_now_to_k1() + else: + x.X_k_to_k1() + if k % alpha_step == 0: + T = T * alpha + x.X_k1_to_k() + print(x.x_k, x.y_k, x.z_k) + print("k=", x.X_k()) + + +def main(): + SA() + + +if __name__ == "__main__": + main() |