MIF_E31222307/app/Http/Controllers/ProsesController.php

216 lines
6.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Kriteria;
use App\Models\Alternatif;
use App\Models\PerbandinganKriteria;
use App\Models\BobotKriteria;
use App\Models\ConsistencyRatioCriteria;
use App\Models\Makanan;
use Illuminate\Support\Facades\Session;
class ProsesController extends Controller
{
// Random Index value for n criteria (1-15)
private $RI = [
1 => 0.00,
2 => 0.00,
3 => 0.58,
4 => 0.90,
5 => 1.12,
6 => 1.24,
7 => 1.32,
8 => 1.41,
9 => 1.45,
10 => 1.49,
11 => 1.51,
12 => 1.48,
13 => 1.56,
14 => 1.57,
15 => 1.59
];
public function showPerbandingan()
{
$kriterias = Kriteria::all();
return view('admin.proses.perbandingan', compact('kriterias'));
}
public function prosesSementara(Request $request)
{
$request->validate([
'nilai' => 'required|array',
'waktu_makan_id' => 'required|exists:waktu_makans,id'
]);
// Simpan waktu_makan_id ke session
Session::put('waktu_makan_id', $request->waktu_makan_id);
$waktuMakanId = $request->waktu_makan_id;
$kriterias = Kriteria::all();
$nilai = [];
// Hapus data perbandingan lama untuk waktu makan ini
foreach ($kriterias as $baris) {
foreach ($kriterias as $kolom) {
if ($baris->id != $kolom->id) {
PerbandinganKriteria::where([
['kriteria_id_1', $baris->id],
['kriteria_id_2', $kolom->id],
['waktu_makan_id', $waktuMakanId]
])->delete();
}
}
}
foreach ($kriterias as $baris) {
foreach ($kriterias as $kolom) {
if ($baris->id == $kolom->id) {
$nilai[$baris->id][$kolom->id] = 1;
} elseif (isset($request->nilai[$baris->id][$kolom->id])) {
$val = floatval($request->nilai[$baris->id][$kolom->id]);
$nilai[$baris->id][$kolom->id] = $val;
$nilai[$kolom->id][$baris->id] = 1 / $val;
// Simpan ke database dengan waktu_makan_id
PerbandinganKriteria::updateOrCreate(
[
'kriteria_id_1' => $baris->id,
'kriteria_id_2' => $kolom->id,
'waktu_makan_id' => $waktuMakanId
],
[
'nilai' => $val
]
);
}
}
}
Session::put('matriks', $nilai);
return redirect()->route('perbandingan')
->with('success', 'Perbandingan kriteria berhasil disimpan.');
}
public function simpanPerbandingan(Request $request)
{
$matriks = Session::get('matriks');
$waktuMakanId = Session::get('waktu_makan_id');
if (!$matriks) {
return redirect()->route('perbandingan')
->with('error', 'Belum ada data untuk disimpan.');
}
if (!$waktuMakanId) {
return redirect()->route('perbandingan')
->with('error', 'Waktu makan belum dipilih.');
}
// Simpan matriks dan waktu makan ke session
Session::put('matriks_perbandingan', $matriks);
Session::put('waktu_makan_id', $waktuMakanId);
return redirect()->route('hasil.normalisasi')
->with('success', 'Data perbandingan berhasil disimpan!');
}
public function normalisasi()
{
$matriks = Session::get('matriks_perbandingan');
$waktuMakanId = Session::get('waktu_makan_id');
if (!$matriks || !$waktuMakanId) {
return redirect()->route('perbandingan')
->with('error', 'Belum ada data untuk dinormalisasi.');
}
$kriterias = Kriteria::all();
$normalisasi = [];
$jumlahKolom = [];
$bobot = [];
$totalBobot = 0;
// Hitung jumlah kolom
foreach ($kriterias as $kolom) {
$jumlahKolom[$kolom->id] = 0;
foreach ($kriterias as $baris) {
$jumlahKolom[$kolom->id] += $matriks[$baris->id][$kolom->id];
}
}
// Normalisasi
foreach ($kriterias as $baris) {
foreach ($kriterias as $kolom) {
$normalisasi[$baris->id][$kolom->id] = $matriks[$baris->id][$kolom->id] / $jumlahKolom[$kolom->id];
}
}
// Hitung bobot
foreach ($kriterias as $kriteria) {
$bobot[$kriteria->id] = array_sum($normalisasi[$kriteria->id]) / count($kriterias);
$totalBobot += $bobot[$kriteria->id];
}
// Normalisasi bobot
foreach ($bobot as $key => $value) {
$bobot[$key] = $value / $totalBobot;
}
// Hitung CI dan CR
$lambdaMax = 0;
foreach ($kriterias as $kriteria) {
$sum = 0;
foreach ($kriterias as $k) {
$sum += $matriks[$kriteria->id][$k->id] * $bobot[$k->id];
}
$lambdaMax += $sum / $bobot[$kriteria->id];
}
$lambdaMax = $lambdaMax / count($kriterias);
$CI = ($lambdaMax - count($kriterias)) / (count($kriterias) - 1);
$CR = $CI / $this->RI[count($kriterias)];
// Simpan bobot ke database
foreach ($bobot as $kriteriaId => $value) {
BobotKriteria::updateOrCreate(
[
'kriteria_id' => $kriteriaId,
'waktu_makan_id' => $waktuMakanId
],
['bobot' => $value]
);
}
// Simpan CR ke database
ConsistencyRatioCriteria::updateOrCreate(
[
'waktu_makan_id' => $waktuMakanId
],
[
'ci' => $CI,
'cr' => $CR,
'is_consistent' => $CR <= 0.1
]
);
Session::put('bobot_kriteria', $bobot);
Session::put('tahap_kriteria_selesai', true);
// Ambil data waktu makan
$waktuMakan = \App\Models\WaktuMakan::findOrFail($waktuMakanId);
return view('admin.proses.normalisasi', [
'kriterias' => $kriterias,
'normalisasi' => $normalisasi,
'bobot' => $bobot,
'ci' => $CI,
'cr' => $CR,
'is_consistent' => $CR <= 0.1,
'waktu_makan_id' => $waktuMakanId,
'waktu_makan' => $waktuMakan // Tambahkan ini untuk menghindari query di view
]);
}
}