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

+ Recent posts