def runGA():
    myWorld = World([
        [0, 0, 0, 0, 1, 0, 1, 3, 1],
        [1, 0, 1, 1, 1, 0, 2, 3, 1],
        [1, 0, 0, 1, 3, 3, 3, 3, 1],
        [3, 3, 3, 1, 3, 1, 1, 0, 1],
        [3, 1, 3, 3, 3, 1, 1, 0, 0],
        [3, 3, 1, 1, 1, 1, 0, 1, 1],
        [1, 3, 0, 1, 3, 3, 3, 3, 3],
        [0, 3, 1, 1, 3, 1, 0, 1, 3],
        [1, 3, 3, 3, 3, 1, 1, 1, 4],
    ])

    ga = GA(20, 0.05, 0.9, 2, 10)
    population = ga.initPopulation(128)
    ga.evalPopulation(population, myWorld)

    # Keep track of current generation
    generation = 1
    while ga.isTerminationConditionMet(generation, maxGenerations) == False:
        # Print fittest individual from population
        fittest = population.getFittest(0)

        print("G" + str(generation) + " Best solution (" +
              str(fittest.getFitness()) + "): " + fittest.toString())

        # Apply crossover
        population = ga.crossoverPopulation(population)

        # Apply mutation
        population = ga.mutatePopulation(population)

        # Evaluate population
        ga.evalPopulation(population, myWorld)

        # Increment the current generation
        generation += 1
    print("Stopped after " + str(maxGenerations) + " generations.")
    fittest = population.getFittest(0)
    print("Best solution (" + str(fittest.getFitness()) + "): " +
          fittest.toString())