Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9422c1a

Browse files
authored
Fix bug when save_best_solution=True
The bug is fixed by creating a copy of the best solution. This is by replacing the next line:```pythonbest_solution = self.population[best_match_idx, :]```By this line:```pythonbest_solution = self.population[best_match_idx, :].copy()```
1 parentc7dd751 commit9422c1a

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

‎pygad.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -661,9 +661,9 @@ def initialize_population(self, low, high):
661661
self.gene_space[gene_idx]=numpy.asarray(numpy.random.uniform(low=low,
662662
high=high,
663663
size=1),dtype=self.gene_type)[0]
664-
self.population[sol_idx,gene_idx]=self.gene_space[gene_idx]
664+
self.population[sol_idx,gene_idx]=self.gene_space[gene_idx].copy()
665665
eliftype(self.gene_space[gene_idx])in [int,float,numpy.int,numpy.int8,numpy.int16,numpy.int32,numpy.int64,numpy.uint,numpy.uint8,numpy.uint16,numpy.uint32,numpy.uint64,numpy.float,numpy.float16,numpy.float32,numpy.float64]:
666-
self.population[sol_idx,gene_idx]=self.gene_space[gene_idx]
666+
self.population[sol_idx,gene_idx]=self.gene_space[gene_idx].copy()
667667
else:
668668
# Replace all the None values with random values using the init_range_low, init_range_high, and gene_type attributes.
669669
foridx,curr_gene_spaceinenumerate(self.gene_space):
@@ -727,6 +727,7 @@ def run(self):
727727
# Appending the best solution to the best_solutions list.
728728
ifself.save_best_solutions:
729729
self.best_solutions.append(best_solution)
730+
print("AAAAAAAAA ",self.best_solutions)
730731

731732
# Selecting the best parents in the population for mating.
732733
parents=self.select_parents(fitness,num_parents=self.num_parents_mating)
@@ -809,7 +810,7 @@ def steady_state_selection(self, fitness, num_parents):
809810
# Selecting the best individuals in the current generation as parents for producing the offspring of the next generation.
810811
parents=numpy.empty((num_parents,self.population.shape[1]))
811812
forparent_numinrange(num_parents):
812-
parents[parent_num, :]=self.population[fitness_sorted[parent_num], :]
813+
parents[parent_num, :]=self.population[fitness_sorted[parent_num], :].copy()
813814
returnparents
814815

815816
defrank_selection(self,fitness,num_parents):
@@ -827,7 +828,7 @@ def rank_selection(self, fitness, num_parents):
827828
# Selecting the best individuals in the current generation as parents for producing the offspring of the next generation.
828829
parents=numpy.empty((num_parents,self.population.shape[1]))
829830
forparent_numinrange(num_parents):
830-
parents[parent_num, :]=self.population[fitness_sorted[parent_num], :]
831+
parents[parent_num, :]=self.population[fitness_sorted[parent_num], :].copy()
831832
returnparents
832833

833834
defrandom_selection(self,fitness,num_parents):
@@ -845,7 +846,7 @@ def random_selection(self, fitness, num_parents):
845846
rand_indices=numpy.random.randint(low=0.0,high=fitness.shape[0],size=num_parents)
846847

847848
forparent_numinrange(num_parents):
848-
parents[parent_num, :]=self.population[rand_indices[parent_num], :]
849+
parents[parent_num, :]=self.population[rand_indices[parent_num], :].copy()
849850
returnparents
850851

851852
deftournament_selection(self,fitness,num_parents):
@@ -863,7 +864,7 @@ def tournament_selection(self, fitness, num_parents):
863864
rand_indices=numpy.random.randint(low=0.0,high=len(fitness),size=self.K_tournament)
864865
K_fitnesses=fitness[rand_indices]
865866
selected_parent_idx=numpy.where(K_fitnesses==numpy.max(K_fitnesses))[0][0]
866-
parents[parent_num, :]=self.population[rand_indices[selected_parent_idx], :]
867+
parents[parent_num, :]=self.population[rand_indices[selected_parent_idx], :].copy()
867868
returnparents
868869

869870
defroulette_wheel_selection(self,fitness,num_parents):
@@ -897,7 +898,7 @@ def roulette_wheel_selection(self, fitness, num_parents):
897898
rand_prob=numpy.random.rand()
898899
foridxinrange(probs.shape[0]):
899900
if (rand_prob>=probs_start[idx]andrand_prob<probs_end[idx]):
900-
parents[parent_num, :]=self.population[idx, :]
901+
parents[parent_num, :]=self.population[idx, :].copy()
901902
break
902903
returnparents
903904

