penjadwalan-ga/app/Services/Scheduling/GaPresentationSimulationSer...

299 lines
16 KiB
PHP

<?php
namespace App\Services\Scheduling;
class GaPresentationSimulationService
{
/**
* Menghasilkan data simulasi GA lengkap dengan dataset sampel 10 kelas
* Gen 0 Memiliki Penalti (Best Fitness 0.5000) -> 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,
];
}
}