216 lines
6.7 KiB
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
|
|
]);
|
|
}
|
|
}
|