-
Notifications
You must be signed in to change notification settings - Fork 418
генетический алгоритм!!!!! #26
Description
import math
def qZ(x, y):
return (x + 3 * y) / (x ** 2 + y ** 2 + 1)
def qSumZ(Z):
return sum(Z)
def sorting(Z):
sorId = sorted(range(len(Z)), key=lambda k: Z[k])
return sorId
def exchangeScheme(oldX, oldY, sorId):
X = [0 for i in range(4)]
Y = [0 for i in range(4)]
X[2] = oldX[sorId[2]]
X[3] = oldX[sorId[2]]
X[0] = oldX[sorId[0]]
X[1] = oldX[sorId[1]]
Y[0] = oldY[sorId[2]]
Y[1] = oldY[sorId[2]]
Y[2] = oldY[sorId[0]]
Y[3] = oldY[sorId[1]]
return X, Y
def evoStep(X, Y, Z):
_, minId = min((value, id) for (id, value) in enumerate(Z))
X = X[:]
Y = Y[:]
Z = Z[:]
X.pop(minId)
Y.pop(minId)
Z.pop(minId)
return X, Y, Z
def evoSteps(X, Y, stepsNum=4):
results = []
for i in range(stepsNum):
arrZ = [qZ(val, Y[j]) for j, val in enumerate(X)]
X_new, Y_new, Z_new = evoStep(X, Y, arrZ)
X, Y = exchangeScheme(X_new, Y_new, sorting(Z_new))
results.append([X, Y, qSumZ(arrZ), arrZ])
return X, Y, results
X = [-5, -3, -2, -1]
Y = [-1, -2, 0, 1]
finalX, finalY, results = evoSteps(X, Y)
for i in range(len(results)):
print(f'max_{i + 1}_step: {max(results[i][3]):.4f}')
qualityArrZ = []
for i in range(len(results)):
qualityArrZ += results[i][3]
print(f'max Z: {max(qualityArrZ):.4f}')