87 lines
2.7 KiB
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(),
|
|
]);
|
|
}
|
|
}
|
|
}
|