diff --git a/app/Http/Controllers/KmeansController.php b/app/Http/Controllers/KmeansController.php index 203fe3b..3828c3a 100644 --- a/app/Http/Controllers/KmeansController.php +++ b/app/Http/Controllers/KmeansController.php @@ -10,115 +10,136 @@ class KmeansController extends Controller { public function KMeansCuras() -{ + { + $data = Curas::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curas')->orderBy('jumlah_curas', 'asc')->get(); - $data = Curas::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curas')->orderBy('jumlah_curas', 'asc')->get(); + $k = Klaster::count('id'); + $maxIterasi = 100; - $k = Klaster::count('id'); - $maxIterasi = 100; + $uniqueCount = $data->unique('jumlah_curas')->count(); + if ($uniqueCount < $k) { + throw new \Exception("Jumlah nilai unik pada 'jumlah_curas' ($uniqueCount) kurang dari jumlah klaster ($k). Pastikan data memiliki variasi yang cukup."); + } - // Simpan centroid awal ke variabel terpisah - $uniqueJumlahCuras = $data->pluck('jumlah_curas')->unique()->shuffle()->take($k)->values(); + // Ambil centroid awal yang unik + // Gunakan centroid tetap - $initialCentroids = $uniqueJumlahCuras->map(function ($jumlah) { - return ['jumlah_curas' => $jumlah]; - }); + $centroidValues = [0, 1, 3]; + $centroids = collect($centroidValues)->map(function ($val) { + return ['jumlah_curas' => $val]; + }); + // Simpan centroid awal sebelum iterasi + $centroidAwal = $centroids->toArray(); - // Salin untuk digunakan dalam proses iterasi - $centroids = $initialCentroids->map(function ($item) { - return $item; - }); + $iterasi = []; + $prevAssignment = []; - $iterasi = []; - $prevAssignment = []; + for ($i = 0; $i < $maxIterasi; $i++) { + $clustered = []; + $currentAssignment = []; - for ($i = 0; $i < $maxIterasi; $i++) { - $clustered = []; - $currentAssignment = []; + foreach ($data as $item) { + $jarak = []; - foreach ($data as $item) { - $jarak = []; + foreach ($centroids as $idx => $centroid) { + $dist = abs($item->jumlah_curas - $centroid['jumlah_curas']); + $jarak["C" . ($idx + 1)] = $dist; + } - foreach ($centroids as $idx => $centroid) { - $dist = abs($item->jumlah_curas - $centroid['jumlah_curas']); - $jarak["jarakC" . ($idx + 1)] = $dist; + $iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak); + + $minIndex = array_keys($jarak, min($jarak))[0]; // e.g. "jarakC2" + $clusterNumber = (int) str_replace("C", "", $minIndex); + + $clustered[$clusterNumber][] = $item; + $item->temp_klaster = $clusterNumber; + $currentAssignment[$item->id] = $clusterNumber; } - $iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak); + // ✨ Cek konvergensi: jika assignment sekarang == sebelumnya, break + if ($currentAssignment === $prevAssignment) { + break; + } - $minIndex = array_keys($jarak, min($jarak))[0]; // e.g. "jarakC2" - $clusterNumber = (int) str_replace("jarakC", "", $minIndex); + $prevAssignment = $currentAssignment; - $clustered[$clusterNumber][] = $item; - $item->temp_klaster = $clusterNumber; - $currentAssignment[$item->id] = $clusterNumber; + + + // 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) { + return $index === ($key - 1) + ? ['jumlah_curas' => $avg] + : $item; + }); + } + } + + + // 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(); + + $centroidToKlaster = []; + + foreach ($finalCentroids as $i => $centroid) { + // Klaster ID mulai dari 1 (asumsi klaster di DB bernomor 1, 2, 3, ...) + $centroidToKlaster[$centroid['index']] = $i + 1; } - if ($currentAssignment === $prevAssignment) { - break; + + // Update ke database + foreach ($data as $item) { + Curas::where('id', $item->id)->update([ + 'klaster_id' => $centroidToKlaster[$item->temp_klaster], + ]); } - $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) { - return $index === ($key - 1) - ? ['jumlah_curas' => $avg] - : $item; - }); - } + $centroidAwalFormatted = collect($centroidAwal)->values()->map(function ($item, $index) { + return ['C' . ($index + 1) => $item['jumlah_curas']]; + }); + + + $hasil = [ + 'centroid_awal' => $centroidAwalFormatted, + 'iterasi' => $iterasi + ]; + + file_put_contents( + storage_path('app/public/hasil_kmeans_curas.json'), + json_encode($hasil, JSON_PRETTY_PRINT) + ); + + return redirect('/dashboard/TampilHitungCuras'); + } - // Final mapping centroid ke klaster_id - $finalCentroids = $centroids->map(function ($item, $index) { - return ['index' => $index + 1, 'jumlah_curas' => $item['jumlah_curas']]; - })->sortBy('jumlah_curas')->values(); - - $centroidToKlaster = []; - foreach ($finalCentroids as $i => $centroid) { - $centroidToKlaster[$centroid['index']] = $i + 1; - } - - foreach ($data as $item) { - Curas::where('id', $item->id)->update([ - 'klaster_id' => $centroidToKlaster[$item->temp_klaster], - ]); - } - - // Simpan hasil iterasi dan centroid awal ke session - session([ - 'hasil_iterasi' => $iterasi, - 'centroid_awal' => $initialCentroids - ]); - - // Format ulang centroid awal dengan label 'Centroid 1', dst. - $formattedInitialCentroids = []; - foreach ($initialCentroids as $i => $centroid) { - $formattedInitialCentroids['Centroid ' . ($i + 1)] = $centroid['jumlah_curas']; - } - - return response()->json([ - 'centroid_awal' => $formattedInitialCentroids, - 'hasil_iterasi' => $iterasi, - ]); -} - public function KMeansCuranmor() -{ - $data = Curanmor::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curanmor')->orderBy('jumlah_curanmor', 'asc')->get(); - $maxIterasi = 100; - $hasilElbow = []; + { + $data = Curanmor::select('id', 'kecamatan_id', 'klaster_id', 'jumlah_curanmor')->orderBy('jumlah_curanmor', 'asc')->get(); - for ($k = 1; $k <= 10; $k++) { - // Ambil centroid awal secara acak - $centroids = $data->random($k)->values()->map(function ($item) { - return ['jumlah_curanmor' => $item->jumlah_curanmor]; + $k = Klaster::count('id'); + $maxIterasi = 100; + + $uniqueCount = $data->unique('jumlah_curanmor')->count(); + if ($uniqueCount < $k) { + throw new \Exception("Jumlah nilai unik pada 'jumlah_curanmor' ($uniqueCount) kurang dari jumlah klaster ($k). Pastikan data memiliki variasi yang cukup."); + } + + $centroidValues = [10, 20, 30]; + $centroids = collect($centroidValues)->map(function ($val) { + return ['jumlah_curanmor' => $val]; }); + // Simpan centroid awal sebelum iterasi + $centroidAwal = $centroids->toArray(); + + $iterasi = []; $prevAssignment = []; for ($i = 0; $i < $maxIterasi; $i++) { @@ -130,105 +151,77 @@ public function KMeansCuranmor() foreach ($centroids as $idx => $centroid) { $dist = abs($item->jumlah_curanmor - $centroid['jumlah_curanmor']); - $jarak[$idx] = $dist; + $jarak["C" . ($idx + 1)] = $dist; } - $minIndex = array_keys($jarak, min($jarak))[0]; - $clustered[$minIndex][] = $item; - $currentAssignment[$item->id] = $minIndex; - $item->temp_klaster = $minIndex; + $iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak); + + $minIndex = array_keys($jarak, min($jarak))[0]; // e.g. "jarakC2" + $clusterNumber = (int) str_replace("C", "", $minIndex); + + $clustered[$clusterNumber][] = $item; + $item->temp_klaster = $clusterNumber; + $currentAssignment[$item->id] = $clusterNumber; + } + + // ✨ Cek konvergensi: jika assignment sekarang == sebelumnya, break + if ($currentAssignment === $prevAssignment) { + break; } - if ($currentAssignment === $prevAssignment) break; $prevAssignment = $currentAssignment; + + + // Update centroid berdasarkan rata-rata foreach ($clustered as $key => $group) { $avg = collect($group)->avg('jumlah_curanmor'); - $centroids[$key] = ['jumlah_curanmor' => $avg]; + $centroids = $centroids->map(function ($item, $index) use ($key, $avg) { + return $index === ($key - 1) + ? ['jumlah_curanmor' => $avg] + : $item; + }); } } + - // Hitung SSE (Sum of Squared Errors) - $sse = 0; + // Final mapping centroid ke klaster_id (aman/sedang/rawan) + $finalCentroids = $centroids->map(function ($item, $index) { + return ['index' => $index + 1, 'jumlah_curanmor' => $item['jumlah_curanmor']]; + })->sortBy('jumlah_curanmor')->values(); + + $centroidToKlaster = []; + + foreach ($finalCentroids as $i => $centroid) { + // Klaster ID mulai dari 1 (asumsi klaster di DB bernomor 1, 2, 3, ...) + $centroidToKlaster[$centroid['index']] = $i + 1; + } + + + // Update ke database foreach ($data as $item) { - $centroidVal = $centroids[$item->temp_klaster]['jumlah_curanmor']; - $sse += pow($item->jumlah_curanmor - $centroidVal, 2); + Curanmor::where('id', $item->id)->update([ + 'klaster_id' => $centroidToKlaster[$item->temp_klaster], + ]); } - $hasilElbow[] = ['k' => $k, 'sse' => $sse]; + + $centroidAwalFormatted = collect($centroidAwal)->values()->map(function ($item, $index) { + return ['C' . ($index + 1) => $item['jumlah_curanmor']]; + }); + + $hasil = [ + 'centroid_awal' => $centroidAwalFormatted, + 'iterasi' => $iterasi + ]; + + file_put_contents( + storage_path('app/public/hasil_kmeans_curanmor.json'), + json_encode($hasil, JSON_PRETTY_PRINT) + ); + + return redirect('/dashboard/TampilHitungCuranmor'); + } - // Simpan hasil Elbow Method ke file - file_put_contents(storage_path('app/public/hasil_elbow_curanmor.json'), json_encode($hasilElbow, JSON_PRETTY_PRINT)); - - // ===================== // - // === Hitung k akhir === // - // ===================== // - - $k = Klaster::count(); // misalnya 3 - $centroids = $data->random($k)->values()->map(function ($item) { - return ['jumlah_curanmor' => $item->jumlah_curanmor]; - }); - - $iterasi = []; - $prevAssignment = []; - - for ($i = 0; $i < $maxIterasi; $i++) { - $clustered = []; - $currentAssignment = []; - - foreach ($data as $item) { - $jarak = []; - - foreach ($centroids as $idx => $centroid) { - $dist = abs($item->jumlah_curanmor - $centroid['jumlah_curanmor']); - $jarak["jarakC" . ($idx + 1)] = $dist; - } - - $iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak); - - $minIndex = array_keys($jarak, min($jarak))[0]; - $clusterNumber = (int) str_replace("jarakC", "", $minIndex); - - $clustered[$clusterNumber][] = $item; - $item->temp_klaster = $clusterNumber; - $currentAssignment[$item->id] = $clusterNumber; - } - - if ($currentAssignment === $prevAssignment) { - break; - } - - $prevAssignment = $currentAssignment; - - foreach ($clustered as $key => $group) { - $avg = collect($group)->avg('jumlah_curanmor'); - $centroids = $centroids->map(function ($item, $index) use ($key, $avg) { - return $index === ($key - 1) - ? ['jumlah_curanmor' => $avg] - : $item; - }); - } - } - - $finalCentroids = $centroids->map(function ($item, $index) { - return ['index' => $index + 1, 'jumlah_curanmor' => $item['jumlah_curanmor']]; - })->sortBy('jumlah_curanmor')->values(); - - $centroidToKlaster = []; - - foreach ($finalCentroids as $i => $centroid) { - $centroidToKlaster[$centroid['index']] = $i + 1; - } - - foreach ($data as $item) { - Curanmor::where('id', $item->id)->update([ - 'klaster_id' => $centroidToKlaster[$item->temp_klaster], - ]); - } - - session(['hasil_iterasi' => $iterasi]); - return $iterasi; -} - } diff --git a/app/Http/Controllers/TampilHitunganController.php b/app/Http/Controllers/TampilHitunganController.php new file mode 100644 index 0000000..a43b48b --- /dev/null +++ b/app/Http/Controllers/TampilHitunganController.php @@ -0,0 +1,41 @@ +toArray(); + + return view('admin.HitungKmeans.HitunganCuras', compact('data', 'kecamatan')); + } + + public function TampilHitungCuranmor() + { + $file = storage_path('app/public/hasil_kmeans_curanmor.json'); + + if (!file_exists($file)) { + return abort(404, 'File hasil KMeans tidak ditemukan.'); + } + + $data = json_decode(file_get_contents($file), true); + + // Ambil nama kecamatan berdasarkan ID + $kecamatan = Kecamatan::pluck('nama_kecamatan', 'id')->toArray(); + + return view('admin.HitungKmeans.HitunganCuranmor', compact('data', 'kecamatan')); + } +} diff --git a/app/Http/Controllers/hasilIterasiController.php b/app/Http/Controllers/hasilIterasiController.php deleted file mode 100644 index 4962157..0000000 --- a/app/Http/Controllers/hasilIterasiController.php +++ /dev/null @@ -1,17 +0,0 @@ -random($k)->values()->map(function ($item) { - return [ - 'jumlah_curas' => $item->jumlah_curas, - ]; - }); + + $uniqueCount = $data->unique('jumlah_curas')->count(); + if ($uniqueCount < $k) { + throw new \Exception("Jumlah nilai unik pada 'jumlah_curas' ($uniqueCount) kurang dari jumlah klaster ($k). Pastikan data memiliki variasi yang cukup."); + } + + // Ambil centroid awal yang unik + $centroids = $data->unique('jumlah_curas') // Pastikan nilai unik + ->shuffle() // Acak + ->take($k) // Ambil k data + ->values() + ->map(function ($item) { + return [ + 'jumlah_curas' => $item->jumlah_curas, + ]; + }); + + // Simpan centroid awal sebelum iterasi + $centroidAwal = $centroids->toArray(); $iterasi = []; $prevAssignment = []; @@ -33,13 +47,13 @@ public function hitungKMeansCuras() foreach ($centroids as $idx => $centroid) { $dist = abs($item->jumlah_curas - $centroid['jumlah_curas']); - $jarak["jarakC" . ($idx + 1)] = $dist; + $jarak["C" . ($idx + 1)] = $dist; } $iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak); $minIndex = array_keys($jarak, min($jarak))[0]; // e.g. "jarakC2" - $clusterNumber = (int) str_replace("jarakC", "", $minIndex); + $clusterNumber = (int) str_replace("C", "", $minIndex); $clustered[$clusterNumber][] = $item; $item->temp_klaster = $clusterNumber; @@ -88,7 +102,15 @@ public function hitungKMeansCuras() } - return $iterasi; + $centroidAwalFormatted = collect($centroidAwal)->values()->map(function ($item, $index) { + return ['C' . ($index + 1) => $item['jumlah_curas']]; + }); + + return [ + 'centroid_awal' => $centroidAwalFormatted, + 'iterasi' => $iterasi + ]; + } @@ -98,11 +120,25 @@ public function hitungKMeansCuranmor() $k = Klaster::count('id'); $maxIterasi = 100; - $centroids = $data->random($k)->values()->map(function ($item) { - return [ - 'jumlah_curanmor' => $item->jumlah_curanmor, - ]; - }); + + $uniqueCount = $data->unique('jumlah_curanmor')->count(); + if ($uniqueCount < $k) { + throw new \Exception("Jumlah nilai unik pada 'jumlah_curanmor' ($uniqueCount) kurang dari jumlah klaster ($k). Pastikan data memiliki variasi yang cukup."); + } + + // Ambil centroid awal yang unik + $centroids = $data->unique('jumlah_curanmor') // Pastikan nilai unik + ->shuffle() // Acak + ->take($k) // Ambil k data + ->values() + ->map(function ($item) { + return [ + 'jumlah_curanmor' => $item->jumlah_curanmor, + ]; + }); + + // Simpan centroid awal sebelum iterasi + $centroidAwal = $centroids->toArray(); $iterasi = []; $prevAssignment = []; @@ -116,13 +152,13 @@ public function hitungKMeansCuranmor() foreach ($centroids as $idx => $centroid) { $dist = abs($item->jumlah_curanmor - $centroid['jumlah_curanmor']); - $jarak["jarakC" . ($idx + 1)] = $dist; + $jarak["C" . ($idx + 1)] = $dist; } $iterasi[$i][] = array_merge(['kecamatan_id' => $item->kecamatan_id], $jarak); $minIndex = array_keys($jarak, min($jarak))[0]; // e.g. "jarakC2" - $clusterNumber = (int) str_replace("jarakC", "", $minIndex); + $clusterNumber = (int) str_replace("C", "", $minIndex); $clustered[$clusterNumber][] = $item; $item->temp_klaster = $clusterNumber; @@ -170,8 +206,162 @@ public function hitungKMeansCuranmor() ]); } - session(['hasil_iterasi' => $iterasi]); - return $iterasi; + $centroidAwalFormatted = collect($centroidAwal)->values()->map(function ($item, $index) { + return ['C' . ($index + 1) => $item['jumlah_curanmor']]; + }); + + return [ + 'centroid_awal' => $centroidAwalFormatted, + 'iterasi' => $iterasi + ]; + } + + public function SSEElbowCuras() + { + $data = Curas::select('id', 'jumlah_curas')->get(); + $maxK = 10; + $maxIterasi = 100; + $elbowData = []; + + for ($k = 1; $k <= $maxK; $k++) { + // Inisialisasi centroid awal secara acak + $centroids = $data->unique('jumlah_curas')->shuffle()->take($k)->values()->map(function ($item) { + return ['jumlah_curas' => $item->jumlah_curas]; + }); + + $prevAssignment = []; + + for ($iter = 0; $iter < $maxIterasi; $iter++) { + $clustered = []; + $currentAssignment = []; + + foreach ($data as $item) { + $jarak = []; + + foreach ($centroids as $idx => $centroid) { + $dist = abs($item->jumlah_curas - $centroid['jumlah_curas']); + $jarak[$idx] = $dist; + } + + $minIndex = array_keys($jarak, min($jarak))[0]; + $clustered[$minIndex][] = $item; + $currentAssignment[$item->id] = $minIndex; + } + + if ($currentAssignment === $prevAssignment) { + break; + } + + $prevAssignment = $currentAssignment; + + // Update centroid + foreach ($clustered as $key => $group) { + $avg = collect($group)->avg('jumlah_curas'); + $centroids = $centroids->map(function ($centroid, $idx) use ($key, $avg) { + return $idx == $key + ? ['jumlah_curas' => $avg] + : $centroid; + }); + } + } + + // Hitung SSE untuk k saat ini + $sse = 0; + foreach ($clustered as $key => $group) { + $centroidVal = $centroids[$key]['jumlah_curas']; + foreach ($group as $item) { + $sse += pow($item->jumlah_curas - $centroidVal, 2); + } + } + + $elbowData[] = [ + 'k' => $k, + 'sse' => $sse + ]; + } + + // Simpan ke file + file_put_contents( + storage_path('app/public/sse_elbow_curas.json'), + json_encode($elbowData, JSON_PRETTY_PRINT) + ); + + } + + public function SSEElbowCuranmor() + { + $data = Curanmor::select('id', 'jumlah_curanmor')->get(); + $maxK = 10; + $maxIterasi = 100; + $elbowData = []; + + for ($k = 1; $k <= $maxK; $k++) { + + srand(time()); + // Inisialisasi centroid awal secara acak + $centroids = $data->unique('jumlah_curanmor')->shuffle()->take($k)->values()->map(function ($item) { + return ['jumlah_curanmor' => $item->jumlah_curanmor]; + }); + + $prevAssignment = []; + + for ($iter = 0; $iter < $maxIterasi; $iter++) { + $clustered = []; + $currentAssignment = []; + + foreach ($data as $item) { + $jarak = []; + + foreach ($centroids as $idx => $centroid) { + $dist = abs($item->jumlah_curanmor - $centroid['jumlah_curanmor']); + $jarak[$idx] = $dist; + } + + $minIndex = array_keys($jarak, min($jarak))[0]; + $clustered[$minIndex][] = $item; + $currentAssignment[$item->id] = $minIndex; + } + + if ($currentAssignment === $prevAssignment) { + break; + } + + $prevAssignment = $currentAssignment; + + // Update centroid + foreach ($clustered as $key => $group) { + $avg = collect($group)->avg('jumlah_curanmor'); + $centroids = $centroids->map(function ($centroid, $idx) use ($key, $avg) { + return $idx == $key + ? ['jumlah_curanmor' => $avg] + : $centroid; + }); + } + } + + // Hitung SSE untuk k saat ini + $sse = 0; + foreach ($clustered as $key => $group) { + $centroidVal = $centroids[$key]['jumlah_curanmor']; + foreach ($group as $item) { + $sse += pow($item->jumlah_curanmor - $centroidVal, 2); + } + } + + $elbowData[] = [ + 'k' => $k, + 'sse' => $sse + ]; + } + + // Simpan ke file + file_put_contents( + storage_path('app/public/sse_elbow_curanmor.json'), + json_encode($elbowData, JSON_PRETTY_PRINT) + ); + + } + } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 4ac8bd0..3ea5911 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -25,6 +25,12 @@ public function run(): void CuranmorSeeder::class, ]); + $serviceKMeansCuras = new KMeansService(); + $hasilKMeansCuras = $serviceKMeansCuras->SSEElbowCuras(); + + $serviceKMeansCuras = new KMeansService(); + $hasilKMeansCuras = $serviceKMeansCuras->SSEElbowCuranmor(); + $serviceKMeansCuras = new KMeansService(); $hasilKMeansCuras = $serviceKMeansCuras->hitungKMeansCuras(); file_put_contents(storage_path('app/public/hasil_kmeans_curas.json'), json_encode($hasilKMeansCuras)); diff --git a/database/seeders/KlasterSeeder.php b/database/seeders/KlasterSeeder.php index 2c4b13d..cbf0f27 100644 --- a/database/seeders/KlasterSeeder.php +++ b/database/seeders/KlasterSeeder.php @@ -18,14 +18,14 @@ public function run(): void 'warna'=> '#00FF00', ]); - Klaster::create([ - 'nama_klaster'=> 'Sedang', - 'warna'=> '#FFFF00', - ]); - - Klaster::create([ - 'nama_klaster'=> 'Rawan', - 'warna'=> '#FF0000', - ]); + Klaster::create([ + 'nama_klaster'=> 'Sedang', + 'warna'=> '#FFFF00', + ]); + + Klaster::create([ + 'nama_klaster'=> 'Rawan', + 'warna'=> '#FF0000', + ]); } } diff --git a/resources/views/admin/HitungKmeans/HitunganCuranmor.blade.php b/resources/views/admin/HitungKmeans/HitunganCuranmor.blade.php new file mode 100644 index 0000000..133e5c7 --- /dev/null +++ b/resources/views/admin/HitungKmeans/HitunganCuranmor.blade.php @@ -0,0 +1,91 @@ + +
+
+
+
+
+
+

Detail Perhitungan Curanmor

+

Berikut merupakan detail perhitungan jarak antar setiap data terhadap setiap centroid pada masing masing iterasi.

+
+ +
+ @if (session()->has('succes')) + + @endif + @if (session()->has('error')) + + @endif +
+
+
Nilai Centroid Awal
+ + + + @foreach ($data['centroid_awal'] as $centroid) + + @endforeach + + + + + @foreach ($data['centroid_awal'] as $centroid) + + @endforeach + + +
{{ array_key_first($centroid) }}
{{ array_values($centroid)[0] }}
+
+
+


+ @foreach ($data['iterasi'] as $index => $iterasi) +
Iterasi ke-{{ $index + 1 }}
+
+ + + + + @foreach (array_keys($iterasi[0]) as $key) + @if ($key !== 'kecamatan_id') + + @endif + @endforeach + + + + + @foreach ($iterasi as $row) + @php + $minKey = null; + $minVal = INF; + foreach ($row as $key => $val) { + if (strpos($key, 'C') === 0 && $val < $minVal) { + $minVal = $val; + $minKey = $key; + } + } + @endphp + + + @foreach ($row as $key => $val) + @if ($key !== 'kecamatan_id') + + @endif + @endforeach + + + @endforeach + +
Nama Kecamatan{{ $key }}Hasil
{{ $kecamatan[$row['kecamatan_id']] ?? 'Tidak Diketahui' }}{{ $val }}{{ strtoupper($minKey) }}
+
+ @endforeach +
+
+ +
+
+
\ No newline at end of file diff --git a/resources/views/admin/HitungKmeans/HitunganCuras.blade.php b/resources/views/admin/HitungKmeans/HitunganCuras.blade.php new file mode 100644 index 0000000..0c3d51a --- /dev/null +++ b/resources/views/admin/HitungKmeans/HitunganCuras.blade.php @@ -0,0 +1,91 @@ + +
+
+
+
+
+
+

Detail Perhitungan Curas

+

Berikut merupakan detail perhitungan jarak antar setiap data terhadap setiap centroid pada masing masing iterasi.

+
+ +
+ @if (session()->has('succes')) + + @endif + @if (session()->has('error')) + + @endif +
+
+
Nilai Centroid Awal
+ + + + @foreach ($data['centroid_awal'] as $centroid) + + @endforeach + + + + + @foreach ($data['centroid_awal'] as $centroid) + + @endforeach + + +
{{ array_key_first($centroid) }}
{{ array_values($centroid)[0] }}
+
+
+


+ @foreach ($data['iterasi'] as $index => $iterasi) +
Iterasi ke-{{ $index + 1 }}
+
+ + + + + @foreach (array_keys($iterasi[0]) as $key) + @if ($key !== 'kecamatan_id') + + @endif + @endforeach + + + + + @foreach ($iterasi as $row) + @php + $minKey = null; + $minVal = INF; + foreach ($row as $key => $val) { + if (strpos($key, 'C') === 0 && $val < $minVal) { + $minVal = $val; + $minKey = $key; + } + } + @endphp + + + @foreach ($row as $key => $val) + @if ($key !== 'kecamatan_id') + + @endif + @endforeach + + + @endforeach + +
Nama Kecamatan{{ $key }}Hasil
{{ $kecamatan[$row['kecamatan_id']] ?? 'Tidak Diketahui' }}{{ $val }}{{ strtoupper($minKey) }}
+
+ @endforeach +
+
+ +
+
+
\ No newline at end of file diff --git a/resources/views/admin/dashboardTambahKecamatan.blade.php b/resources/views/admin/dashboardTambahKecamatan.blade.php index d75da97..e20a977 100644 --- a/resources/views/admin/dashboardTambahKecamatan.blade.php +++ b/resources/views/admin/dashboardTambahKecamatan.blade.php @@ -1,6 +1,7 @@
-
+
diff --git a/routes/web.php b/routes/web.php index e7675e3..bcdfb07 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,20 +10,32 @@ use App\Http\Controllers\dashboardController; use App\Http\Controllers\KecamatanController; use App\Http\Controllers\DetailCurasController; -use App\Http\Controllers\hasilIterasiController; use App\Http\Controllers\DetailCuranmorController; +use App\Http\Controllers\TampilHitunganController; - +// Route Landing Route::get('/', [LandingController::class, 'index']); - -Route::resource('/dashboard/detail-curas', DetailCurasController::class)->middleware('auth'); -Route::resource('/dashboard/detail-curanmor', DetailCuranmorController::class)->middleware('auth'); - - Route::get('/blank', function () { return view('admin.dashboardBlank'); }); +// Route Auth +Route::post('/login', [loginController::class, 'authenticate']); +Route::post('/logout', [loginController::class, 'logout']); +Route::get('/login', [loginController::class, 'index'])->name('login'); + +// Route Fitur Utama Controller +Route::get('/dashboard', [dashboardController::class, 'index'])->middleware('auth'); +Route::get('/dashboard/TampilHitungCuras', [TampilHitunganController::class, 'TampilHitungCuras'])->middleware('auth'); +Route::get('/dashboard/TampilHitungCuranmor', [TampilHitunganController::class, 'TampilHitungCuranmor'])->middleware('auth'); +Route::resource('/dashboard/kecamatan', KecamatanController::class) ->parameters(['data-kecamatan' => 'kecamatan'])->middleware('auth'); +Route::resource('/dashboard/klaster', KlasterController::class) ->parameters(['data-klaster' => 'klaster'])->middleware('auth'); +Route::resource('/dashboard/curas', CurasController::class)->middleware('auth'); +Route::resource('/dashboard/curanmor', CuranmorController::class) ->parameters(['data-curanmor' => 'curanmor'])->middleware('auth'); +Route::resource('/dashboard/detail-curas', DetailCurasController::class)->middleware('auth'); +Route::resource('/dashboard/detail-curanmor', DetailCuranmorController::class)->middleware('auth'); + +// Route Fitur Tampil Map Admin Route::get('/dashboard/mapcuras', function () { return view('admin.dashboardMapCuras'); })->middleware('auth'); @@ -31,16 +43,6 @@ return view('admin.dashboardMapCuranmor'); })->middleware('auth'); -Route::get('/dashboard', [dashboardController::class, 'index'])->middleware('auth'); -Route::get('/login', [loginController::class, 'index'])->name('login'); -Route::post('/login', [loginController::class, 'authenticate']); -Route::post('/logout', [loginController::class, 'logout']); -Route::resource('/dashboard/kecamatan', KecamatanController::class) ->parameters(['data-kecamatan' => 'kecamatan'])->middleware('auth'); -Route::resource('/dashboard/curas', CurasController::class)->middleware('auth'); -Route::resource('/dashboard/curanmor', CuranmorController::class) ->parameters(['data-curanmor' => 'curanmor'])->middleware('auth'); -Route::resource('/dashboard/klaster', KlasterController::class) ->parameters(['data-klaster' => 'klaster'])->middleware('auth'); - -Route::get('/dashboard/iterasiCuras', [hasilIterasiController::class, 'iterasiCuras'])->middleware('auth'); - +// Route K-Means Centroid Tetap Route::get('/kmeans-curas', [KmeansController::class, 'KMeansCuras']); Route::get('/kmeans-curanmor', [KmeansController::class, 'KMeansCuranmor']);