Advertisement
pierdziadek

si2

Mar 16th, 2025 (edited)
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.01 KB | None | 0 0
  1. from itertools import compress
  2. import random
  3. import time
  4. import matplotlib.pyplot as plt
  5. import copy
  6.  
  7. from data import *
  8.  
  9. def initial_population(individual_size, population_size):
  10.     return [[random.choice([True, False]) for _ in range(individual_size)] for _ in range(population_size)]
  11.  
  12. def fitness(items, knapsack_max_capacity, individual):
  13.     total_weight = sum(compress(items['Weight'], individual))
  14.     if total_weight > knapsack_max_capacity:
  15.         return 0
  16.     return sum(compress(items['Value'], individual))
  17.  
  18. def population_best(items, knapsack_max_capacity, population):
  19.     best_individual = None
  20.     best_individual_fitness = -1
  21.     for individual in population:
  22.         individual_fitness = fitness(items, knapsack_max_capacity, individual)
  23.         if individual_fitness > best_individual_fitness:
  24.             best_individual = individual
  25.             best_individual_fitness = individual_fitness
  26.     return best_individual, best_individual_fitness
  27.  
  28. def smiglo(items, knapsack_max_capacity, population):
  29.   ruletka = []
  30.   szansa = 0
  31.   sum_fitness = 0
  32.   for individual2 in population:
  33.     sum_fitness += fitness(items, knapsack_max_capacity, individual2)
  34.   for individual in population:
  35.     individual_fitness = fitness(items, knapsack_max_capacity, individual)
  36.     szansa += individual_fitness/sum_fitness
  37.     ruletka.append((individual, szansa))
  38.  
  39.   wylosowana_liczba = random.random()
  40.   for individual, szansa in ruletka:
  41.         if szansa >= wylosowana_liczba:
  42.             return individual
  43.  
  44. def mutate(individual):
  45.   i = int(random.random() * len(individual))
  46.   individual[i] = not individual[i]
  47.  
  48. def crossover(pierwszy, drugi):
  49.     polowa_dlugosci = len(pierwszy) // 2
  50.  
  51.     nowy_pierwszy = pierwszy[:polowa_dlugosci] + drugi[polowa_dlugosci:]
  52.     nowy_drugi = drugi[:polowa_dlugosci] + pierwszy[polowa_dlugosci:]
  53.  
  54.     mutate(nowy_pierwszy)
  55.     mutate(nowy_drugi)
  56.  
  57.     return nowy_pierwszy, nowy_drugi
  58.  
  59.  
  60. items, knapsack_max_capacity = get_big()
  61. print(items)
  62.  
  63. population = initial_population(len(items), population_size)
  64. smiglo(items, knapsack_max_capacity, population)
  65. population_size = 100
  66. generations = 300
  67. n_selection = 20
  68. n_elite = 2
  69. start_time = time.time()
  70. best_solution = None
  71. best_fitness = 0
  72. population_history = []
  73. best_history = []
  74. population = initial_population(len(items), population_size)
  75. for _ in range(generations):
  76.     population_history.append(copy.deepcopy(population))
  77.  
  78.     # TODO: implement genetic algorithm
  79.     posortowane = sorted(population, key=lambda ind: fitness(items, knapsack_max_capacity, ind))
  80.     nowa_populacja = posortowane[::-1][:n_elite]
  81.     while population_size > len(nowa_populacja):
  82.       pierwszy = smiglo(items, knapsack_max_capacity, posortowane[::-1][:n_selection])
  83.       drugi = smiglo(items, knapsack_max_capacity, posortowane[::-1][:n_selection])
  84.       nowy_pierwszy, nowy_drugi = crossover(pierwszy, drugi)
  85.       nowa_populacja.append(nowy_pierwszy)
  86.       nowa_populacja.append(nowy_drugi)
  87.      
  88.     population = nowa_populacja
  89.     best_individual, best_individual_fitness = population_best(items, knapsack_max_capacity, population)
  90.     if best_individual_fitness > best_fitness:
  91.         best_solution = best_individual
  92.         best_fitness = best_individual_fitness
  93.     best_history.append(best_fitness)
  94.  
  95. end_time = time.time()
  96. total_time = end_time - start_time
  97. print('Best solution:', list(compress(items['Name'], best_solution)))
  98. print('Best solution value:', best_fitness)
  99. print('Time: ', total_time)
  100.  
  101. # plot generations
  102. x = []
  103. y = []
  104. top_best = 10
  105. for i, population in enumerate(population_history):
  106.     plotted_individuals = min(len(population), top_best)
  107.     x.extend([i] * plotted_individuals)
  108.     population_fitnesses = [fitness(items, knapsack_max_capacity, individual) for individual in population]
  109.     population_fitnesses.sort(reverse=True)
  110.     y.extend(population_fitnesses[:plotted_individuals])
  111. plt.scatter(x, y, marker='.')
  112. plt.plot(best_history, 'r')
  113. plt.xlabel('Generation')
  114. plt.ylabel('Fitness')
  115. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement