Tampilan Halaman Hasil Perhitungan Iterasi Curas
This commit is contained in:
parent
7b68598ee9
commit
d9daf8f054
|
@ -20,9 +20,11 @@ public function hitungKMeans()
|
||||||
});
|
});
|
||||||
|
|
||||||
$iterasi = [];
|
$iterasi = [];
|
||||||
|
$prevAssignment = [];
|
||||||
|
|
||||||
for ($i = 0; $i < $maxIterasi; $i++) {
|
for ($i = 0; $i < $maxIterasi; $i++) {
|
||||||
$clustered = [];
|
$clustered = [];
|
||||||
|
$currentAssignment = [];
|
||||||
|
|
||||||
foreach ($data as $item) {
|
foreach ($data as $item) {
|
||||||
$jarak = [];
|
$jarak = [];
|
||||||
|
@ -32,51 +34,55 @@ public function hitungKMeans()
|
||||||
$jarak["jarakC" . ($idx + 1)] = $dist;
|
$jarak["jarakC" . ($idx + 1)] = $dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simpan jarak ke array iterasi
|
|
||||||
$iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak);
|
$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"
|
$minIndex = array_keys($jarak, min($jarak))[0]; // e.g. "jarakC2"
|
||||||
$clusterNumber = (int) str_replace("jarakC", "", $minIndex);
|
$clusterNumber = (int) str_replace("jarakC", "", $minIndex);
|
||||||
|
|
||||||
$clustered[$clusterNumber][] = $item;
|
$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
|
// Update centroid berdasarkan rata-rata
|
||||||
foreach ($clustered as $key => $group) {
|
foreach ($clustered as $key => $group) {
|
||||||
$avg = collect($group)->avg('jumlah_curas');
|
$avg = collect($group)->avg('jumlah_curas');
|
||||||
$centroids = $centroids->map(function ($item, $index) use ($key, $avg) {
|
$centroids = $centroids->map(function ($item, $index) use ($key, $avg) {
|
||||||
if ($index === ($key - 1)) {
|
return $index === ($key - 1)
|
||||||
return ['jumlah_curas' => $avg];
|
? ['jumlah_curas' => $avg]
|
||||||
}
|
: $item;
|
||||||
return $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) {
|
$finalCentroids = $centroids->map(function ($item, $index) {
|
||||||
return ['index' => $index + 1, 'jumlah_curas' => $item['jumlah_curas']];
|
return ['index' => $index + 1, 'jumlah_curas' => $item['jumlah_curas']];
|
||||||
})->sortBy('jumlah_curas')->values();
|
})->sortBy('jumlah_curas')->values();
|
||||||
|
|
||||||
// 2. Mapping: urutan jumlah_curas kecil = aman (id 1), sedang (id 2), besar = rawan (id 3)
|
|
||||||
$centroidToKlaster = [
|
$centroidToKlaster = [
|
||||||
$finalCentroids[0]['index'] => 1, // aman
|
$finalCentroids[0]['index'] => 1, // aman
|
||||||
$finalCentroids[1]['index'] => 2, // sedang
|
$finalCentroids[1]['index'] => 2, // sedang
|
||||||
$finalCentroids[2]['index'] => 3, // rawan
|
$finalCentroids[2]['index'] => 3, // rawan
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Update ke database
|
||||||
// Update klaster_id di database
|
|
||||||
foreach ($data as $item) {
|
foreach ($data as $item) {
|
||||||
Curas::where('id', $item->id)->update([
|
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);
|
return response()->json($iterasi);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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'));
|
||||||
|
}
|
||||||
|
}
|
|
@ -46,7 +46,7 @@ public function run(): void
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Kecamatan::create([
|
Kecamatan::create([
|
||||||
'nama_kecamatan'=> 'Krenjengan',
|
'nama_kecamatan'=> 'Krejengan',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Kecamatan::create([
|
Kecamatan::create([
|
||||||
|
|
|
@ -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>
|
|
@ -5,6 +5,7 @@
|
||||||
use App\Http\Controllers\KlasterController;
|
use App\Http\Controllers\KlasterController;
|
||||||
use App\Http\Controllers\CuranmorController;
|
use App\Http\Controllers\CuranmorController;
|
||||||
use App\Http\Controllers\curasKmeansController;
|
use App\Http\Controllers\curasKmeansController;
|
||||||
|
use App\Http\Controllers\hasilIterasiController;
|
||||||
use App\Http\Controllers\KecamatanController;
|
use App\Http\Controllers\KecamatanController;
|
||||||
|
|
||||||
Route::get('/', function () {
|
Route::get('/', function () {
|
||||||
|
@ -29,3 +30,4 @@
|
||||||
Route::resource('/curanmor', CuranmorController::class) ->parameters(['data-curanmor' => 'curanmor']);
|
Route::resource('/curanmor', CuranmorController::class) ->parameters(['data-curanmor' => 'curanmor']);
|
||||||
Route::resource('/klaster', KlasterController::class) ->parameters(['data-klaster' => 'klaster']);
|
Route::resource('/klaster', KlasterController::class) ->parameters(['data-klaster' => 'klaster']);
|
||||||
Route::get('/hitung-kmeans', [curasKmeansController::class, 'hitungKMeans']);
|
Route::get('/hitung-kmeans', [curasKmeansController::class, 'hitungKMeans']);
|
||||||
|
Route::get('/iterasiCuras', [hasilIterasiController::class, 'iterasiCuras']);
|
||||||
|
|
Loading…
Reference in New Issue