321 lines
12 KiB
PHP
321 lines
12 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
|
|
use DataTables;
|
|
use GuzzleHttp\Client;
|
|
use Carbon\Carbon;
|
|
|
|
use App\Models\Kriteria;
|
|
use App\Models\Alternatif;
|
|
use App\Models\AnalisaAlternatif;
|
|
use App\Models\AnalisaKriteria;
|
|
use App\Models\Nilai;
|
|
use App\Models\{BobotKriteria,BobotAlternatif,NilaiRandom};
|
|
|
|
class AnalisaController extends Controller
|
|
{
|
|
public function alternatif(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'kriteria' => 'required'
|
|
]);
|
|
|
|
if($validator->fails())
|
|
{
|
|
return redirect()->back()->with('error', 'Kriteria tidak boleh kosong');
|
|
}
|
|
|
|
$data = [
|
|
'subtitle' => 'Analisa Alternatif',
|
|
];
|
|
|
|
$id_kriteria = $request->input('kriteria');
|
|
|
|
if($request->input('delete'))
|
|
{
|
|
return $this->deleteAnalisaAlternatif($id_kriteria);
|
|
} else {
|
|
return view('admin.app.content.analisa.alternatif', compact('data', 'id_kriteria'));
|
|
}
|
|
}
|
|
|
|
public function kriteria()
|
|
{
|
|
$data = [
|
|
'subtitle' => 'Analisa Kriteria',
|
|
];
|
|
|
|
return view('admin.app.content.analisa.kriteria', compact('data'));
|
|
}
|
|
|
|
public function kriteriaTabel(Request $request)
|
|
{
|
|
if($request->isMethod('post')) {
|
|
// Jumlah Kriteria
|
|
$n = Kriteria::count();
|
|
|
|
$matrik = array();
|
|
$urut = 0;
|
|
|
|
// Memetakan nilai dalam bentuk matrik
|
|
// x = baris
|
|
// y = kolom
|
|
for ($x = 0; $x <= ($n - 2); $x++) {
|
|
for ($y = ($x + 1); $y <= ($n - 1); $y++) {
|
|
$urut++;
|
|
$pilih = "pilih" . $urut;
|
|
$bobot = "bobot" . $urut;
|
|
|
|
// memilih input radio button yang dipilih apakah yang kiri atau kanan
|
|
// jika kiri maka otomatis nilai matrix 1 dibagi bobot nilai tersebut dengan format x dan y
|
|
if ($request->input($pilih) == 1) {
|
|
$matrik[$x][$y] = $request->input($bobot);
|
|
$matrik[$y][$x] = 1 / $request->input($bobot);
|
|
} else {
|
|
$matrik[$x][$y] = 1 / $request->input($bobot);
|
|
$matrik[$y][$x] = $request->input($bobot);
|
|
}
|
|
|
|
$id_kriteria1 = getKriteriaId($x);
|
|
$id_kriteria2 = getKriteriaId($y);
|
|
|
|
$jumlahPerbandingan = AnalisaKriteria::where('kriteria_pertama', $id_kriteria1)->where('kriteria_kedua', $id_kriteria2)->count();
|
|
if ($jumlahPerbandingan == 0) {
|
|
$insert = new AnalisaKriteria([
|
|
'kriteria_pertama' => $id_kriteria1,
|
|
'kriteria_kedua' => $id_kriteria2,
|
|
'nilai_analisa_kriteria' => $matrik[$x][$y]
|
|
]);
|
|
$insert->save();
|
|
} else {
|
|
$nilaiMatrixKriteria = $matrik[$x][$y];
|
|
$update = DB::statement("UPDATE tbl_analisa_kriteria SET nilai_analisa_kriteria = '$nilaiMatrixKriteria' WHERE kriteria_pertama = '$id_kriteria1' AND kriteria_kedua = '$id_kriteria2'");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Diagonal -> bernilai 1
|
|
for ($i = 0; $i <= ($n - 1); $i++) {
|
|
$matrik[$i][$i] = 1;
|
|
}
|
|
|
|
// Inisialisasi jumlah tiap kolom dan baris kriteria
|
|
$jmlmpb = array();
|
|
$jmlmnk = array();
|
|
for ($i = 0; $i <= ($n - 1); $i++) {
|
|
$jmlmpb[$i] = 0;
|
|
$jmlmnk[$i] = 0;
|
|
}
|
|
|
|
// Menghitung jumlah pada kolom kriteria tabel perbandingan berpasangan
|
|
for ($x = 0; $x <= ($n - 1); $x++) {
|
|
for ($y = 0; $y <= ($n - 1); $y++) {
|
|
$value = $matrik[$x][$y];
|
|
$jmlmpb[$y] += $value;
|
|
}
|
|
}
|
|
|
|
// Menghitung jumlah pada baris kriteria tabel nilai kriteria
|
|
// Matrikb merupakan matrik yang telah dinormalisasi
|
|
for ($x = 0; $x <= ($n - 1); $x++) {
|
|
for ($y = 0; $y <= ($n - 1); $y++) {
|
|
$matrikb[$x][$y] = $matrik[$x][$y] / $jmlmpb[$y];
|
|
$value = $matrikb[$x][$y];
|
|
$jmlmnk[$x] += $value;
|
|
}
|
|
|
|
// Nilai Priority Vektor
|
|
$pv[$x] = $jmlmnk[$x] / $n;
|
|
|
|
// Memasukan nilai priority vektor ke dalam tabel tb_pv_kriteria
|
|
$id_kriteria = getKriteriaId($x);
|
|
$jumlahPV = BobotKriteria::where('id_kriteria', $id_kriteria)->count();
|
|
if ($jumlahPV == 0) {
|
|
$insert = new BobotKriteria([
|
|
'id_kriteria' => $id_kriteria,
|
|
'nilai' => $pv[$x]
|
|
]);
|
|
$insert->save();
|
|
} else {
|
|
$nilaiPV = $pv[$x];
|
|
$update = DB::statement("UPDATE tb_bobot_alternatif SET nilai = '$nilaiPV' WHERE id_kriteria = '$id_kriteria'");
|
|
}
|
|
}
|
|
|
|
$eigenVektor = getEigenVector($jmlmpb, $jmlmnk, $n);
|
|
$consIndex = getConsIndex($jmlmpb, $jmlmnk, $n);
|
|
$consRatio = getConsRatio($jmlmpb, $jmlmnk, $n);
|
|
|
|
$data['n'] = $n;
|
|
$data['matrik'] = $matrik;
|
|
$data['jmlmpb'] = $jmlmpb;
|
|
$data['jmlmnk'] = $jmlmnk;
|
|
$data['matrikb'] = $matrikb;
|
|
$data['pv'] = $pv;
|
|
$data['eigenVektor'] = $eigenVektor;
|
|
$data['consIndex'] = $consIndex;
|
|
$data['consRatio'] = $consRatio;
|
|
}
|
|
|
|
$data['subtitle'] = 'Analisa Kriteria Tabel';
|
|
|
|
return view('admin.app.content.analisa.kriteria-tabel', compact('data'));
|
|
}
|
|
|
|
public function deleteKriteria($id_kriteria)
|
|
{
|
|
if(AnalisaKriteria::delete() && BobotKriteria::delete()) {
|
|
return redirect()->to(app_url('analisa-kriteria'))->with('success', 'Data kriteria berhasil di hapus');
|
|
} else {
|
|
return redirect()->back()->with('error', 'Data alternatif tidak ditemukan');
|
|
}
|
|
}
|
|
|
|
public function alternatifForm()
|
|
{
|
|
$data = [
|
|
'subtitle' => 'Alternatif Form'
|
|
];
|
|
|
|
return view('admin.app.content.analisa.alternatif-form', compact('data'));
|
|
}
|
|
|
|
public function alternatifTabel(Request $request, $id_kriteria)
|
|
{
|
|
if($request->isMethod('post')) {
|
|
// Jumlah Alternatif
|
|
$n = Alternatif::count();
|
|
|
|
$matrik = array();
|
|
$urut = 0;
|
|
|
|
// Memetakan nilai dalam bentuk matrik
|
|
// x = baris
|
|
// y = kolom
|
|
for ($x = 0; $x <= ($n - 2); $x++) {
|
|
for ($y = ($x + 1); $y <= ($n - 1); $y++) {
|
|
$urut++;
|
|
$pilih = "pilih" . $urut;
|
|
$bobot = "bobot" . $urut;
|
|
|
|
// Ambil nilai bobot dari request, jika tidak ada, set nilai default 0
|
|
$nilaiBobot = $request->input($bobot) ?? 0;
|
|
|
|
// memilih input radio button yang dipilih apakah yang kiri atau kanan
|
|
// jika kiri maka otomatis nilai matrix 1 dibagi bobot nilai tersebut dengan format x dan y
|
|
if ($request->input($pilih) == 1) {
|
|
$matrik[$x][$y] = $nilaiBobot;
|
|
$matrik[$y][$x] = $nilaiBobot != 0 ? 1 / $nilaiBobot : 0;
|
|
} else {
|
|
$matrik[$x][$y] = $nilaiBobot != 0 ? 1 / $nilaiBobot : 0;
|
|
$matrik[$y][$x] = $nilaiBobot;
|
|
}
|
|
$id_alternatif1 = getAlternatifId($x);
|
|
$id_alternatif2 = getAlternatifId($y);
|
|
|
|
$jumlahPerbandingan = AnalisaAlternatif::where('alternatif_pertama', $id_alternatif1)->where('alternatif_kedua', $id_alternatif2)->where('id_kriteria', $id_kriteria)->count();
|
|
if ($jumlahPerbandingan == 0) {
|
|
$insert = new AnalisaAlternatif([
|
|
'alternatif_pertama' => $id_alternatif1,
|
|
'alternatif_kedua' => $id_alternatif2,
|
|
'id_kriteria' => $id_kriteria,
|
|
'nilai_analisa_alternatif' => $matrik[$x][$y]
|
|
]);
|
|
$insert->save();
|
|
} else {
|
|
$nilaiMatrixAlternatif = $matrik[$x][$y];
|
|
$update = DB::statement("UPDATE tbl_analisa_alternatif SET nilai_analisa_alternatif = '$nilaiMatrixAlternatif' WHERE id_kriteria = '$id_kriteria' AND alternatif_pertama = '$id_alternatif1' AND alternatif_kedua = '$id_alternatif2'");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Diagonal -> bernilai 1
|
|
for ($i = 0; $i <= ($n - 1); $i++) {
|
|
$matrik[$i][$i] = 1;
|
|
}
|
|
|
|
// Inisialisasi jumlah tiap kolom dan baris kriteria
|
|
$jmlmpb = array();
|
|
$jmlmnk = array();
|
|
for ($i = 0; $i <= ($n - 1); $i++) {
|
|
$jmlmpb[$i] = 0;
|
|
$jmlmnk[$i] = 0;
|
|
}
|
|
|
|
// Menghitung jumlah pada kolom kriteria tabel perbandingan berpasangan
|
|
for ($x = 0; $x <= ($n - 1); $x++) {
|
|
for ($y = 0; $y <= ($n - 1); $y++) {
|
|
$value = $matrik[$x][$y];
|
|
$jmlmpb[$y] += $value;
|
|
}
|
|
}
|
|
|
|
// Menghitung jumlah pada baris kriteria tabel nilai kriteria
|
|
// Matrikb merupakan matrik yang telah dinormalisasi
|
|
for ($x = 0; $x <= ($n - 1); $x++) {
|
|
for ($y = 0; $y <= ($n - 1); $y++) {
|
|
$matrikb[$x][$y] = $matrik[$x][$y] / $jmlmpb[$y];
|
|
$value = $matrikb[$x][$y];
|
|
$jmlmnk[$x] += $value;
|
|
}
|
|
|
|
// Nilai Priority Vektor
|
|
$pv[$x] = $jmlmnk[$x] / $n;
|
|
|
|
// Memasukan nilai priority vektor ke dalam tabel tb_pv_kriteria
|
|
$id_alternatif = getAlternatifId($x);
|
|
$jumlahPV = BobotAlternatif::where('id_kriteria', $id_kriteria)->where('id_alternatif', $id_alternatif)->count();
|
|
|
|
if ($jumlahPV == 0) {
|
|
$insert = new BobotAlternatif([
|
|
'id_alternatif' => $id_alternatif,
|
|
'id_kriteria' => $id_kriteria,
|
|
'nilai' => $pv[$x]
|
|
]);
|
|
$insert->save();
|
|
} else {
|
|
$nilaiPV = $pv[$x];
|
|
$update = DB::statement("UPDATE tb_bobot_alternatif SET nilai = '$nilaiPV' WHERE id_kriteria = '$id_kriteria' AND id_alternatif = '$id_alternatif'");
|
|
}
|
|
}
|
|
|
|
$eigenVektor = getEigenVector($jmlmpb, $jmlmnk, $n);
|
|
$consIndex = getConsIndex($jmlmpb, $jmlmnk, $n);
|
|
$consRatio = getConsRatio($jmlmpb, $jmlmnk, $n);
|
|
|
|
$data['n'] = $n;
|
|
$data['matrik'] = $matrik;
|
|
$data['jmlmpb'] = $jmlmpb;
|
|
$data['jmlmnk'] = $jmlmnk;
|
|
$data['matrikb'] = $matrikb;
|
|
$data['pv'] = $pv;
|
|
$data['eigenVektor'] = $eigenVektor;
|
|
$data['consIndex'] = $consIndex;
|
|
$data['consRatio'] = $consRatio;
|
|
}
|
|
|
|
$data['subtitle'] = 'Analisa Alternatif Tabel';
|
|
|
|
return view('admin.app.content.analisa.alternatif-tabel', compact('data'));
|
|
}
|
|
|
|
public function deleteAnalisaAlternatif($id_kriteria)
|
|
{
|
|
$data_alternatif = AnalisaAlternatif::where('id_kriteria', $id_kriteria);
|
|
$bobot_alternatif = BobotAlternatif::where('id_kriteria', $id_kriteria);
|
|
if($data_alternatif->delete() && $bobot_alternatif->delete()) {
|
|
return redirect()->to(app_url('analisa-alternatif-form'))->with('success', 'Data alternatif berhasil di hapus');
|
|
} else {
|
|
return redirect()->back()->with('error', 'Data alternatif tidak ditemukan');
|
|
}
|
|
}
|
|
}
|