import random
import string
#비밀번호 생성
def generation_pass(length):
password = []
password.extend(random.sample(string.digits, k = length))
return password
#1세대 생성
def test_generation(count):
parent_generation = [0]*count
global length
for i in range(count):
length = random.randint(3, 6)
password = ''.join(random.sample(string.digits, k = length))
parent_generation[i] = password
return parent_generation
#적합도 함수
def fitness(target, parent_generation):
score = [0]*count
#print('1세대:', parent_generation)
for i in range(len(parent_generation)):
if len(target) == len(parent_generation[i]):
#리스트 길이가 같으면 기본점수 2점
score[i] = int(score[i]) + 2
#리스트 길이가 같은 애들에 대하여
for j in range(len(target)):
if target[j] == parent_generation[i][j]:
score[i] = int(score[i]) + 7
else:
for k in range(len(target)):
if target[j] == parent_generation[i][k]:
score[i] = int(score[i]) + 4
else:
score
return score
#고득점 후보 골라내기
def high_score(score, parent_generation):
High = []
for i in range(len(score)):
if score[i] == max(score):
High.append(parent_generation[i])
return High
#부모세대 선택_룰렛휠
def select_survivors(fitness, sum_fit, parent_generation):
selected_generation = []
probability = [0]*count
for i in range(count):
probability[i] = round(fitness[i] + 0.1 / sum_fit, 3)
#생존확률이 높은 유전자를 살린다
for i in range(count):
x = random.uniform(0, 0.1)
if probability[i] >= x:
selected_generation.append(parent_generation[i])
#운이 좋은 유전자를 20개 살린다
lucky_survivors = random.sample(parent_generation, k = 10)
for I in lucky_survivors:
selected_generation.append(I)
random.shuffle(selected_generation)
return selected_generation
#살아남은 아이들로 다음세대 만들기
def selected_generation(surv_generation, parent_generation):
child_generation = []
#살아남은 아이들끼리 세번째 원소를 교환한다
for i in range(0, len(surv_generation)-1):
changed = surv_generation[i]
child_generation.append(changed.replace(surv_generation[i][2], surv_generation[i+1][2]))
while len(child_generation) < len(parent_generation):
#1세대에서 임의로 불러와서 부족한 수를 채운다
child_generation.append(test_generation(count)[random.randint(0, count-1)])
random.shuffle(child_generation)
return child_generation
#성능 향상을 위한 돌연변이 생성
def mutation(child_generation):
new_generation = []
for i in range(len(child_generation)):
change = child_generation[i]
if random.random() * 100 < 10:
new_generation.append(change.replace(child_generation[i][0], chr(random.randint(0, 9))))
return new_generation
generation = 100
count = 300
target = '1234'
print('비밀번호:', target)
for g in range(generation):
gene_set = test_generation(count)
Fitness = fitness(target, gene_set)
Selected = select_survivors(Fitness, sum(Fitness), gene_set)
Next_generation = selected_generation(Selected, gene_set)
New_generation = mutation(Next_generation)
High_score = high_score(Fitness, gene_set)
for i in range(len(High_score)):
if High_score[i] == target:
print('정답:', High_score[i])
break
print('%s세대-----------------------------------------' %(g+1))
print('정답 후보 유전자:', High_score)
print('최대 적합도:', max(Fitness))
print('적합도 총합:', sum(Fitness))
print('')
지금 보면 변수 이름도 너무 길고 줄바꿈도 빽빽해서 눈에 하나도 안 들어오는 최악의 코드인데
코드 짤때 너무 재밌었다
내가 좋아하는 내 코드ㅋㅋㅋ
다시 리메이크 꼭 해봐야지
'Coding > Python' 카테고리의 다른 글
google-generativeai 언어모델 실습(퀴즈 생성) (0) | 2024.07.15 |
---|