Berevolusi lewat Selection, Crossover, Mutasi/Repair -> Gen 1 Mencapai Fitness 1.0000 (Optimal Goal Achieved & Engine Stops!) */ public function generateSimulationData(): array { // 1. Data Master Sampel 10 Kelas $kelas = [ [ 'id' => 1, 'nama' => 'KD26 - Basic 1 (Robotics)', 'tipe' => 'Reguler', 'guru_status' => '[Diacak oleh GA (Lvl >= 1)]', 'ruang_info' => '[Diacak oleh GA (R1/R2/R3)]', 'status_jadwal' => '[Diacak oleh GA (H1-H5, S1-S4)]', 'level' => 1, 'freq' => '1x/minggu' ], [ 'id' => 2, 'nama' => 'PO1 - Scratch Beginner', 'tipe' => 'Reguler', 'guru_status' => '[Diacak oleh GA (Lvl >= 1)]', 'ruang_info' => '[Diacak oleh GA (R1/R2/R3)]', 'status_jadwal' => '[Diacak oleh GA (H1-H5, S1-S4)]', 'level' => 1, 'freq' => '1x/minggu' ], [ 'id' => 3, 'nama' => 'B26 (R1) - Basic 1 (Coding)', 'tipe' => 'Reguler', 'guru_status' => '[Diacak oleh GA (Lvl >= 2)]', 'ruang_info' => '[Diacak oleh GA (R1/R2/R3)]', 'status_jadwal' => '[Diacak oleh GA (H1-H5, S1-S4)]', 'level' => 2, 'freq' => '2x/minggu (Pertemuan 1)' ], [ 'id' => 4, 'nama' => 'B26 (R2) - Basic 1 (Coding)', 'tipe' => 'Reguler', 'guru_status' => '[Diacak oleh GA (Lvl >= 2)]', 'ruang_info' => '[Diacak oleh GA (R1/R2/R3)]', 'status_jadwal' => '[Diacak oleh GA (H1-H5, S1-S4)]', 'level' => 2, 'freq' => '2x/minggu (Pertemuan 2)' ], [ 'id' => 5, 'nama' => 'Ekskul SD Bintang Harapan', 'tipe' => 'Ekstrakurikuler', 'guru_status' => '[Diacak oleh GA (Lvl >= 1)]', 'ruang_info' => 'SD Bintang Harapan (R4 - FIX)', 'status_jadwal' => 'FIX: Jumat Sesi 1 (08:00-10:00)', 'level' => 1, 'freq' => '1x/minggu' ], [ 'id' => 6, 'nama' => 'A28 - Beginner 1 (Python)', 'tipe' => 'Reguler', 'guru_status' => '[Diacak oleh GA (Lvl >= 3)]', 'ruang_info' => '[Diacak oleh GA (R1/R2/R3)]', 'status_jadwal' => '[Diacak oleh GA (H1-H5, S1-S4)]', 'level' => 3, 'freq' => '1x/minggu' ], [ 'id' => 7, 'nama' => 'Ekskul TK Namira Probolinggo', 'tipe' => 'Ekstrakurikuler', 'guru_status' => '[Diacak oleh GA (Lvl >= 1)]', 'ruang_info' => 'TK Namira (R5 - FIX)', 'status_jadwal' => 'FIX: Selasa Sesi 1 (08:00-10:00)', 'level' => 1, 'freq' => '1x/minggu' ], [ 'id' => 8, 'nama' => 'E26 (R1) - Beginner 4 (Arduino)', 'tipe' => 'Reguler', 'guru_status' => '[Diacak oleh GA (Lvl >= 4)]', 'ruang_info' => '[Diacak oleh GA (R1/R2/R3)]', 'status_jadwal' => '[Diacak oleh GA (H1-H5, S1-S4)]', 'level' => 4, 'freq' => '2x/minggu (Pertemuan 1)' ], [ 'id' => 9, 'nama' => 'E26 (R2) - Beginner 4 (Arduino)', 'tipe' => 'Reguler', 'guru_status' => '[Diacak oleh GA (Lvl >= 4)]', 'ruang_info' => '[Diacak oleh GA (R1/R2/R3)]', 'status_jadwal' => '[Diacak oleh GA (H1-H5, S1-S4)]', 'level' => 4, 'freq' => '2x/minggu (Pertemuan 2)' ], [ 'id' => 10, 'nama' => 'P1 - Beginner 2 (Robotics)', 'tipe' => 'Reguler', 'guru_status' => '[Diacak oleh GA (Lvl >= 2)]', 'ruang_info' => '[Diacak oleh GA (R1/R2/R3)]', 'status_jadwal' => '[Diacak oleh GA (H1-H5, S1-S4)]', 'level' => 2, 'freq' => '1x/minggu' ], ]; $guruList = [ ['id' => 1, 'nama' => 'Ahmad Dandy (G1)', 'level_max' => 3, 'ketersediaan' => 'Senin-Selasa (Sesi 1-2)'], ['id' => 2, 'nama' => 'Agus Dwi Priyono (G2)', 'level_max' => 3, 'ketersediaan' => 'Senin-Kamis (Sesi 1-3)'], ['id' => 3, 'nama' => 'Putri Lailatul (G3)', 'level_max' => 4, 'ketersediaan' => 'Selasa-Jumat (Sesi 1-4)'], ['id' => 4, 'nama' => 'Abdul Halim Al-Asrori (G4)', 'level_max' => 5, 'ketersediaan' => 'Rabu-Jumat (Sesi 1-2)'], ['id' => 5, 'nama' => 'Vicko Effendy (G5)', 'level_max' => 4, 'ketersediaan' => 'Senin-Jumat (Sesi 1-4)'], ]; $ruanganList = [ ['id' => 1, 'nama' => 'Lab Juara (R1)', 'tipe' => 'Reguler LKP'], ['id' => 2, 'nama' => 'Lab Cemerlang (R2)', 'tipe' => 'Reguler LKP'], ['id' => 3, 'nama' => 'Lab Gembita (R3)', 'tipe' => 'Reguler LKP'], ['id' => 4, 'nama' => 'SD Bintang Harapan (R4)', 'tipe' => 'Ekstrakurikuler (Fix Sekolah)'], ['id' => 5, 'nama' => 'TK Namira (R5)', 'tipe' => 'Ekstrakurikuler (Fix Sekolah)'], ]; $sesiList = [ ['id' => 1, 'nama' => 'Sesi 1', 'jam' => '08:00 - 10:00'], ['id' => 2, 'nama' => 'Sesi 2', 'jam' => '10:00 - 12:00'], ['id' => 3, 'nama' => 'Sesi 3', 'jam' => '13:00 - 15:00'], ['id' => 4, 'nama' => 'Sesi 4', 'jam' => '15:00 - 17:00'], ]; $hariList = [ 1 => 'Senin (H1)', 2 => 'Selasa (H2)', 3 => 'Rabu (H3)', 4 => 'Kamis (H4)', 5 => 'Jumat (H5)' ]; $availabilityMatrix = [ 1 => ['1_1'=>1, '1_2'=>1, '2_1'=>1, '2_2'=>1, '3_1'=>0, '3_2'=>0, '4_1'=>0, '4_2'=>0, '5_1'=>0, '5_2'=>0], 2 => ['1_1'=>1, '1_2'=>1, '1_3'=>1, '2_1'=>1, '2_2'=>1, '2_3'=>1, '3_1'=>1, '3_2'=>1, '3_3'=>1, '4_1'=>1, '4_2'=>1, '4_3'=>1], 3 => ['2_1'=>1, '2_2'=>1, '2_3'=>1, '2_4'=>1, '3_1'=>1, '3_2'=>1, '3_3'=>1, '3_4'=>1, '4_1'=>1, '4_2'=>1, '4_3'=>1, '4_4'=>1, '5_1'=>1, '5_2'=>1, '5_3'=>1, '5_4'=>1], 4 => ['3_1'=>1, '3_2'=>1, '4_1'=>1, '4_2'=>1, '5_1'=>1, '5_2'=>1], 5 => ['1_1'=>1, '1_2'=>1, '1_3'=>1, '1_4'=>1, '2_1'=>1, '2_2'=>1, '2_3'=>1, '2_4'=>1, '3_1'=>1, '3_2'=>1, '3_3'=>1, '3_4'=>1, '4_1'=>1, '4_2'=>1, '4_3'=>1, '4_4'=>1, '5_1'=>1, '5_2'=>1, '5_3'=>1, '5_4'=>1], ]; // 2. Formasi 6 Individu Populasi Awal (Gen 0) // Gen 0 Belum Mengirimkan Fitness 1.0 (Best Fitness = 0.5000) agar alur Generasi GA berjalan rasional! $populasiAwal = [ [ 'index' => 1, 'genes' => [ ['kelas_id' => 1, 'guru_id' => 1, 'ruang_id' => 1, 'sesi_id' => 1, 'hari_id' => 1], ['kelas_id' => 2, 'guru_id' => 2, 'ruang_id' => 1, 'sesi_id' => 1, 'hari_id' => 1], ['kelas_id' => 3, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 2, 'hari_id' => 2], ['kelas_id' => 4, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 2, 'hari_id' => 2], ['kelas_id' => 5, 'guru_id' => 5, 'ruang_id' => 4, 'sesi_id' => 1, 'hari_id' => 5], ['kelas_id' => 6, 'guru_id' => 4, 'ruang_id' => 3, 'sesi_id' => 1, 'hari_id' => 1], ['kelas_id' => 7, 'guru_id' => 1, 'ruang_id' => 5, 'sesi_id' => 1, 'hari_id' => 2], ['kelas_id' => 8, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 1, 'hari_id' => 1], ['kelas_id' => 9, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 1, 'hari_id' => 3], ['kelas_id' => 10, 'guru_id' => 2, 'ruang_id' => 3, 'sesi_id' => 2, 'hari_id' => 3], ], 'b1' => 2, 'b2' => 1, 'b3' => 2, 'b4' => 0, 'b5' => 0, 'b6' => 1, 'b7' => 0, 'total_penalti' => 6, 'fitness' => 0.1429 ], [ 'index' => 2, 'genes' => [ ['kelas_id' => 1, 'guru_id' => 1, 'ruang_id' => 1, 'sesi_id' => 1, 'hari_id' => 1], ['kelas_id' => 2, 'guru_id' => 2, 'ruang_id' => 1, 'sesi_id' => 2, 'hari_id' => 1], ['kelas_id' => 3, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 1, 'hari_id' => 1], // Melanggar B3 (Putri Lailatul tidak tersedia Senin) ['kelas_id' => 4, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 1, 'hari_id' => 4], ['kelas_id' => 5, 'guru_id' => 5, 'ruang_id' => 4, 'sesi_id' => 1, 'hari_id' => 5], ['kelas_id' => 6, 'guru_id' => 4, 'ruang_id' => 3, 'sesi_id' => 1, 'hari_id' => 3], ['kelas_id' => 7, 'guru_id' => 1, 'ruang_id' => 5, 'sesi_id' => 1, 'hari_id' => 2], ['kelas_id' => 8, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 3, 'hari_id' => 1], ['kelas_id' => 9, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 3, 'hari_id' => 4], ['kelas_id' => 10, 'guru_id' => 2, 'ruang_id' => 3, 'sesi_id' => 2, 'hari_id' => 3], ], 'b1' => 0, 'b2' => 0, 'b3' => 1, 'b4' => 0, 'b5' => 0, 'b6' => 0, 'b7' => 0, 'total_penalti' => 1, 'fitness' => 0.5000 ], [ 'index' => 3, 'genes' => [ ['kelas_id' => 1, 'guru_id' => 1, 'ruang_id' => 1, 'sesi_id' => 2, 'hari_id' => 1], ['kelas_id' => 2, 'guru_id' => 2, 'ruang_id' => 1, 'sesi_id' => 2, 'hari_id' => 1], ['kelas_id' => 3, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 2, 'hari_id' => 3], ['kelas_id' => 4, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 2, 'hari_id' => 5], ['kelas_id' => 5, 'guru_id' => 5, 'ruang_id' => 4, 'sesi_id' => 1, 'hari_id' => 5], ['kelas_id' => 6, 'guru_id' => 4, 'ruang_id' => 3, 'sesi_id' => 2, 'hari_id' => 4], ['kelas_id' => 7, 'guru_id' => 1, 'ruang_id' => 5, 'sesi_id' => 1, 'hari_id' => 2], ['kelas_id' => 8, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 4, 'hari_id' => 2], ['kelas_id' => 9, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 4, 'hari_id' => 5], ['kelas_id' => 10, 'guru_id' => 2, 'ruang_id' => 3, 'sesi_id' => 1, 'hari_id' => 4], ], 'b1' => 1, 'b2' => 1, 'b3' => 0, 'b4' => 0, 'b5' => 0, 'b6' => 0, 'b7' => 0, 'total_penalti' => 2, 'fitness' => 0.3333 ], [ 'index' => 4, 'genes' => [ ['kelas_id' => 1, 'guru_id' => 1, 'ruang_id' => 1, 'sesi_id' => 1, 'hari_id' => 2], ['kelas_id' => 2, 'guru_id' => 2, 'ruang_id' => 1, 'sesi_id' => 3, 'hari_id' => 2], ['kelas_id' => 3, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 1, 'hari_id' => 1], ['kelas_id' => 4, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 1, 'hari_id' => 3], ['kelas_id' => 5, 'guru_id' => 5, 'ruang_id' => 4, 'sesi_id' => 1, 'hari_id' => 5], ['kelas_id' => 6, 'guru_id' => 4, 'ruang_id' => 3, 'sesi_id' => 1, 'hari_id' => 5], ['kelas_id' => 7, 'guru_id' => 1, 'ruang_id' => 5, 'sesi_id' => 1, 'hari_id' => 2], ['kelas_id' => 8, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 2, 'hari_id' => 2], ['kelas_id' => 9, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 2, 'hari_id' => 4], ['kelas_id' => 10, 'guru_id' => 2, 'ruang_id' => 3, 'sesi_id' => 3, 'hari_id' => 1], ], 'b1' => 0, 'b2' => 0, 'b3' => 1, 'b4' => 0, 'b5' => 0, 'b6' => 0, 'b7' => 0, 'total_penalti' => 1, 'fitness' => 0.5000 ], [ 'index' => 5, 'genes' => [ ['kelas_id' => 1, 'guru_id' => 1, 'ruang_id' => 1, 'sesi_id' => 2, 'hari_id' => 2], ['kelas_id' => 2, 'guru_id' => 2, 'ruang_id' => 1, 'sesi_id' => 1, 'hari_id' => 3], ['kelas_id' => 3, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 3, 'hari_id' => 2], ['kelas_id' => 4, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 3, 'hari_id' => 3], ['kelas_id' => 5, 'guru_id' => 5, 'ruang_id' => 4, 'sesi_id' => 1, 'hari_id' => 5], ['kelas_id' => 6, 'guru_id' => 4, 'ruang_id' => 3, 'sesi_id' => 2, 'hari_id' => 3], ['kelas_id' => 7, 'guru_id' => 1, 'ruang_id' => 5, 'sesi_id' => 1, 'hari_id' => 2], ['kelas_id' => 8, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 1, 'hari_id' => 4], ['kelas_id' => 9, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 1, 'hari_id' => 5], ['kelas_id' => 10, 'guru_id' => 2, 'ruang_id' => 3, 'sesi_id' => 2, 'hari_id' => 2], ], 'b1' => 0, 'b2' => 0, 'b3' => 0, 'b4' => 0, 'b5' => 0, 'b6' => 2, 'b7' => 0, 'total_penalti' => 2, 'fitness' => 0.3333 ], [ 'index' => 6, 'genes' => [ ['kelas_id' => 1, 'guru_id' => 1, 'ruang_id' => 1, 'sesi_id' => 1, 'hari_id' => 1], ['kelas_id' => 2, 'guru_id' => 2, 'ruang_id' => 1, 'sesi_id' => 2, 'hari_id' => 2], ['kelas_id' => 3, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 4, 'hari_id' => 2], ['kelas_id' => 4, 'guru_id' => 3, 'ruang_id' => 2, 'sesi_id' => 4, 'hari_id' => 4], ['kelas_id' => 5, 'guru_id' => 5, 'ruang_id' => 4, 'sesi_id' => 1, 'hari_id' => 5], ['kelas_id' => 6, 'guru_id' => 4, 'ruang_id' => 3, 'sesi_id' => 1, 'hari_id' => 4], ['kelas_id' => 7, 'guru_id' => 1, 'ruang_id' => 5, 'sesi_id' => 1, 'hari_id' => 2], ['kelas_id' => 8, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 3, 'hari_id' => 3], ['kelas_id' => 9, 'guru_id' => 5, 'ruang_id' => 2, 'sesi_id' => 3, 'hari_id' => 5], ['kelas_id' => 10, 'guru_id' => 2, 'ruang_id' => 3, 'sesi_id' => 1, 'hari_id' => 1], // Melanggar B1 (Agus Dwi bentrok di Senin Sesi 1 dgn K01) ], 'b1' => 1, 'b2' => 0, 'b3' => 0, 'b4' => 0, 'b5' => 0, 'b6' => 0, 'b7' => 0, 'total_penalti' => 1, 'fitness' => 0.5000 ], ]; // 3. Simulasi Tournament Selection $tournament1 = [ 'candidates' => [$populasiAwal[0], $populasiAwal[3], $populasiAwal[2]], 'winner' => $populasiAwal[3], 'role' => 'Parent A (Induk 1)' ]; $tournament2 = [ 'candidates' => [$populasiAwal[4], $populasiAwal[1], $populasiAwal[0]], 'winner' => $populasiAwal[1], 'role' => 'Parent B (Induk 2)' ]; // 4. Simulasi Crossover $parentA = $tournament1['winner']; $parentB = $tournament2['winner']; $crossoverPoint = 5; $child1Genes = array_merge( array_slice($parentA['genes'], 0, 5), array_slice($parentB['genes'], 5, 5) ); $child2Genes = array_merge( array_slice($parentB['genes'], 0, 5), array_slice($parentA['genes'], 5, 5) ); // 5. Simulasi Mutasi & Repair // Child 1 punya 1 penalti B3 di Gen 3 (Selasa) -> Di-Smart Repair ke Hari 2 (Selasa Sesi 1) -> Menjadi Fitness 1.0000 (0 Penalti!) $child1MutatedGenes = $child1Genes; $child1MutatedGenes[2]['hari_id'] = 2; return [ 'kelas' => $kelas, 'guruList' => $guruList, 'ruanganList' => $ruanganList, 'sesiList' => $sesiList, 'hariList' => $hariList, 'availabilityMatrix' => $availabilityMatrix, 'populasiAwal' => $populasiAwal, 'tournament1' => $tournament1, 'tournament2' => $tournament2, 'parentA' => $parentA, 'parentB' => $parentB, 'crossoverPoint' => $crossoverPoint, 'child1Genes' => $child1Genes, 'child2Genes' => $child2Genes, 'child1MutatedGenes' => $child1MutatedGenes, ]; } }