groupBy('mapel_id') ->map(fn($rows) => $rows->pluck('cf_value','jurusan_id')) ->toArray(); return view('user.new', compact('mapels', 'jurusans', 'basisAhp')); } /** * Proses perhitungan SPK AHP + CF. */ public function process(Request $request) { // validasi input $request->validate([ 'nilai.*' => 'required|numeric|min:0|max:100', ]); $userId = Auth::id(); $mapels = MapelUn::pluck('nama','id')->toArray(); $jurusans = Jurusan::pluck('nama','id')->toArray(); $basisAhp = BasisAhp::all() ->groupBy('mapel_id') ->map(fn($rows) => $rows->pluck('cf_value','jurusan_id')->toArray()) ->toArray(); // Ambil skor UN dari request $scores = array_map('floatval', $request->input('nilai')); $ids = array_keys($mapels); $n = count($ids); // 1. Matriks perbandingan kriteria $matrixCrit = []; foreach ($ids as $i) { foreach ($ids as $j) { $den = $scores[$j] ?: 1; $matrixCrit[$i][$j] = round($scores[$i] / $den, 4); } } // 2. Jumlah kolom $sumColCrit = []; foreach ($ids as $j) { $col = array_column($matrixCrit, $j); $sumColCrit[$j] = round(array_sum($col), 4); } // 3. Normalisasi & bobot kriteria $normCrit = []; $critWeights = []; foreach ($ids as $i) { $rowSum = 0; foreach ($ids as $j) { $normCrit[$i][$j] = $sumColCrit[$j] ? round($matrixCrit[$i][$j] / $sumColCrit[$j], 4) : 0; $rowSum += $normCrit[$i][$j]; } $critWeights[$i] = round($rowSum / $n, 4); } // 4. Bobot alternatif per kriteria $altWeights = []; foreach ($ids as $cid) { $row = $basisAhp[$cid] ?? []; $totalCF = array_sum($row); foreach ($jurusans as $aid => $_) { $altWeights[$cid][$aid] = $totalCF ? round(($row[$aid] ?? 0) / $totalCF, 4) : 0; } } // 5. Hitung skor global $globalScores = []; foreach ($jurusans as $aid => $_) { $s = 0; foreach ($ids as $cid) { $s += $critWeights[$cid] * ($altWeights[$cid][$aid] ?? 0); } $globalScores[$aid] = $s; } arsort($globalScores); // Simpan ke database (Menambahkan data tanpa menghapus data lama) if ($userId) { // Menambahkan nilai UN tanpa memperbarui data yang sudah ada foreach ($scores as $mid => $val) { NilaiUn::create([ 'user_id' => $userId, 'mapel_id' => $mid, 'nilai' => $val, ]); } // Menambahkan hasil AHP tanpa menghapus data sebelumnya $rank = 1; foreach ($globalScores as $aid => $s) { HasilAhp::create([ 'user_id' => $userId, 'jurusan_id' => $aid, 'score' => $s, 'ranking' => $rank++, ]); } } // Render kembali view dengan data hasil return view('user.new', compact( 'mapels','jurusans','basisAhp', 'matrixCrit','sumColCrit','normCrit','critWeights', 'altWeights','globalScores', 'ids' )); } }