aboutsummaryrefslogtreecommitdiffstats
path: root/SA.py
diff options
context:
space:
mode:
Diffstat (limited to 'SA.py')
-rwxr-xr-xSA.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/SA.py b/SA.py
new file mode 100755
index 0000000..24b9a7f
--- /dev/null
+++ b/SA.py
@@ -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()