DatasetLoader <-> GeneticAlgorithmEngine <-> Database Persistence */ class ScheduleGeneratorService { private DatasetLoader $datasetLoader; public function __construct() { $this->datasetLoader = new DatasetLoader(); } /** * Jalankan proses penjadwalan otomatis dan simpan hasilnya ke DB. */ public function generate( ?string $semester = null, ?string $tahunAjaran = null, ?int $populationSize = 30, ?float $crossoverRate = 0.5, ?float $mutationRate = 0.1, ?int $maxGenerations = 100, ?int $seed = null ): array { // 1. Load Dataset $dataset = $this->datasetLoader->load($semester, $tahunAjaran); // 2. Inisialisasi Engine GA $engine = new GeneticAlgorithmEngine( populationSize: $populationSize ?? 30, crossoverRate: $crossoverRate ?? 0.5, mutationRate: $mutationRate ?? 0.1, maxGenerations: $maxGenerations ?? 100, seed: $seed ); // 3. Eksekusi Engine $result = $engine->run($dataset); /** @var Chromosome $bestChromosome */ $bestChromosome = $result['bestChromosome']; // 4. Simpan/Replace Hasil ke Database (`jadwal_kelas`) $this->saveToDatabase($bestChromosome, $semester, $tahunAjaran); return [ 'bestChromosome' => $bestChromosome, 'generations' => $result['generations'], 'executionTime' => $result['executionTime'], 'memoryUsage' => $result['memoryUsage'], 'avgFitness' => $result['avgFitness'] ?? 0, 'isOptimal' => $result['isOptimal'], 'totalGenes' => count($bestChromosome->genes), 'generationLogs' => $result['generationLogs'], ]; } /** * Persistence hasil terbaik ke tabel `jadwal_kelas` */ private function saveToDatabase(Chromosome $chromosome, ?string $semester, ?string $tahunAjaran): void { // Kosongkan jadwal sebelumnya untuk periode ini JadwalKelas::truncate(); foreach ($chromosome->genes as $gene) { JadwalKelas::create([ 'kelas_id' => $gene->kelasId, 'guru_id' => $gene->guruId, 'hari' => $gene->hariId, 'hari_id' => $gene->hariId, 'sesi_id' => $gene->sesiId, 'ruangan_id' => $gene->ruanganId, 'pertemuan_ke' => $gene->indexPertemuan, 'created_at' => now(), 'updated_at' => now(), ]); } } }