# функция качества хромосомы
def qZ(x, y):
return (x + 3 * y) / (3 * x ** 2 + y ** 2 + 1)
# сумма качества хромосом
def qSumZ(Z):
return sum(Z)
# схема обмена генами
def exchangeScheme(oldX, oldY, sortedId):
X = [0 for i in range(4)]
Y = [0 for i in range(4)]
X[2] = oldX[sortedId[2]]
X[3] = oldX[sortedId[2]]
X[0] = oldX[sortedId[0]]
X[1] = oldX[sortedId[1]]
Y[0] = oldY[sortedId[2]]
Y[1] = oldY[sortedId[2]]
Y[2] = oldY[sortedId[0]]
Y[3] = oldY[sortedId[1]]
return X, Y
# сортировка по качеству
def sorting(Z):
sortedId = sorted(range(len(Z)), key=lambda k: Z[k])
return sortedId
# шаг эволюции
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
# 4 шага эволюции
def evoSteps(X, Y, stepsNum=4):
results = []
for i in range(stepsNum):
arrZ = [qZ(x, Y[i]) for i, x in enumerate(X)]
X, Y, Z = evoStep(X, Y, arrZ)
X, Y = exchangeScheme(X, Y, sorting(Z))
results.append([X, Y, qSumZ(arrZ), arrZ])
return X, Y, results
# начальные данные варианта 4
X = [-1, 0, 2, 4]
Y = [-2, 1, -1, 0]
results = evoSteps(X, Y)
for i in range(len(results[2])):
print(f"max_{i + 1}_step: {results[2][i][2]}")
qualityArrZ = []
for i in range(len(results[2])):
qualityArrZ += results[2][i][3]
print(f"max z: {max(qualityArrZ)}")