MIF_E31220044/app/Http/Controllers/RekomendasiController.php

161 lines
5.6 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class RekomendasiController extends Controller
{
public function index(Request $request)
{
if ($request->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
]);
}
}