イタチプログラムを改善する


以前の投稿で改良したイタチプログラムについて投稿した.

今回は、同様に0.5秒の休止期間を設けてはいるが進化の条件を外してみた.これは逆に永遠に収束しない様子が観察できる.

import random
import time

def mutate(parent, mutation_rate=0.05):
    """指定された突然変異率で文字列を変更する。"""
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
    return ''.join(
        (char if random.random() > mutation_rate else random.choice(alphabet))
        for char in parent
    )

def generate_initial_population(size, target):
    """初期集団を生成する関数。"""
    return [''.join(random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ ") for _ in range(len(target))) for _ in range(size)]

def calculate_fitness(individual, target):
    """文字列の適合度を計算する関数。"""
    return sum(1 for i, char in enumerate(individual) if char == target[i])

##########################################
# 2. 進化条件を外したWeasel programのコード
##########################################

def weasel_program_no_evolution(target="METHINKS IT IS LIKE A WEASEL", mutation_rate=0.05, population_size=100, max_generations=1000):
    """進化的選択を行わず、常に新規にランダムな集団を生成し続ける。"""
    # 初期集団
    population = generate_initial_population(population_size, target)

    for generation in range(1, max_generations + 1):
        # 毎世代、完全にランダムな集団を生成(選択的進化なし)
        population = generate_initial_population(population_size, target)
        best_match = max(population, key=lambda x: calculate_fitness(x, target))
        best_fitness = calculate_fitness(best_match, target)

        print(f"Generation {generation}: {best_match} (Fitness: {best_fitness})")

        # 恐らく永遠に達成しないので、success表示はしない
        # あくまでランダムなので、理論上は到達する可能性はあるが非常に低い
        time.sleep(0.5)

    return best_match

# 実行
weasel_program_no_evolution()

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です