import numpy as np
import matplotlib.pyplot as plt

# Definicija sistema nelinearnih jednačina
def system_equations(x, y):
    eq1 = x**2 + y**2 - 25
    eq2 = x*y - 9
    return eq1, eq2

# Genetski algoritam
def genetic_algorithm(population_size, generations):
    # Inicijalizacija populacije
    population = np.random.uniform(low=-5, high=5, size=(population_size, 2))

    for generation in range(generations):
        # Evaluacija prilagođenosti
        fitness = np.sum(np.abs(np.array(system_equations(population[:, 0], population[:, 1]))), axis=0)

        # Selekcija roditelja
        selected_indices = np.argsort(fitness)[:population_size//2]
        parents = population[selected_indices]

        # Ukrštanje (jednostavno u sredini)
        crossover_point = parents.shape[0] // 2
        children = np.vstack((parents[:crossover_point], parents[crossover_point:][::-1]))

        # Mutacija (dodavanje male slučajne vrednosti)
        mutation_rate = 0.1
        mutation = np.random.uniform(low=-0.1, high=0.1, size=children.shape)
        children += mutation

        # Zamena starih jedinki novim
        population[selected_indices] = children

    # Prikaz rezultata
    best_solution_index = np.argmin(fitness)
    best_solution = population[best_solution_index]
    return tuple(best_solution)

# Pokretanje genetskog algoritma
best_solution_genetic = genetic_algorithm(population_size=50, generations=100)

# Prikaz rezultata
print("Genetski algoritam rešenje:", best_solution_genetic)
print("Vrednosti sistema:", system_equations(*best_solution_genetic))