@@ -935,7 +936,7 @@ def stochastic_universal_selection(self, fitness, num_parents):
935936
rand_pointer=first_pointer+parent_num*pointers_distance
936937
foridxinrange(probs.shape[0]):
937938
if (rand_pointer>=probs_start[idx]andrand_pointer<probs_end[idx]):
938-
parents[parent_num, :]=self.population[idx, :]
939+
parents[parent_num, :]=self.population[idx, :].copy()
939940
break
940941
returnparents
941942

@@ -1161,7 +1162,7 @@ def mutation_by_space(self, offspring):
11611162

11621163
ifself.gene_space_nested:
11631164
# Returning the current gene space from the 'gene_space' attribute.
1164-
curr_gene_space=self.gene_space[gene_idx]
1165+
curr_gene_space=self.gene_space[gene_idx].copy()
11651166

11661167
# If the gene space has only a single value, use it as the new gene value.
11671168
iftype(curr_gene_space)in [int,float,numpy.int,numpy.int8,numpy.int16,numpy.int32,numpy.int64,numpy.uint,numpy.uint8,numpy.uint16,numpy.uint32,numpy.uint64,numpy.float,numpy.float16,numpy.float32,numpy.float64]:
@@ -1203,7 +1204,7 @@ def mutation_probs_by_space(self, offspring):
12031204
ifprobs[gene_idx]<=self.mutation_probability:
12041205
ifself.gene_space_nested:
12051206
# Returning the current gene space from the 'gene_space' attribute.
1206-
curr_gene_space=self.gene_space[gene_idx]
1207+
curr_gene_space=self.gene_space[gene_idx].copy()
12071208

12081209
# If the gene space has only a single value, use it as the new gene value.
12091210
iftype(curr_gene_space)in [int,float,numpy.int,numpy.int8,numpy.int16,numpy.int32,numpy.int64,numpy.uint,numpy.uint8,numpy.uint16,numpy.uint32,numpy.uint64,numpy.float,numpy.float16,numpy.float32,numpy.float64]:
@@ -1422,7 +1423,7 @@ def adaptive_mutation_by_space(self, offspring):
14221423

14231424
ifself.gene_space_nested:
14241425
# Returning the current gene space from the 'gene_space' attribute.
1425-
curr_gene_space=self.gene_space[gene_idx]
1426+
curr_gene_space=self.gene_space[gene_idx].copy()
14261427

14271428
# If the gene space has only a single value, use it as the new gene value.
14281429
iftype(curr_gene_space)in [int,float,numpy.int,numpy.int8,numpy.int16,numpy.int32,numpy.int64,numpy.uint,numpy.uint8,numpy.uint16,numpy.uint32,numpy.uint64,numpy.float,numpy.float16,numpy.float32,numpy.float64]:
@@ -1510,7 +1511,7 @@ def adaptive_mutation_probs_by_space(self, offspring):
15101511
ifprobs[gene_idx]<=adaptive_mutation_probability:
15111512
ifself.gene_space_nested:
15121513
# Returning the current gene space from the 'gene_space' attribute.
1513-
curr_gene_space=self.gene_space[gene_idx]
1514+
curr_gene_space=self.gene_space[gene_idx].copy()
15141515

15151516
# If the gene space has only a single value, use it as the new gene value.
15161517
iftype(curr_gene_space)in [int,float,numpy.int,numpy.int8,numpy.int16,numpy.int32,numpy.int64,numpy.uint,numpy.uint8,numpy.uint16,numpy.uint32,numpy.uint64,numpy.float,numpy.float16,numpy.float32,numpy.float64]:
@@ -1597,7 +1598,7 @@ def best_solution(self, pop_fitness=None):
15971598
# Then return the index of that solution corresponding to the best fitness.
15981599
best_match_idx=numpy.where(pop_fitness==numpy.max(pop_fitness))[0][0]
15991600

1600-
best_solution=self.population[best_match_idx, :]
1601+
best_solution=self.population[best_match_idx, :].copy()
16011602
best_solution_fitness=pop_fitness[best_match_idx]
16021603

16031604
returnbest_solution,best_solution_fitness,best_match_idx

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp