|
import neat
|
|
import numpy as np
|
|
import os
|
|
import logging
|
|
import pickle
|
|
import random
|
|
import math
|
|
import datetime
|
|
|
|
|
|
log_filename = f"quanta_log_{datetime.datetime.now():%Y%m%d_%H%M%S}.log"
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
|
|
handlers=[
|
|
logging.FileHandler(log_filename),
|
|
logging.StreamHandler()
|
|
]
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
logger.info("="*50)
|
|
logger.info("Quanta Simülatörü Başlatılıyor (Görselleştirme Olmadan)")
|
|
logger.info("="*50)
|
|
|
|
|
|
TARGET_PROB_0 = 0.7
|
|
TARGET_PROB_1 = 1.0 - TARGET_PROB_0
|
|
NUM_TRIALS_PER_GENOME = 100
|
|
MAX_GENERATIONS = 50
|
|
FITNESS_THRESHOLD = 0.99
|
|
|
|
logger.info(f"Hedef P(0): {TARGET_PROB_0:.2f}, Hedef P(1): {TARGET_PROB_1:.2f}")
|
|
logger.info(f"Genom Başına Deneme Sayısı: {NUM_TRIALS_PER_GENOME}")
|
|
logger.info(f"Maksimum Nesil Sayısı: {MAX_GENERATIONS}")
|
|
logger.info(f"Fitness Eşiği: {FITNESS_THRESHOLD}")
|
|
|
|
|
|
|
|
def simulate_simple_qubit_measurement(prob0=TARGET_PROB_0):
|
|
if random.random() < prob0:
|
|
return 0
|
|
else:
|
|
return 1
|
|
|
|
|
|
|
|
|
|
def eval_genomes(genomes, config):
|
|
"""
|
|
Popülasyondaki tüm genomların fitness değerlerini hesaplar.
|
|
"""
|
|
for genome_id, genome in genomes:
|
|
genome.fitness = 0.0
|
|
try:
|
|
net = neat.nn.FeedForwardNetwork.create(genome, config)
|
|
except Exception as e:
|
|
logger.error(f"Genome {genome_id} için ağ oluşturulamadı: {e}")
|
|
genome.fitness = -1.0
|
|
continue
|
|
|
|
count_0 = 0
|
|
|
|
for _ in range(NUM_TRIALS_PER_GENOME):
|
|
|
|
|
|
net_input = (1.0,)
|
|
try:
|
|
output = net.activate(net_input)
|
|
|
|
|
|
if output[0] < 0.5:
|
|
count_0 += 1
|
|
except Exception as e:
|
|
logger.warning(f"Genome {genome_id} ağ aktivasyonunda hata: {e}")
|
|
|
|
pass
|
|
|
|
|
|
observed_prob_0 = count_0 / NUM_TRIALS_PER_GENOME
|
|
|
|
|
|
|
|
|
|
error = (observed_prob_0 - TARGET_PROB_0) ** 2
|
|
|
|
|
|
|
|
fitness = max(0.0, 1.0 - math.sqrt(error))
|
|
|
|
genome.fitness = fitness
|
|
|
|
|
|
|
|
|
|
def run_neat(config_file):
|
|
"""
|
|
NEAT evrimini başlatır ve yönetir.
|
|
"""
|
|
logger.info(f"NEAT yapılandırması yükleniyor: {config_file}")
|
|
try:
|
|
config = neat.Config(neat.DefaultGenome, neat.DefaultReproduction,
|
|
neat.DefaultSpeciesSet, neat.DefaultStagnation,
|
|
config_file)
|
|
|
|
config.fitness_threshold = FITNESS_THRESHOLD
|
|
logger.info(f"Yapılandırma yüklendi. Fitness Eşiği: {config.fitness_threshold}")
|
|
|
|
except Exception as e:
|
|
logger.critical(f"Yapılandırma dosyası yüklenemedi veya geçersiz: {config_file} - Hata: {e}")
|
|
return None
|
|
|
|
logger.info("Yeni popülasyon oluşturuluyor...")
|
|
p = neat.Population(config)
|
|
|
|
|
|
p.add_reporter(neat.StdOutReporter(True))
|
|
|
|
|
|
|
|
|
|
|
|
checkpoint_prefix = 'neat-checkpoint-'
|
|
p.add_reporter(neat.Checkpointer(10, filename_prefix=checkpoint_prefix))
|
|
logger.info(f"Checkpoint dosyaları '{checkpoint_prefix}*' olarak kaydedilecek.")
|
|
|
|
logger.info(f"Evrim başlıyor (Maksimum {MAX_GENERATIONS} nesil)...")
|
|
try:
|
|
winner = p.run(eval_genomes, MAX_GENERATIONS)
|
|
logger.info(' ' + "="*20 + " Evrim Tamamlandı " + "="*20)
|
|
except Exception as e:
|
|
logger.critical(f"Evrim sırasında kritik bir hata oluştu: {e}")
|
|
|
|
return None
|
|
|
|
|
|
logger.info(f'En iyi genom bulundu:')
|
|
logger.info(f' {winner}')
|
|
|
|
|
|
winner_filename = "winner_genome.pkl"
|
|
try:
|
|
with open(winner_filename, 'wb') as f:
|
|
pickle.dump(winner, f)
|
|
logger.info(f"En iyi genom '{winner_filename}' dosyasına başarıyla kaydedildi.")
|
|
except Exception as e:
|
|
logger.error(f"En iyi genom kaydedilemedi: {e}")
|
|
|
|
|
|
logger.info(" " + "="*20 + " En İyi Genom Testi " + "="*20)
|
|
if winner:
|
|
try:
|
|
winner_net = neat.nn.FeedForwardNetwork.create(winner, config)
|
|
test_count_0 = 0
|
|
test_trials = 1000
|
|
logger.info(f"En iyi ağ {test_trials} kez test ediliyor...")
|
|
for _ in range(test_trials):
|
|
net_input = (1.0,)
|
|
output = winner_net.activate(net_input)
|
|
if output[0] < 0.5:
|
|
test_count_0 += 1
|
|
|
|
observed_prob_0 = test_count_0 / test_trials
|
|
logger.info(f"Final Test Sonucu: Gözlenen P(0) = {observed_prob_0:.4f} (Hedef: {TARGET_PROB_0:.3f})")
|
|
logger.info(f"Final Test Sonucu: Gözlenen P(1) = {1.0 - observed_prob_0:.4f} (Hedef: {TARGET_PROB_1:.3f})")
|
|
final_error = (observed_prob_0 - TARGET_PROB_0) ** 2
|
|
logger.info(f"Final Test Hatası (Karesel): {final_error:.6f}")
|
|
except Exception as e:
|
|
logger.error(f"En iyi genom test edilirken hata oluştu: {e}")
|
|
else:
|
|
logger.warning("Test edilecek bir kazanan genom bulunamadı.")
|
|
|
|
logger.info("="*50)
|
|
logger.info("Quanta Simülatörü Adım 1 (Görselleştirmesiz) tamamlandı.")
|
|
logger.info("="*50)
|
|
return winner
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
local_dir = os.path.dirname(__file__)
|
|
config_path = os.path.join(local_dir, 'config-feedforward.txt')
|
|
|
|
if not os.path.exists(config_path):
|
|
logger.critical(f"Yapılandırma dosyası bulunamadı: {config_path}")
|
|
logger.critical("Lütfen 'config-feedforward.txt' dosyasını Python betiğiyle aynı klasöre koyun.")
|
|
else:
|
|
|
|
run_neat(config_path) |