Загрузка данных


# функция качества хромосомы
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)}")