penjadwalan-ga/app/Services/Scheduling/ScheduleGeneratorService.php

87 lines
2.7 KiB
PHP

<?php
namespace App\Services\Scheduling;
use App\Models\JadwalKelas;
/**
* ScheduleGeneratorService adalah kelas koodinator utama yang menghubungkan:
* Controller <-> 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(),
]);
}
}
}