Bagian 5 dari seri

Perhitungan Nilai Akhir dan Ranking AHP Laravel

Diterbitkan 18 September 2026

Rumus Nilai Akhir

Nilai akhir setiap alternatif dihitung dari:

Nilai Akhir =
Σ (Bobot Kriteria × Bobot Alternatif pada Kriteria)

Buat Controller

php artisan make:controller HasilController

app/Http/Controllers/HasilController.php:

<?php

namespace App\Http\Controllers;

use App\Models\Alternatif;
use App\Models\Kriteria;
use App\Models\PerbandinganAlternatif;
use App\Models\PerbandinganKriteria;
use App\Services\AhpService;
use Illuminate\Support\Facades\DB;

class HasilController extends Controller
{
    public function index(AhpService $ahp)
    {
        $kriteria = Kriteria::orderBy('kode')->get();
        $alternatif = Alternatif::orderBy('kode')->get();

        abort_if(
            $kriteria->count() < 2 || $alternatif->count() < 2,
            422,
            'Minimal diperlukan dua kriteria dan dua alternatif.'
        );

        $kriteriaIds = $kriteria->pluck('id')->all();
        $alternatifIds = $alternatif->pluck('id')->all();

        $recordsKriteria = PerbandinganKriteria::all();

        $matrixKriteria = $ahp->matrix(
            $kriteriaIds,
            $recordsKriteria,
            'kriteria_1_id',
            'kriteria_2_id'
        );

        $hasilKriteria = $ahp->priority(
            $matrixKriteria,
            $kriteriaIds
        );

        $konsistensiKriteria = $ahp->consistency(
            $matrixKriteria,
            $hasilKriteria['weights'],
            $kriteriaIds
        );

        abort_if(
            $konsistensiKriteria['cr'] > 0.1,
            422,
            'Perbandingan kriteria belum konsisten.'
        );

        $bobotAlternatif = [];

        foreach ($kriteria as $itemKriteria) {
            $records = PerbandinganAlternatif::where(
                'kriteria_id',
                $itemKriteria->id
            )->get();

            $matrix = $ahp->matrix(
                $alternatifIds,
                $records,
                'alternatif_1_id',
                'alternatif_2_id'
            );

            $hasil = $ahp->priority(
                $matrix,
                $alternatifIds
            );

            $konsistensi = $ahp->consistency(
                $matrix,
                $hasil['weights'],
                $alternatifIds
            );

            abort_if(
                $konsistensi['cr'] > 0.1,
                422,
                "Perbandingan alternatif pada {$itemKriteria->kode} belum konsisten."
            );

            $bobotAlternatif[$itemKriteria->id] = $hasil['weights'];
        }

        $nilaiAkhir = [];

        foreach ($alternatifIds as $alternatifId) {
            $nilaiAkhir[$alternatifId] = 0;

            foreach ($kriteriaIds as $kriteriaId) {
                $nilaiAkhir[$alternatifId] +=
                    $hasilKriteria['weights'][$kriteriaId]
                    * $bobotAlternatif[$kriteriaId][$alternatifId];
            }
        }

        arsort($nilaiAkhir);

        DB::transaction(function () use ($nilaiAkhir) {
            $ranking = 1;

            foreach ($nilaiAkhir as $alternatifId => $nilai) {
                Alternatif::whereKey($alternatifId)->update([
                    'nilai_akhir' => $nilai,
                    'ranking' => $ranking++,
                ]);
            }
        });

        $ranking = Alternatif::orderBy('ranking')->get();

        return view('hasil.index', compact(
            'ranking',
            'kriteria',
            'hasilKriteria',
            'bobotAlternatif'
        ));
    }
}

Route

Tambahkan pada grup auth:

use App\Http\Controllers\HasilController;

Route::get('/hasil', [HasilController::class, 'index'])
    ->name('hasil.index');

View Ranking

Buat resources/views/hasil/index.blade.php:

@extends('layouts.app')

@section('title', 'Hasil AHP')

@section('content')
<h1 class="h4 mb-3">Hasil Ranking AHP</h1>

<div class="card border-0 shadow-sm mb-4">
    <div class="card-body">
        <div class="table-responsive">
            <table class="table table-bordered table-striped align-middle">
                <thead>
                    <tr>
                        <th width="100">Ranking</th>
                        <th>Kode</th>
                        <th>Alternatif</th>
                        <th>Nilai Akhir</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach($ranking as $item)
                        <tr>
                            <td>
                                <span class="badge text-bg-primary">
                                    {{ $item->ranking }}
                                </span>
                            </td>
                            <td>{{ $item->kode }}</td>
                            <td>{{ $item->nama }}</td>
                            <td>{{ number_format($item->nilai_akhir, 8) }}</td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
        </div>
    </div>
</div>

<div class="card border-0 shadow-sm">
    <div class="card-body">
        <h2 class="h5">Bobot Kriteria</h2>

        <table class="table table-bordered mb-0">
            <thead>
                <tr>
                    <th>Kriteria</th>
                    <th>Bobot</th>
                </tr>
            </thead>
            <tbody>
                @foreach($kriteria as $item)
                    <tr>
                        <td>{{ $item->kode }} - {{ $item->nama }}</td>
                        <td>
                            {{ number_format(
                                $hasilKriteria['weights'][$item->id],
                                6
                            ) }}
                        </td>
                    </tr>
                @endforeach
            </tbody>
        </table>
    </div>
</div>
@endsection

Tambahkan Menu Hasil

Pada navbar:

<a class="nav-link text-white" href="{{ route('hasil.index') }}">
    Hasil Ranking
</a>

Hasil

Ketika halaman hasil dibuka, aplikasi akan:

  1. Menghitung bobot kriteria.
  2. Memeriksa konsistensi kriteria.
  3. Menghitung bobot alternatif pada setiap kriteria.
  4. Memeriksa konsistensi masing-masing matriks alternatif.
  5. Mengalikan bobot kriteria dengan bobot alternatif.
  6. Menjumlahkan nilai setiap alternatif.
  7. Mengurutkan hasil dari nilai terbesar.
  8. Menyimpan nilai_akhir dan ranking ke tabel alternatif.
Tutorial AHP Laravel Hasil

Pengujian Akhir

Pastikan:

  • Login dan logout berjalan.
  • CRUD kriteria berjalan.
  • CRUD alternatif berjalan.
  • Perbandingan kriteria tersimpan.
  • CR kriteria ≤ 0,1.
  • Perbandingan alternatif tersedia pada seluruh kriteria.
  • CR alternatif pada setiap kriteria ≤ 0,1.
  • Nilai akhir tersimpan pada tabel alternatif.
  • Ranking ditampilkan dari nilai terbesar ke terkecil.

Selesai

Aplikasi AHP Laravel sudah memiliki alur lengkap mulai dari data master, matriks perbandingan, pengujian konsistensi, sampai ranking akhir.

Kembali ke Tutorial AHP Laravel