has(['nitrogen', 'fosfor', 'kalium', 'budget'])) { $validated = $request->validate([ 'nitrogen' => 'required|numeric|gt:0', 'fosfor' => 'required|numeric|gt:0', 'kalium' => 'required|numeric|gt:0', 'budget' => 'required|numeric|gt:0' ], [ 'gt' => 'Nilai :attribute harus lebih dari 0', 'required' => ':attribute tidak boleh kosong', 'numeric' => ':attribute harus berupa angka' ]); $kebutuhan_nitrogen = (float) $request->input('nitrogen'); $kebutuhan_fosfor = (float) $request->input('fosfor'); $kebutuhan_kalium = (float) $request->input('kalium'); $budget = (float) $request->input('budget'); // Data alternatif pupuk $alternatifs = [ [ 'nama' => 'Darah ', 'N' => 12.18, 'P' => 5.28, 'K' => 0.15, 'harga' => 4000 ], [ 'nama' => 'Air Kelapa', 'N' => 0.39, 'P' => 4.95, 'K' => 2.85, 'harga' => 3000 ], [ 'nama' => 'Pisang Busuk', 'N' => 1.30, 'P' => 0.02, 'K' => 3.01, 'harga' => 2500 ], [ 'nama' => 'Urin Sapi', 'N' => 1.00, 'P' => 0.50, 'K' => 1.50, 'harga' => 1000 ], [ 'nama' => 'Air Cucian Beras', 'N' => 0.08, 'P' => 0.02, 'K' => 0.12, 'harga' => 1500 ] ]; // Bobot kriteria $bobot = [ 'N' => 0.40, 'P' => 0.20, 'K' => 0.25, 'harga' => 0.15 ]; try { // Ambil harga minimum dari alternatif (untuk normalisasi cost) $min_harga = min(array_column($alternatifs, 'harga')); $results = []; foreach ($alternatifs as $a) { // Normalisasi berdasarkan kebutuhan tanaman, bukan max dari alternatif $normalized_N = min($a['N'] / $kebutuhan_nitrogen, 1); $normalized_P = min($a['P'] / $kebutuhan_fosfor, 1); $normalized_K = min($a['K'] / $kebutuhan_kalium, 1); // Normalisasi harga sebagai cost: harga minimum / harga alternatif $normalized_harga = $min_harga / $a['harga']; // Hitung skor SAW (weighted sum) $nilai = ($normalized_N * $bobot['N']) + ($normalized_P * $bobot['P']) + ($normalized_K * $bobot['K']) + ($normalized_harga * $bobot['harga']); // Filter sesuai budget if ($a['harga'] <= $budget) { $results[] = [ 'nama' => $a['nama'], 'N' => $a['N'], 'P' => $a['P'], 'K' => $a['K'], 'harga' => $a['harga'], 'normalized_N' => round($normalized_N, 4), 'normalized_P' => round($normalized_P, 4), 'normalized_K' => round($normalized_K, 4), 'normalized_harga' => round($normalized_harga, 4), 'nilai' => round($nilai, 4) ]; } } if (empty($results)) { return back()->withErrors('Tidak ada pupuk yang sesuai dengan anggaran Anda.'); } $total_nilai = array_sum(array_column($results, 'nilai')); foreach ($results as &$result) { $result['persentase'] = round(($result['nilai'] / $total_nilai) * 100, 2); } // Urutkan dari nilai tertinggi usort($results, function($a, $b) { return $b['nilai'] <=> $a['nilai']; }); $rekomendasi = (object) $results[0]; $input = [ 'nitrogen' => $kebutuhan_nitrogen, 'fosfor' => $kebutuhan_fosfor, 'kalium' => $kebutuhan_kalium, 'budget' => $budget ]; return view('user.rekomendasi.index', [ 'alternatifs' => $results, 'rekomendasi' => $rekomendasi, 'input' => $input, 'maxmin' => [ 'min_harga' => $min_harga ], 'bobot' => $bobot ]); } catch (\Exception $e) { return back()->withErrors('Terjadi kesalahan dalam perhitungan: ' . $e->getMessage()); } } return view('user.rekomendasi.index', [ 'alternatifs' => [], 'rekomendasi' => null, 'input' => null, 'maxmin' => null, 'bobot' => null ]); } }