# -*- coding: utf-8 -*- """ Created on Sat Oct 8 20:52:32 2022 @author: Roman """ import random def f(x): return x[0] ** 2 + x[1] ** 2 + x[2] ** 2 def skr(x1, x2): xnew1 = [] xnew2 = [] for i in range(len(x1)): if i % 2: xnew1.append(x1[i]) xnew2.append(x2[i]) else: xnew2.append(x1[i]) xnew1.append(x2[i]) return [ xnew1, xnew2 ] def mut(x_old, t, tmax, xmin, xmax): x_new = [] for xi, xmin_i, xmax_i in zip(x_old, xmin, xmax): result = xi + (1 - t/tmax) * random.uniform(-xi, xi) result = xmax_i if result > xmax_i else result result = xmax_i if result < xmax_i else result x_new.append(result) return x_new def genetic(N, s, m, xmin, xmax, tmax): x = [] #Начальная генерация for i in range(N): x.append([]) for j in range(len(xmax)): x[i].append(random.uniform(xmin[j], xmax[j])) t = 0 while t < tmax: #скрещивание for i in range(s): a = random.randint(0, len(x) - 1) b = random.randint(0, len(x) - 1) while a == b: b = random.randint(0, len(x) - 1) for xi in skr(x[a], x[b]): x.append(xi) #мутация for i in range(m): a = random.randint(0, len(x) - 1) x.append(mut(x[a], t, tmax, xmax, xmin)) #селекция x = sorted(x, key=f) x = x[:N] print(x[0], f(x[0])) t += 1 return x[0] x = genetic(100, 10, 10, [-5, -5, -5], [5, 5, 5], 100)