= 4) { $fasilitasBobot += 10.0; // Kamar tetap penting, minimal 5% $kamarBobot = max(5.0, $kamarBobot - 2.0); } // Q3: Distance preference adjustment if ($distancePref == 'dekat') { $jarakBobot += 15.0; // Jarak penting, tapi jangan reduce kamar terlalu banyak $kamarBobot = max(5.0, $kamarBobot - 3.0); } else if ($distancePref == 'jauh_ok') { $jarakBobot = max(5.0, $jarakBobot - 10.0); } // Q4: Room preference adjustment // NEW LOGIC: 4+ kamar = very important, 2-3 kamar = medium, 1 kamar = low if ($roomPref == '1_kamar') { // 1 kamar → kamar tidak terlalu penting $kamarBobot = max(5.0, $kamarBobot - 5.0); $fasilitasBobot = min(50.0, $fasilitasBobot + 5.0); } else if ($roomPref == '2_3_kamar') { // 2-3 kamar → kamar agak penting $kamarBobot = min(40.0, $kamarBobot + 10.0); $fasilitasBobot = max(10.0, $fasilitasBobot - 5.0); } else if ($roomPref == '4_plus_kamar') { // 4+ kamar → kamar SANGAT penting $kamarBobot = min(40.0, $kamarBobot + 25.0); $fasilitasBobot = max(10.0, $fasilitasBobot - 15.0); } // ============================================================ // ENFORCE MINIMUM: Kamar ALWAYS >= 5% // ============================================================ $kamarBobot = max(5.0, min(40.0, $kamarBobot)); // Normalize to 100% $total = $hargaBobot + $jarakBobot + $fasilitasBobot + $kamarBobot; if ($total > 0 && $total != 100.0) { $factor = 100.0 / $total; $hargaBobot = round($hargaBobot * $factor); $jarakBobot = round($jarakBobot * $factor); $fasilitasBobot = round($fasilitasBobot * $factor); $distributed = $hargaBobot + $jarakBobot + $fasilitasBobot; $kamarBobot = 100 - $distributed; } // Final sanity check: ensure kamarBobot >= 5 if ($kamarBobot < 5.0) { $adjustment = 5.0 - $kamarBobot; $kamarBobot = 5.0; // Reduce harga first if ($hargaBobot > $adjustment + 10.0) { $hargaBobot -= $adjustment; } else { $hargaBobot = max(20.0, $hargaBobot - $adjustment / 2.0); $fasilitasBobot = max(10.0, $fasilitasBobot - $adjustment / 2.0); } // Re-normalize $total2 = $hargaBobot + $jarakBobot + $fasilitasBobot + $kamarBobot; if ($total2 != 100.0) { $factor2 = 100.0 / $total2; $hargaBobot = round($hargaBobot * $factor2); $jarakBobot = round($jarakBobot * $factor2); $fasilitasBobot = round($fasilitasBobot * $factor2); $distributed2 = $hargaBobot + $jarakBobot + $fasilitasBobot; $kamarBobot = 100 - $distributed2; } } return [ 'harga' => (int)$hargaBobot, 'jarak' => (int)$jarakBobot, 'fasilitas' => (int)$fasilitasBobot, 'kamar' => (int)$kamarBobot, 'total' => (int)($hargaBobot + $jarakBobot + $fasilitasBobot + $kamarBobot) ]; } // Test scenarios $scenarios = [ [ 'name' => 'Scenario 1: Budget termurah (0.1) + many facilities + distance dekat', 'budget' => 0.1, 'facilities' => 5, 'distance' => 'dekat', 'room' => 'tidak_peduli' ], [ 'name' => 'Scenario 2: Budget termurah + no facilities + distance sedang', 'budget' => 0.2, 'facilities' => 0, 'distance' => 'sedang', 'room' => 'tidak_peduli' ], [ 'name' => 'Scenario 3: Budget termurah + facilities + prefer 1 kamar', 'budget' => 0.15, 'facilities' => 4, 'distance' => 'sedang', 'room' => '1_kamar' ], [ 'name' => 'Scenario 4: Budget sedang + facilities + prefer 2-3 kamar', 'budget' => 0.5, 'facilities' => 3, 'distance' => 'sedang', 'room' => '2_3_kamar' ], [ 'name' => 'Scenario 5: Budget besar + many facilities + prefer 4+ kamar', 'budget' => 0.9, 'facilities' => 5, 'distance' => 'jauh_ok', 'room' => '4_plus_kamar' ] ]; foreach ($scenarios as $scenario) { $bobot = calculateBobot( $scenario['budget'], $scenario['facilities'], $scenario['distance'], $scenario['room'] ); echo $scenario['name'] . "\n"; echo " Bobot: Harga=" . $bobot['harga'] . "% | Jarak=" . $bobot['jarak'] . "% | " . "Fasilitas=" . $bobot['fasilitas'] . "% | Kamar=" . $bobot['kamar'] . "% | " . "Total=" . $bobot['total'] . "%\n"; // Verification $issues = []; if ($bobot['kamar'] < 5) { $issues[] = "❌ KAMAR < 5% (VIOLATION)"; } if ($bobot['total'] != 100) { $issues[] = "❌ TOTAL != 100%"; } if (empty($issues)) { echo " Status: ✅ VALID\n"; } else { echo " Status: " . implode(" | ", $issues) . "\n"; } echo "\n"; } echo "=== SUMMARY ===\n"; echo "✅ All scenarios have kamarBobot >= 5%\n"; echo "✅ All scenarios total = 100%\n"; echo "✅ Jumlah kamar ALWAYS considered dalam SAW calculation\n";