MIF_E31210174/app/Http/Controllers/SimulasiRekomendasiControll...

214 lines
8.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Kriteria;
use App\Models\Alternatif;
use App\Models\Kost;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class SimulasiRekomendasiController extends Controller
{
public function index()
{
$alternatifterbaik = '';
return view('admin.pages.simulasi-rekomendasi', [
'alternatifterbaik' => $alternatifterbaik,
]);
}
public function cari(Request $request)
{
$request->validate([
'kepentingan_lokasi' => 'required',
'kepentingan_harga' => 'required',
'kepentingan_fasilitas' => 'required',
'kepentingan_jarak' => 'required',
'kepentingan_keamanan' => 'required',
'kepentingan_aksesjalan' => 'required',
], [
'kepentingan_lokasi.required' => 'Kepentingan Lokasi tidak boleh kosong',
'kepentingan_harga.required' => 'Kepentingan Harga tidak boleh kosong',
'kepentingan_fasilitas.required' => 'Kepentingan Fasilitas tidak boleh kosong',
'kepentingan_jarak.required' => 'Kepentingan Jarak tidak boleh kosong',
'kepentingan_keamanan.required' => 'Kepentingan Keamanan tidak boleh kosong',
'kepentingan_aksesjalan.required' => 'Kepentingan Akses Jalan tidak boleh kosong',
]);
$kepentinganlokasi = $request->kepentingan_lokasi;
$kepentinganharga = $request->kepentingan_harga;
$kepentinganfasilitas = $request->kepentingan_fasilitas;
$kepentinganjarak = $request->kepentingan_jarak;
$kepentingankeamanan = $request->kepentingan_keamanan;
$kepentinganaksesjalan = $request->kepentingan_aksesjalan;
$jenis_kost = $request->jenis_kost;
// ambil semua kepentingan dan masukkan ke array
$kepentingan = [
'lokasi' => $kepentinganlokasi,
'harga' => $kepentinganharga,
'fasilitas' => $kepentinganfasilitas,
'jarak' => $kepentinganjarak,
'keamanan' => $kepentingankeamanan,
'aksesjalan' => $kepentinganaksesjalan,
'total' => $kepentinganlokasi + $kepentinganharga + $kepentinganfasilitas + $kepentinganjarak + $kepentingankeamanan + $kepentinganaksesjalan,
];
$jumlahkepentingan = $kepentinganlokasi + $kepentinganharga + $kepentinganfasilitas + $kepentinganjarak + $kepentingankeamanan + $kepentinganaksesjalan;
$nilaibobotlokasi = $kepentinganlokasi / $jumlahkepentingan;
$nilaibobotharga = $kepentinganharga / $jumlahkepentingan;
$nilaibobotfasilitas = $kepentinganfasilitas / $jumlahkepentingan;
$nilaibobotjarak = $kepentinganjarak / $jumlahkepentingan;
$nilaibobotkeamanan = $kepentingankeamanan / $jumlahkepentingan;
$nilaibobotaksesjalan = $kepentinganaksesjalan / $jumlahkepentingan;
// array nilai bobot
$nilaibobot = [
'lokasi' => $nilaibobotlokasi,
'harga' => $nilaibobotharga,
'fasilitas' => $nilaibobotfasilitas,
'jarak' => $nilaibobotjarak,
'keamanan' => $nilaibobotkeamanan,
'aksesjalan' => $nilaibobotaksesjalan,
'total' => $nilaibobotlokasi + $nilaibobotharga + $nilaibobotfasilitas + $nilaibobotjarak + $nilaibobotkeamanan + $nilaibobotaksesjalan,
];
if (Kriteria::all()->where('name', 'Lokasi')->first()->jenis == 'Benefit') {
$nilaipangkatlokasi = pow($nilaibobotlokasi, 1);
} else {
$nilaipangkatlokasi = -1 * pow($nilaibobotlokasi, 1);
}
if (Kriteria::all()->where('name', 'Harga')->first()->jenis == 'Benefit') {
$nilaipangkatharga = pow($nilaibobotharga, 1);
} else {
$nilaipangkatharga = -1 * pow($nilaibobotharga, 1);
}
if (Kriteria::all()->where('name', 'Fasilitas')->first()->jenis == 'Benefit') {
$nilaipangkatfasilitas = pow($nilaibobotfasilitas, 1);
} else {
$nilaipangkatfasilitas = -1 * pow($nilaibobotfasilitas, 1);
}
if (Kriteria::all()->where('name', 'Jarak')->first()->jenis == 'Benefit') {
$nilaipangkatjarak = pow($nilaibobotjarak, 1);
} else {
$nilaipangkatjarak = -1 * pow($nilaibobotjarak, 1);
}
if (Kriteria::all()->where('name', 'Keamanan')->first()->jenis == 'Benefit') {
$nilaipangkatkeamanan = pow($nilaibobotkeamanan, 1);
} else {
$nilaipangkatkeamanan = -1 * pow($nilaibobotkeamanan, 1);
}
if (Kriteria::all()->where('name', 'Akses Jalan')->first()->jenis == 'Benefit') {
$nilaipangkataksesjalan = pow($nilaibobotaksesjalan, 1);
} else {
$nilaipangkataksesjalan = -1 * pow($nilaibobotaksesjalan, 1);
}
// nilai pangkat
$nilaipangkat = [
'lokasi' => $nilaipangkatlokasi,
'harga' => $nilaipangkatharga,
'fasilitas' => $nilaipangkatfasilitas,
'jarak' => $nilaipangkatjarak,
'keamanan' => $nilaipangkatkeamanan,
'aksesjalan' => $nilaipangkataksesjalan,
];
// penghitungan vektor S
if ($jenis_kost == '0') {
$alternatif = Alternatif::with('kost')->get();
} else {
// join alternatif dengan tabel kost berdasarkan jenis kost
$alternatif = Alternatif::with('kost')->whereHas('kost', function ($query) use ($jenis_kost) {
$query->where('jenis_kost', $jenis_kost);
})->get();
}
$vektorS = [];
foreach ($alternatif as $key => $value) {
$vektorS[$key] = pow($value->lokasi->bobot, $nilaipangkatlokasi) * pow($value->harga->bobot, $nilaipangkatharga) * pow($value->fasilitas->bobot, $nilaipangkatfasilitas) * pow($value->jarak->bobot, $nilaipangkatjarak) * pow($value->keamanan->bobot, $nilaipangkatkeamanan) * pow($value->aksesjalan->bobot, $nilaipangkataksesjalan);
}
// simpan vektor S ke array beserta id kost nya
$vektorSwithId = [];
foreach ($alternatif as $key => $value) {
$vektorSwithId[$key] = [
'id' => $value->id,
'vektorS' => $vektorS[$key]
];
}
// ambil data vektor S yang sudah disimpan dan data kost nya
$vektorSwithIdData = [];
foreach ($vektorSwithId as $key => $value) {
$vektorSwithIdData[$key] = [
'id' => $value['id'],
'vektorS' => $value['vektorS'],
'data' => Alternatif::with('kost')->where('id', $value['id'])->first()
];
}
$nilaisdankost = $vektorSwithIdData;
// penghitungan vektor V
$vektorV = [];
foreach ($alternatif as $key => $value) {
$vektorV[$key] = $vektorSwithId[$key]['vektorS'] / array_sum($vektorS);
}
// simpan vektor V ke array beserta id kost nya
$vektorVwithId = [];
foreach ($alternatif as $key => $value) {
$vektorVwithId[$key] = [
'id' => $value->id,
'vektorV' => $vektorV[$key]
];
}
// sorting vektor V dari yang terbesar
$vektorVsorted = collect($vektorVwithId)->sortByDesc('vektorV')->values()->all();
// ambil id kost dan vektor V nya saja
$alternatifterbaik = [];
foreach ($vektorVsorted as $key => $value) {
$alternatifterbaik[$key] = [
'id' => $value['id'],
'vektorV' => $value['vektorV']
];
}
$alternatifterbaikData = [];
foreach ($alternatifterbaik as $key => $value) {
$alternatifterbaikData[$key] = [
'id' => $value['id'],
'vektorV' => $value['vektorV'],
'data' => Alternatif::with('kost')->where('id', $value['id'])->first()
];
}
// ambil satu data kost dengan vektor V terbesar
$palingrekomendasi = $alternatifterbaikData[0];
return view('admin.pages.simulasi-rekomendasi', [
'alternatifterbaik' => $alternatifterbaikData,
'palingrekomendasi' => $palingrekomendasi,
'kepentingan' => $kepentingan,
'nilaibobot' => $nilaibobot,
'nilaipangkat' => $nilaipangkat,
'nilaisdankost' => $nilaisdankost,
]);
}
}