161 lines
5.6 KiB
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
|
|
]);
|
|
}
|
|
}
|