0) ? ($value / $sqrt) : 0.0; } } // ========================================== // LANGKAH 2: Normalisasi Terbobot (Weighted Normalized) // ========================================== $weighted = []; for ($i = 0; $i < $m; $i++) { for ($j = 0; $j < $n; $j++) { $weighted[$i][$j] = $norm[$i][$j] * $bobot[$j]; } } // ========================================== // LANGKAH 3: Solusi Ideal Positif (A+) dan Negatif (A-) // ========================================== $idealPos = []; $idealNeg = []; for ($j = 0; $j < $n; $j++) { $col = array_column($weighted, $j); if ($jenis[$j] == 'benefit') { $idealPos[$j] = max($col); // benefit: cari nilai maksimum $idealNeg[$j] = min($col); // benefit: cari nilai minimum } else { // cost $idealPos[$j] = min($col); // cost: cari nilai minimum $idealNeg[$j] = max($col); // cost: cari nilai maksimum } } // ========================================== // LANGKAH 4: Jarak ke Solusi Ideal // ========================================== $dPlus = []; $dMinus = []; for ($i = 0; $i < $m; $i++) { $dp = 0; $dm = 0; for ($j = 0; $j < $n; $j++) { $dp += pow($weighted[$i][$j] - $idealPos[$j], 2); $dm += pow($weighted[$i][$j] - $idealNeg[$j], 2); } $dPlus[$i] = sqrt($dp); $dMinus[$i] = sqrt($dm); } // ========================================== // LANGKAH 5: Nilai Preferensi (Kedekatan Relatif) // ========================================== $preferences = []; for ($i = 0; $i < $m; $i++) { $denominator = $dPlus[$i] + $dMinus[$i]; $preferences[$i] = ($denominator > 0) ? ($dMinus[$i] / $denominator) : 0.0; } return $preferences; } }