Tampilan Halaman Hasil Perhitungan Iterasi Curas

This commit is contained in:
daffarahman11 2025-04-07 18:04:29 +07:00
parent 7b68598ee9
commit d9daf8f054
5 changed files with 158 additions and 63 deletions

View File

@ -20,9 +20,11 @@ public function hitungKMeans()
});
$iterasi = [];
$prevAssignment = [];
for ($i = 0; $i < $maxIterasi; $i++) {
$clustered = [];
$currentAssignment = [];
foreach ($data as $item) {
$jarak = [];
@ -32,51 +34,55 @@ public function hitungKMeans()
$jarak["jarakC" . ($idx + 1)] = $dist;
}
// Simpan jarak ke array iterasi
$iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak);
// Tentukan klaster berdasarkan jarak terpendek
$minIndex = array_keys($jarak, min($jarak))[0]; // e.g. "jarakC2"
$clusterNumber = (int) str_replace("jarakC", "", $minIndex);
$clustered[$clusterNumber][] = $item;
$item->temp_klaster = $clusterNumber; // Simpan klaster sementara
$item->temp_klaster = $clusterNumber;
$currentAssignment[$item->id] = $clusterNumber;
}
// ✨ Cek konvergensi: jika assignment sekarang == sebelumnya, break
if ($currentAssignment === $prevAssignment) {
break;
}
$prevAssignment = $currentAssignment;
// Update centroid berdasarkan rata-rata
foreach ($clustered as $key => $group) {
$avg = collect($group)->avg('jumlah_curas');
$centroids = $centroids->map(function ($item, $index) use ($key, $avg) {
if ($index === ($key - 1)) {
return ['jumlah_curas' => $avg];
}
return $item;
return $index === ($key - 1)
? ['jumlah_curas' => $avg]
: $item;
});
}
}
// 1. Ambil centroid terakhir dan urutkan dari kecil ke besar
// Final mapping centroid ke klaster_id (aman/sedang/rawan)
$finalCentroids = $centroids->map(function ($item, $index) {
return ['index' => $index + 1, 'jumlah_curas' => $item['jumlah_curas']];
})->sortBy('jumlah_curas')->values();
// 2. Mapping: urutan jumlah_curas kecil = aman (id 1), sedang (id 2), besar = rawan (id 3)
$centroidToKlaster = [
$finalCentroids[0]['index'] => 1, // aman
$finalCentroids[1]['index'] => 2, // sedang
$finalCentroids[2]['index'] => 3, // rawan
];
// Update klaster_id di database
// Update ke database
foreach ($data as $item) {
Curas::where('id', $item->id)->update([
'klaster_id' => $centroidToKlaster[$item->temp_klaster] // ← mapped ke klaster DB
'klaster_id' => $centroidToKlaster[$item->temp_klaster],
]);
}
session(['hasil_iterasi' => $iterasi]);
return response()->json($iterasi);
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class hasilIterasiController extends Controller
{
public function iterasiCuras()
{
$iterasi = session('hasil_iterasi');
dd($iterasi);
// Kirim ke view atau proses lainnya
return view('admin.dashboarditerasiCuras', compact('iterasi'));
}
}

View File

@ -46,7 +46,7 @@ public function run(): void
]);
Kecamatan::create([
'nama_kecamatan'=> 'Krenjengan',
'nama_kecamatan'=> 'Krejengan',
]);
Kecamatan::create([

View File

@ -0,0 +1,70 @@
<x-layoutAdmin>
<div class="content-page">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<div class="d-flex flex-wrap align-items-center justify-content-between mb-4">
<div>
<h4 class="mb-3">Iterasi K-Means Untuk Kasus Curas</h4>
<p class="mb-0">Sales enables you to effectively control sales KPIs and monitor them in one central<br>
place while helping teams to reach sales goals. </p>
</div>
<a href="/curas/create" class="btn btn-primary add-list"><i class="las la-plus mr-3"></i>Tambah Kasus Curas</a>
</div>
@if (session()->has('succes'))
<div class="alert alert-success" role="alert">
{{ session('succes') }}
</div>
@endif
@if (session()->has('error'))
<div class="alert alert-danger" role="alert">
{{ session('error') }}
</div>
@endif
</div>
<div class="col-lg-12">
@foreach ($iterasi as $i => $baris)
<h4>Iterasi {{ $i + 1 }}</h4>
<div class="table-responsive rounded mb-3">
<table class="data-table table mb-0 tbl-server-info">
<thead class="bg-white text-uppercase">
<tr class="ligth ligth-data">
<th>
<div class="checkbox d-inline-block">
<input type="checkbox" class="checkbox-input" id="checkbox1">
<label for="checkbox1" class="mb-0"></label>
</div>
</th>
<th>No</th>
<th>Nama Kecamatan</th>
<th>Jarak Ke Centroid 1</th>
<th>Jarak Ke Centroid 2</th>
<th>Jarak Ke Centroid 3</th>
</tr>
</thead>
@foreach ($baris as $row)
<tbody class="ligth-body">
<tr>
<td>
<div class="checkbox d-inline-block">
<input type="checkbox" class="checkbox-input" id="checkbox2">
<label for="checkbox2" class="mb-0"></label>
</div>
</td>
<td>{{ $loop->iteration }}</td>
<td>{{ $row['kecamatan_id'] }}</td>
<td>{{ $row['jarakC1'] }}</td>
<td>{{ $row['jarakC2'] }}</td>
<td>{{ $row['jarakC3'] }}</td>
</tr>
</tbody>
@endforeach
</table>
</div>
@endforeach
</div>
</div>
<!-- Page end -->
</div>
</div>
</x-layoutAdmin>

View File

@ -5,6 +5,7 @@
use App\Http\Controllers\KlasterController;
use App\Http\Controllers\CuranmorController;
use App\Http\Controllers\curasKmeansController;
use App\Http\Controllers\hasilIterasiController;
use App\Http\Controllers\KecamatanController;
Route::get('/', function () {
@ -29,3 +30,4 @@
Route::resource('/curanmor', CuranmorController::class) ->parameters(['data-curanmor' => 'curanmor']);
Route::resource('/klaster', KlasterController::class) ->parameters(['data-klaster' => 'klaster']);
Route::get('/hitung-kmeans', [curasKmeansController::class, 'hitungKMeans']);
Route::get('/iterasiCuras', [hasilIterasiController::class, 'iterasiCuras']);