From df989d15511538325df26346f0c84a893c470258 Mon Sep 17 00:00:00 2001 From: daffarahman11 Date: Sun, 18 May 2025 21:47:21 +0700 Subject: [PATCH] FIX BUAT SIDANG --- app/Http/Controllers/LandingController.php | 19 ++++++++++++ app/Services/KMeansService.php | 34 +++++++++++++++------- routes/web.php | 1 + 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/LandingController.php b/app/Http/Controllers/LandingController.php index 9cab29f..448061b 100644 --- a/app/Http/Controllers/LandingController.php +++ b/app/Http/Controllers/LandingController.php @@ -6,6 +6,7 @@ use App\Models\Klaster; use App\Models\Curanmor; use Illuminate\Http\Request; +use App\Services\KMeansService; class LandingController extends Controller { @@ -18,5 +19,23 @@ public function index() $tanggalCuranmor = \Carbon\Carbon::parse($updateCuranmor->updated_at)->translatedFormat('d F Y'); return view('landing', compact('klasters', 'tanggalCuras', 'tanggalCuranmor')); } + public function runKmeans() +{ + + $serviceKMeans = new KMeansService(); + $serviceKMeans->SSEElbowCuranmor(); + $serviceKMeans->SSEElbowCuras(); + + $serviceKMeansCuras = new KMeansService(); + $hasilKMeansCuras = $serviceKMeansCuras->hitungKMeansCuras(); + file_put_contents(storage_path('app/public/hasil_kmeans_curas.json'), json_encode($hasilKMeansCuras)); + + $serviceKmeansCuranmor = new KMeansService(); + $hasilKMeansCuranmor = $serviceKmeansCuranmor->hitungKMeansCuranmor(); + file_put_contents(storage_path('app/public/hasil_kmeans_curanmor.json'), json_encode($hasilKMeansCuranmor)); + + return redirect('/dashboard/curanmor'); +} + } diff --git a/app/Services/KMeansService.php b/app/Services/KMeansService.php index 3a30f0f..13a8fa6 100644 --- a/app/Services/KMeansService.php +++ b/app/Services/KMeansService.php @@ -15,7 +15,6 @@ public function hitungKMeansCuras() $k = Klaster::count('id'); $maxIterasi = 100; - // Ambil centroid awal yang unik $minValue = $data->min('jumlah_curas'); $maxValue = $data->max('jumlah_curas'); @@ -88,9 +87,6 @@ public function hitungKMeansCuras() // Update ke database - - - foreach ($data as $item) { Curas::where('id', $item->id)->update([ 'klaster_id' => $centroidToKlaster[$item->temp_klaster], @@ -232,9 +228,17 @@ public function SSEElbowCuranmor() // Loop untuk setiap nilai k dari 2 hingga maxK for ($k = 2; $k <= $maxK; $k++) { - $centroids = collect(range(1, $k))->map(function () use ($min, $max) { - return ['jumlah_curanmor' => mt_rand($min, $max)]; - }); + $usedValues = []; + $centroids = collect(); + + while ($centroids->count() < $k) { + $randVal = mt_rand($min, $max); + if (!in_array($randVal, $usedValues)) { + $centroids->push(['jumlah_curanmor' => $randVal]); + $usedValues[] = $randVal; + } + } + $prevAssignment = []; @@ -301,7 +305,7 @@ public function SSEElbowCuranmor() public function SSEElbowCuras() { $data = Curas::select('id', 'jumlah_curas')->get(); - $maxK = 10; + $maxK = 4; $maxIterasi = 100; $elbowData = []; @@ -310,9 +314,17 @@ public function SSEElbowCuras() // Loop untuk setiap nilai k dari 2 hingga maxK for ($k = 2; $k <= $maxK; $k++) { - $centroids = collect(range(1, $k))->map(function () use ($min, $max) { - return ['jumlah_curas' => mt_rand($min, $max)]; - }); + $usedValues = []; + $centroids = collect(); + + while ($centroids->count() < $k) { + $randVal = mt_rand($min, $max); + if (!in_array($randVal, $usedValues)) { + $centroids->push(['jumlah_curas' => $randVal]); + $usedValues[] = $randVal; + } + } + $prevAssignment = []; diff --git a/routes/web.php b/routes/web.php index 3c69899..a8b1971 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,6 +14,7 @@ use App\Http\Controllers\TampilHitunganController; // Route Landing +Route::get('/kmeans', [LandingController::class, 'runKmeans']); Route::get('/', [LandingController::class, 'index']); Route::get('/blank', function () { return view('admin.dashboardBlank');