[{"data":1,"prerenderedAt":1469},["ShallowReactive",2],{"navigation":3,"portal-navigation":560,"\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fclustering":586,"\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fclustering-surround":1465},[4,73,514],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fdocs\u002Fgetting-started","1.docs\u002F0.getting-started",[10,19,48],{"title":11,"icon":6,"path":12,"stem":13,"children":14,"page":6},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fhome","1.docs\u002F0.getting-started\u002F0.home",[15],{"title":11,"path":16,"stem":17,"icon":18},"\u002Fdocs\u002Fgetting-started\u002Fhome\u002Fintroduction","1.docs\u002F0.getting-started\u002F0.home\u002Fintroduction","i-lucide-home",{"title":20,"icon":6,"path":21,"stem":22,"children":23,"page":6},"Quickstart","\u002Fdocs\u002Fgetting-started\u002Fquickstart","1.docs\u002F0.getting-started\u002F1.quickstart",[24,28,33,38,43],{"title":5,"path":25,"stem":26,"icon":27},"\u002Fdocs\u002Fgetting-started\u002Fquickstart\u002Fgetting_started","1.docs\u002F0.getting-started\u002F1.quickstart\u002F0.getting_started","i-lucide-rocket",{"title":29,"path":30,"stem":31,"icon":32},"Quickstart Sandboxes","\u002Fdocs\u002Fgetting-started\u002Fquickstart\u002Fjopt_sandboxes_quickstart","1.docs\u002F0.getting-started\u002F1.quickstart\u002F1.jopt_sandboxes_quickstart","i-lucide-codesandbox",{"title":34,"path":35,"stem":36,"icon":37},"Angular Demo Client","\u002Fdocs\u002Fgetting-started\u002Fquickstart\u002Fangular_demo_client_short","1.docs\u002F0.getting-started\u002F1.quickstart\u002F2.angular_demo_client_short","i-lucide-monitor",{"title":39,"path":40,"stem":41,"icon":42},"JOpt AI Assistant (GPT)","\u002Fdocs\u002Fgetting-started\u002Fquickstart\u002Fjopt-ai-assistant","1.docs\u002F0.getting-started\u002F1.quickstart\u002F3. jopt-ai-assistant","i-lucide-bot",{"title":44,"path":45,"stem":46,"icon":47},"Frequently Asked Questions (FAQ)","\u002Fdocs\u002Fgetting-started\u002Fquickstart\u002Ffaq","1.docs\u002F0.getting-started\u002F1.quickstart\u002FFAQ","i-lucide-table-of-contents",{"title":49,"icon":6,"path":50,"stem":51,"children":52,"page":6},"Basic Tutorials","\u002Fdocs\u002Fgetting-started\u002Ftutorials","1.docs\u002F0.getting-started\u002F2.tutorials",[53,58,63,68],{"title":54,"path":55,"stem":56,"icon":57},"Basic elements","\u002Fdocs\u002Fgetting-started\u002Ftutorials\u002Fbasic-elements","1.docs\u002F0.getting-started\u002F2.tutorials\u002F0.basic-elements","i-lucide-component",{"title":59,"path":60,"stem":61,"icon":62},"First Optimization","\u002Fdocs\u002Fgetting-started\u002Ftutorials\u002Ffirst-optimization","1.docs\u002F0.getting-started\u002F2.tutorials\u002F1.first-optimization","i-lucide-footprints",{"title":64,"path":65,"stem":66,"icon":67},"Nodes","\u002Fdocs\u002Fgetting-started\u002Ftutorials\u002Fnodes","1.docs\u002F0.getting-started\u002F2.tutorials\u002FNodes","i-lucide-map-pin",{"title":69,"path":70,"stem":71,"icon":72},"Resources","\u002Fdocs\u002Fgetting-started\u002Ftutorials\u002Fresources","1.docs\u002F0.getting-started\u002F2.tutorials\u002FResources","i-lucide-truck",{"title":74,"icon":6,"path":75,"stem":76,"children":77,"page":6},"Learn & Explore","\u002Fdocs\u002Flearn-and-explore","1.docs\u002F1.learn-and-explore",[78,92,215,225,245,291,428,497],{"title":79,"icon":6,"path":80,"stem":81,"children":82,"page":6},"Features Overview","\u002Fdocs\u002Flearn-and-explore\u002Ffeatures","1.docs\u002F1.learn-and-explore\u002F0.features",[83,88],{"title":84,"path":85,"stem":86,"icon":87},"TourOptimizer Feature List (Basic \u002F Advanced \u002F Expert)","\u002Fdocs\u002Flearn-and-explore\u002Ffeatures\u002Ffeaturelist","1.docs\u002F1.learn-and-explore\u002F0.features\u002F0.featureList","i-lucide-earth",{"title":89,"path":90,"stem":91,"icon":87},"TourOptimizer Feature Atlas","\u002Fdocs\u002Flearn-and-explore\u002Ffeatures\u002Ffeatureoverview","1.docs\u002F1.learn-and-explore\u002F0.features\u002FFeatureOverview",{"title":93,"icon":6,"path":94,"stem":95,"children":96},"Feature Guides","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Findex",[97,100,105,109,114,119,124,129,134,139,144,148,153,158,163,168,173,177,181,186,191,196,201,206,210],{"title":98,"path":94,"stem":95,"icon":99},"Feature Guides - Overview","i-lucide-clipboard-list",{"title":101,"path":102,"stem":103,"icon":104},"License","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Flicense","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002F0.license","i-lucide-key",{"title":106,"path":107,"stem":108,"icon":37},"Simplified Angular Demo Client","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fangular_demo_client","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fangular_demo_client",{"title":110,"path":111,"stem":112,"icon":113},"AutoFilter","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fautofilter","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fautofilter","i-lucide-filter",{"title":115,"path":116,"stem":117,"icon":118},"Backup-Connector","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fbackupconnector","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fbackupconnector","i-lucide-spline",{"title":120,"path":121,"stem":122,"icon":123},"BitType Skill with CostModel","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fbittype_condition","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fbittype_condition","i-lucide-cpu",{"title":125,"path":126,"stem":127,"icon":128},"Clustering","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fclustering_construction","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fclustering_construction","i-lucide-chart-network",{"title":130,"path":131,"stem":132,"icon":133},"CO2-Emission","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fco2_emission","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fco2_emission","i-lucide-trees",{"title":135,"path":136,"stem":137,"icon":138},"Comparison Tool","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fcomparison_tool","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fcomparison_tool","i-lucide-scale",{"title":140,"path":141,"stem":142,"icon":143},"Flexible Start Time","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fflextime","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fflextime","i-lucide-clock",{"title":145,"path":146,"stem":147,"icon":32},"JOpt-Sandboxes","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fjopt-sandboxes","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fjopt-sandboxes",{"title":149,"path":150,"stem":151,"icon":152},"MagnetoCondition (MagnetoNodeConstraint)","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fmagnetocondition","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002FmagnetoCondition","i-lucide-magnet",{"title":154,"path":155,"stem":156,"icon":157},"Manufacturing Planning via PND","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fmanifacturing_planning","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fmanifacturing_planning","i-lucide-factory",{"title":159,"path":160,"stem":161,"icon":162},"Open Assessor","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fopen_assessor","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fopen_assessor","i-lucide-puzzle",{"title":164,"path":165,"stem":166,"icon":167},"Optimization Properties","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Foptimization_properties","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Foptimization_properties","i-lucide-settings",{"title":169,"path":170,"stem":171,"icon":172},"Overnight Stay","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fovernight_stay","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fovernight_stay","i-lucide-moon",{"title":174,"path":175,"stem":176,"icon":27},"Performance Mode","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fperformance_mode","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fperformance_mode",{"title":178,"path":179,"stem":180,"icon":72},"Pick up and delivery","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fpickup_and_delivery","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fpickup_and_delivery",{"title":182,"path":183,"stem":184,"icon":185},"Pillar Nodes (CapturedNodes)","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fpillar_nodes","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fpillar_nodes","i-lucide-lock",{"title":187,"path":188,"stem":189,"icon":190},"Quantum Construction Plugin (D-Wave)","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fquantum_dwave_plugin_featureguide","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fquantum_dwave_plugin_featureguide","i-lucide-atom",{"title":192,"path":193,"stem":194,"icon":195},"Reactive Events & Streams","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Freactive_events","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Freactive_events","i-lucide-radio",{"title":197,"path":198,"stem":199,"icon":200},"Return To Start","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Freturn_to_start","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Freturn_to_start","i-lucide-undo-2",{"title":202,"path":203,"stem":204,"icon":205},"Skill with Cost Model","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fskill_costmodel","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fskill_costmodel","i-lucide-pocket-knife",{"title":207,"path":208,"stem":209,"icon":67},"ZoneCodes & Territories","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fzonecodes","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fzonecodes",{"title":211,"path":212,"stem":213,"icon":214},"Zone Crossing Penalization","\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fzonecrossing","1.docs\u002F1.learn-and-explore\u002F1.feature-guides\u002Fzonecrossing","i-lucide-land-plot",{"title":216,"icon":6,"path":217,"stem":218,"children":219,"page":6},"Special","\u002Fdocs\u002Flearn-and-explore\u002Fspecial","1.docs\u002F1.learn-and-explore\u002F1.special",[220],{"title":221,"path":222,"stem":223,"icon":224},"Special features","\u002Fdocs\u002Flearn-and-explore\u002Fspecial\u002Fspecial_features","1.docs\u002F1.learn-and-explore\u002F1.special\u002Fspecial_features","i-lucide-star",{"title":226,"icon":6,"path":227,"stem":228,"children":229,"page":6},"REST","\u002Fdocs\u002Flearn-and-explore\u002Frest","1.docs\u002F1.learn-and-explore\u002F2.REST",[230,235,240],{"title":231,"path":232,"stem":233,"icon":234},"REST-Clients for JOpt.TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Frest\u002Frest_client_touroptimizer","1.docs\u002F1.learn-and-explore\u002F2.REST\u002F0.rest_client_touroptimizer","i-lucide-users",{"title":236,"path":237,"stem":238,"icon":239},"TourOptimizer REST Server","\u002Fdocs\u002Flearn-and-explore\u002Frest\u002Frest-server-touroptimizer","1.docs\u002F1.learn-and-explore\u002F2.REST\u002F1.rest-server-touroptimizer","i-lucide-server",{"title":241,"path":242,"stem":243,"icon":244},"TourOptimizer Production Guide","\u002Fdocs\u002Flearn-and-explore\u002Frest\u002Ftouroptimizer-faf","1.docs\u002F1.learn-and-explore\u002F2.REST\u002F2.touroptimizer-faf","i-lucide-shield",{"title":246,"icon":6,"path":247,"stem":248,"children":249,"page":6},"Base Examples","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples","1.docs\u002F1.learn-and-explore\u002F3.base-examples",[250,255,259,263,267,271,275,279,283,287],{"title":251,"path":252,"stem":253,"icon":254},"Basic Examples (Java) — JOpt TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Freadme","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002F0. README","i-lucide-square-terminal",{"title":256,"path":257,"stem":258},"First Optimization — FirstOptimizationExample","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Ffirstoptimizationexample","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002F1. FirstOptimizationExample",{"title":260,"path":261,"stem":262},"Event Nodes — Non-Geographical Tasks in JOpt TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Feventnode","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FEventNode",{"title":264,"path":265,"stem":266},"Export to KML — Export2KMLExample","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Fexport2kmlexample","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FExport2KMLExample",{"title":268,"path":269,"stem":270},"External Node Connection — Custom Distances and Driving Times","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Fexternalnodeconnection","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FExternalNodeConnection",{"title":272,"path":273,"stem":274},"Load and Save Optimization Snapshots (JSON \u002F JSON.BZ2) — JOpt TourOptimizer (Java)","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Floadandsaveoptimization","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FLoadAndSaveOptimization",{"title":276,"path":277,"stem":278},"Pillar Nodes (Captured Nodes) — Hard Constraints Fulfilled by Architecture","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Fpillar","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FPillar",{"title":280,"path":281,"stem":282},"Read Out an Optimization Result — IOptimizationResult in Practice","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Freadoutresult","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FReadOutResult",{"title":284,"path":285,"stem":286},"Recommended Implementation Patterns (Java) — JOpt TourOptimizer Examples","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Frecommendedimplementation","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FRecommendedImplementation",{"title":288,"path":289,"stem":290},"Setting the JOpt License — setLicenseJSON(...) in Java","\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Fsetlicense","1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FSetLicense",{"title":292,"path":293,"stem":294,"children":295,"page":6},"Advanced Examples","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples",[296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424],{"title":297,"path":298,"stem":299,"icon":254},"Advanced Examples (Java) — JOpt TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Freadme","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002F2. README",{"title":301,"path":302,"stem":303},"Alternate Destination — AlternateDestinationExample","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Falternatedestinationexample","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FAlternateDestinationExample",{"title":305,"path":306,"stem":307},"AutoFilter — Infeasibility Management by Excluding Violation-Prone Nodes","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fautofilter","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FAutoFilter",{"title":309,"path":310,"stem":311},"Binding and Excluding Resource Conditions (Mandatory\u002FPreferred vs. Banned\u002FUnPreferred)","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fbindingexcludingresourcecondition","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FBindingExcludingResourceCondition",{"title":313,"path":314,"stem":315},"BitTypeWithExpertiseCondition","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fbittypewithexpertiseconditionandcostmodelexample","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FBitTypeWithExpertiseConditionAndCostModelExample",{"title":317,"path":318,"stem":319},"Bridge & Tunnel Crossing Penalization with ZoneNumbers","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fbridgetunnelcrossingzonenumberconstraint","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FBridgeTunnelCrossingZoneNumberConstraint",{"title":321,"path":322,"stem":323},"Build an OptimizationConfig fluently and run it via the JSONOptimization engine","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fbuilderpatternexample","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FBuilderPatternExample",{"title":325,"path":326,"stem":327},"CO2-Emission Optimization — From Reporting to an Explicit Optimization Goal","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fco2emissionoptimization","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FCO2EmissionOptimization",{"title":329,"path":330,"stem":331},"CapacityCheck - Input plausibility: capacity check for working time vs required workload","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fcapacitycheckexample","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FCapacityCheckExample",{"title":333,"path":334,"stem":335},"Clustering During Construction — High-Quality Starting Solutions at Scale","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fclustering","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FClustering",{"title":337,"path":338,"stem":339},"Coupled Split Delivery — CoupledFlexLoadSplitDeliveryExample - SDO-Opimization","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fcoupledflexloadsplitdelivery","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FCoupledFlexLoadSplitDelivery",{"title":341,"path":342,"stem":343},"ExtraInfo — Attaching Domain Metadata to Nodes and Resources","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fextrainfo","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FExtraInfo",{"title":345,"path":346,"stem":347},"First\u002FLast Node in Route — Softly Steering Route Anchors via Importance","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Ffirstlastnode","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FFirstLastNode",{"title":349,"path":350,"stem":351},"IncludeVisitDuration — “Arrive Within OpeningHours” vs. “Finish Within OpeningHours”","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fincludevisitduration","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FIncludeVisitDuration",{"title":353,"path":354,"stem":355},"JointVisitDuration — Modeling “Co-located” Stops with Reduced Service Time","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fjointvisitduration","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FJointVisitDuration",{"title":357,"path":358,"stem":359},"Magnetic Condition - Node-Node Soft Condition","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fmagneticsoftcondition","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FMagneticSoftCondition",{"title":361,"path":362,"stem":363},"Open vs. Closed Route — Returning to Depot or Ending “Where It Makes Sense”","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fopenclosedroute","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FOpenClosedRoute",{"title":365,"path":366,"stem":367},"OpenLocationCode — Using Plus Codes Instead of Latitude\u002FLongitude","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fopenlocationcode","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FOpenLocationCode",{"title":369,"path":370,"stem":371},"OptimizationProgress — Controlling Progress Callbacks and Forcing Progress Snapshots","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Foptimizationprogress","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FOptimizationProgress",{"title":373,"path":374,"stem":375},"OvernightStay — Allowing Multi-Day Routes With “Stay Out” Policies","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fovernightstay","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FOvernightStay",{"title":377,"path":378,"stem":379},"Pickup & Delivery (PND) in JOpt.TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fpnd","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FPND",{"title":381,"path":382,"stem":383},"PerformanceMode — Faster Genetic Optimization With Reduced Operators","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fperformancemode","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FPerformanceMode",{"title":385,"path":386,"stem":387},"Read Out Full Progress — Structured KPIs During Optimization","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Freadoutfullprogress","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FReadOutFullProgress",{"title":389,"path":390,"stem":391},"Relations — Coupling Nodes Across Routes, Resources, and Time","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Frelations","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FRelations",{"title":393,"path":394,"stem":395},"RequestResult — Pulling an Intermediate Solution While Optimization Is Still Running","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Frequestresult","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FRequestResult",{"title":397,"path":398,"stem":399},"Resource Connection Efficiency — Modeling “Fast” and “Slow” Vehicles via Travel-Time Scaling","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fresourceconnectionefficiency","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FResourceConnectionEfficiency",{"title":401,"path":402,"stem":403},"ResourceConstraintAliasId — Treating Multiple Resources as One Logical Unit in Constraints","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fresourceconstraintaliasid","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FResourceConstraintAliasId",{"title":405,"path":406,"stem":407},"ResourceType (Skills) — Hard\u002FSoft Matching, Expertise Levels, Cost Models, and High-Performance Bitsets","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fresourcetype","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FResourceType",{"title":409,"path":410,"stem":411},"Resource Visit Duration Efficiency — Modeling Faster (or Slower) Resources","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fresourcevisitdurationefficiency","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FResourceVisitDurationEfficiency",{"title":413,"path":414,"stem":415},"Return To Start (Return2Start) — Insert Mandatory Depot Returns Between Visits","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Freturnstart","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FReturnStart",{"title":417,"path":418,"stem":419},"RunOptimizationInLoop — Stopping a Solver Stage After N Loops","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Frunoptimizationinloop","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FRunOptimizationInLoop",{"title":421,"path":422,"stem":423},"Wait On Early Arrival (First Node) — Prevent “Working Before Shift Start” Only at Route Start","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fwaitonearlyarrivalfirstnode","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FWaitOnEarlyArrivalFirstNode",{"title":425,"path":426,"stem":427},"ZoneCodes — Defining Territories for Resources (and Why It Scales)","\u002Fdocs\u002Flearn-and-explore\u002Fadvanced-examples\u002Fzoneconde","1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FZoneConde",{"title":429,"path":430,"stem":431,"children":432,"page":6},"Expert Examples","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples","1.docs\u002F1.learn-and-explore\u002F5.expert-examples",[433,437,441,445,449,453,457,461,465,469,473,477,481,485,489,493],{"title":434,"path":435,"stem":436,"icon":254},"Expert Examples (Java) — JOpt TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Freadme","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002F3. README",{"title":438,"path":439,"stem":440},"Compare Result — The Optimization Solution Comparison Tool","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fcompareresult","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FCompareResult",{"title":442,"path":443,"stem":444},"Connection Store — Time-Dependent Driving Times (Traffic Profiles)","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fconenctionstore","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FConenctionStore",{"title":446,"path":447,"stem":448},"Create Custom Solution From JSON — Reconstructing a Warm Start from a Serialized Optimization","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fcreatecustomsolutionfromjson","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FCreateCustomSolutionFromJSON",{"title":450,"path":451,"stem":452},"Custom Cost Convergence — Stop Optimization When Your Metric Has Stabilized","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fcustomcostconvergence","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FCustomCostConvergence",{"title":454,"path":455,"stem":456},"Custom Node Backup Connector — Custom Distance\u002FTime Calculation for Missing Connections","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fcustomnodebackupconnector","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FCustomNodeBackUpConnector",{"title":458,"path":459,"stem":460},"Custom Solution — Architecture, Warm-Start Patterns, and Practical Integration","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fcustomsolution","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FCustomSolution",{"title":462,"path":463,"stem":464},"Extract Build Info — Diagnostics, Reproducibility, and Support-Ready Bug Reports","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fextractbuildinfo","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FExtractBuildInfo",{"title":466,"path":467,"stem":468},"FlexTime — Flexible Start Time (Positive and Negative)","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fflextime","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FFlextime",{"title":470,"path":471,"stem":472},"Open Assessor — Node-Level Customization (Custom Node-Level Restrictions)","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fopenassessornodelevel","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FOpenAssessorNodeLevel",{"title":474,"path":475,"stem":476},"Open Assessor — Route-Level Customization (Custom Route-Level Restrictions)","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Fopenassessorroutelevel","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FOpenAssessorRouteLevel",{"title":478,"path":479,"stem":480},"Optimization Scheme — Algorithm Selection and Execution Pipeline","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Foptimizationschemealgorithmselection","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FOptimizationSchemeAlgorithmSelection",{"title":482,"path":483,"stem":484},"Optimization Scheme — Custom Default Properties (Pipeline Defaults With Safe Overrides)","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Foptimizationschemecustomdefaultproperties","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FOptimizationSchemeCustomDefaultProperties",{"title":486,"path":487,"stem":488},"Optional Nodes — Make “Stopovers” and Optional Tasks First-Class Citizens","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Foptionalnode","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FOptionalNode",{"title":490,"path":491,"stem":492},"Read Out Default Properties — Discover, Audit, and Explain the Solver Configuration Surface","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Freadoutdefaultproperties","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FReadOutDefaultProperties",{"title":494,"path":495,"stem":496},"Uncaught Exception Handling — Fail Fast, Fail Deterministically, and Still Return a Useful Signal","\u002Fdocs\u002Flearn-and-explore\u002Fexpert-examples\u002Funcaughtexceptionhandling","1.docs\u002F1.learn-and-explore\u002F5.expert-examples\u002FUncaughtExceptionHandling",{"title":498,"path":499,"stem":500,"children":501,"page":6},"Rest Examples","\u002Fdocs\u002Flearn-and-explore\u002Frest-examples","1.docs\u002F1.learn-and-explore\u002F6.rest-examples",[502,506,510],{"title":503,"path":504,"stem":505,"icon":254},"Rest Examples (Java) — JOpt TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Frest-examples\u002Frest-examples-readme","1.docs\u002F1.learn-and-explore\u002F6.rest-examples\u002F0. rest-examples-readme",{"title":507,"path":508,"stem":509},"Creating REST TourOptimizer JSON Input from a Java Optimization — JOpt TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Frest-examples\u002Fcreateresttouroptimizerinput","1.docs\u002F1.learn-and-explore\u002F6.rest-examples\u002FCreateRestTourOptimizerInput",{"title":511,"path":512,"stem":513},"Reading a REST JSON Config and Running It Locally — JOpt TourOptimizer","\u002Fdocs\u002Flearn-and-explore\u002Frest-examples\u002Freadrestjsonconfigandrun","1.docs\u002F1.learn-and-explore\u002F6.rest-examples\u002FReadRestJsonConfigAndRun",{"title":515,"icon":6,"path":516,"stem":517,"children":518,"page":6},"System Integration","\u002Fdocs\u002Fsystem-integration","1.docs\u002F2.system-integration",[519,529],{"title":520,"icon":6,"path":521,"stem":522,"children":523,"page":6},"System Architecture","\u002Fdocs\u002Fsystem-integration\u002Farchitecture","1.docs\u002F2.system-integration\u002F0.architecture",[524],{"title":525,"path":526,"stem":527,"icon":528},"System Architecture - JOpt platform","\u002Fdocs\u002Fsystem-integration\u002Farchitecture\u002Fsystem_architecture","1.docs\u002F2.system-integration\u002F0.architecture\u002Fsystem_architecture","i-lucide-network",{"title":530,"icon":6,"path":531,"stem":532,"children":533,"page":6},"Container Deployment","\u002Fdocs\u002Fsystem-integration\u002Fcontainerized-deployment","1.docs\u002F2.system-integration\u002F1.containerized-deployment",[534,538,542,546,551,555],{"title":535,"path":536,"stem":537,"icon":254},"Linux - JOpt TourOptimizer on Linux","\u002Fdocs\u002Fsystem-integration\u002Fcontainerized-deployment\u002Fjopt-container-linux","1.docs\u002F2.system-integration\u002F1.containerized-deployment\u002F1.jopt-container-linux",{"title":539,"path":540,"stem":541,"icon":224},"WSL\u002FWindows - Docker Installation","\u002Fdocs\u002Fsystem-integration\u002Fcontainerized-deployment\u002Fdocker-installation-win","1.docs\u002F2.system-integration\u002F1.containerized-deployment\u002F2.docker-installation-win",{"title":543,"path":544,"stem":545,"icon":37},"Windows - JOpt TourOptimizer on Windows Platforms","\u002Fdocs\u002Fsystem-integration\u002Fcontainerized-deployment\u002Fjopt-container-win","1.docs\u002F2.system-integration\u002F1.containerized-deployment\u002F2.jopt-container-win",{"title":547,"path":548,"stem":549,"icon":550},"macOS - JOpt TourOptimizer on Apple Platforms (macOS)","\u002Fdocs\u002Fsystem-integration\u002Fcontainerized-deployment\u002Fjopt-container-macos","1.docs\u002F2.system-integration\u002F1.containerized-deployment\u002F3.jopt-container-macos","i-lucide-apple",{"title":552,"path":553,"stem":554,"icon":239},"Kubernetes - JOpt TourOptimizer","\u002Fdocs\u002Fsystem-integration\u002Fcontainerized-deployment\u002Fkubertnetes","1.docs\u002F2.system-integration\u002F1.containerized-deployment\u002F4.kubertnetes",{"title":556,"path":557,"stem":558,"icon":559},"Terraform - Enterprise Deployment","\u002Fdocs\u002Fsystem-integration\u002Fcontainerized-deployment\u002Fterraform","1.docs\u002F2.system-integration\u002F1.containerized-deployment\u002F5.terraform","i-lucide-layers",[561],{"title":562,"icon":6,"path":563,"stem":564,"children":565,"page":6},"Portal Documentation","\u002Fportal\u002Fdocs","2.portal-docs",[566,576],{"title":567,"icon":6,"path":568,"stem":569,"children":570,"page":6},"Home","\u002Fportal\u002Fdocs\u002Fhome","2.portal-docs\u002F0.home",[571],{"title":572,"path":573,"stem":574,"icon":185,"children":575},"Welcome","\u002Fportal\u002Fdocs\u002Fhome\u002Fwelcome","2.portal-docs\u002F0.home\u002Fwelcome",[],{"title":577,"icon":6,"path":578,"stem":579,"children":580,"page":6},"Support","\u002Fportal\u002Fdocs\u002Fsupport","2.portal-docs\u002F1.support",[581],{"title":582,"path":583,"stem":584,"icon":104,"children":585},"Extended free License","\u002Fportal\u002Fdocs\u002Fsupport\u002Fextended_free_license","2.portal-docs\u002F1.support\u002F0.extended_free_license",[],{"id":587,"title":333,"body":588,"description":1459,"extension":1460,"meta":1461,"navigation":1462,"path":334,"seo":1463,"stem":335,"__hash__":1464},"docs\u002F1.docs\u002F1.learn-and-explore\u002F4.advanced-examples\u002FClustering.md",{"type":589,"value":590,"toc":1423},"minimark",[591,595,608,615,618,623,662,664,668,675,678,696,699,701,705,708,734,737,743,745,749,761,766,769,804,808,811,825,828,830,834,842,859,862,864,868,876,881,893,898,943,949,961,964,973,979,987,990,992,1000,1004,1020,1025,1053,1059,1069,1072,1078,1085,1088,1090,1098,1103,1114,1117,1132,1137,1149,1152,1174,1184,1195,1198,1202,1209,1212,1220,1222,1226,1230,1233,1242,1245,1253,1257,1259,1265,1267,1280,1282,1286,1290,1297,1301,1307,1318,1322,1328,1333,1335,1339,1343,1346,1357,1361,1373,1377,1383,1385,1389,1420],[592,593,333],"h1",{"id":594},"clustering-during-construction-high-quality-starting-solutions-at-scale",[596,597,598,599,603,604,607],"p",{},"This document explains ",[600,601,602],"strong",{},"JOpt TourOptimizer’s clustering construction capabilities"," and how to reproduce and inspect them using the provided ",[600,605,606],{},"Advanced"," Java examples.",[596,609,610,611,614],{},"Clustering during construction is one of the most practical “make it work in production” features: it produces a ",[600,612,613],{},"meaningful, feasible (or near-feasible) starting solution quickly",", which significantly improves convergence and solution quality for subsequent optimization stages.",[616,617],"hr",{},[619,620,622],"h2",{"id":621},"references","References",[624,625,626,639],"ul",{},[627,628,629,630,633],"li",{},"Clustering during construction (overview and theory):",[631,632],"br",{},[634,635,636],"a",{"href":636,"rel":637},"https:\u002F\u002Fwww.dna-evolutions.com\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fclustering_construction",[638],"nofollow",[627,640,641,642],{},"Examples (GitHub):",[624,643,644,650,656],{},[627,645,646],{},[634,647,648],{"href":648,"rel":649},"https:\u002F\u002Fgithub.com\u002FDNA-Evolutions\u002FJava-TourOptimizer-Examples\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fdna\u002Fjopt\u002Ftouroptimizer\u002Fjava\u002Fexamples\u002Fadvanced\u002Fclustering\u002FClusteringInnerCityExample.java",[638],[627,651,652],{},[634,653,654],{"href":654,"rel":655},"https:\u002F\u002Fgithub.com\u002FDNA-Evolutions\u002FJava-TourOptimizer-Examples\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fdna\u002Fjopt\u002Ftouroptimizer\u002Fjava\u002Fexamples\u002Fadvanced\u002Fclustering\u002FClusteringCityToCityExample.java",[638],[627,657,658],{},[634,659,660],{"href":660,"rel":661},"https:\u002F\u002Fgithub.com\u002FDNA-Evolutions\u002FJava-TourOptimizer-Examples\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fdna\u002Fjopt\u002Ftouroptimizer\u002Fjava\u002Fexamples\u002Fadvanced\u002Fclustering\u002FClusteringCityToCityKeepClustersForOptimizationExample.java",[638],[616,663],{},[619,665,667],{"id":666},"why-clustering-during-construction-exists","Why clustering during construction exists",[596,669,670,671,674],{},"JOpt uses a ",[600,672,673],{},"multi-algorithm solving strategy",": multiple algorithms are executed in succession, where the output of one stage is used as input to the next.",[596,676,677],{},"A key observation from production use is:",[624,679,680,687,690],{},[627,681,682,683,686],{},"The quality of a solver’s final result strongly depends on the quality of the ",[600,684,685],{},"starting (“working”) solution",".",[627,688,689],{},"A deterministic, domain-specific construction stage can produce a better starting point than random initialization.",[627,691,692,693,686],{},"With the same compute budget, a better starting point typically yields a ",[600,694,695],{},"better final solution",[596,697,698],{},"Therefore, JOpt runs a deterministic construction algorithm first (by default). In many cases, you can already use this constructed solution directly—for example to show an approximate plan to end users while deeper optimization runs in the background.",[616,700],{},[619,702,704],{"id":703},"what-clustering-during-construction-means-in-routing-terms","What “clustering during construction” means in routing terms",[596,706,707],{},"In tour optimization, “clustering” is not only a geographic concept. A “good cluster” must typically be consistent with:",[624,709,710,716,722,728],{},[627,711,712,715],{},[600,713,714],{},"distance \u002F travel-time proximity",",",[627,717,718,721],{},[600,719,720],{},"WorkingHours"," of resources,",[627,723,724,727],{},[600,725,726],{},"OpeningHours"," of nodes (time windows),",[627,729,730,733],{},[600,731,732],{},"constraints"," that exclude specific resources from specific nodes (skills, types, mandatory\u002Fpreferred resource, relationships).",[596,735,736],{},"A construction algorithm that only clusters by distance (classic K-Means usage) can fail badly when time windows and working hours dominate feasibility.",[596,738,739,740,686],{},"JOpt’s clustering construction is explicitly designed to be ",[600,741,742],{},"multi-dimensional",[616,744],{},[619,746,748],{"id":747},"the-construction-algorithm-as-described-in-the-documentation","The construction algorithm (as described in the documentation)",[596,750,751,752,755,756,760],{},"The documentation describes the ",[600,753,754],{},"HybridMultiDimensionalClusteringAlgorithm"," (internal name: ",[757,758,759],"code",{},"MultiAttemptParallelMultiDimensionalHybridSavingsAlgo",") as the construction algorithm used to create the starting solution.",[762,763,765],"h3",{"id":764},"requirements-the-algorithm-is-designed-to-meet","Requirements the algorithm is designed to meet",[596,767,768],{},"The algorithm is designed to be:",[770,771,772,780,788,796],"ol",{},[627,773,774,777,779],{},[600,775,776],{},"Fast",[631,778],{},"\nRuntime on seconds to low-minute scale, even for very large problem sets (> 1000 elements).",[627,781,782,785,787],{},[600,783,784],{},"Robust",[631,786],{},"\nA meaningful result should be produced no matter how the input data looks.",[627,789,790,793,795],{},[600,791,792],{},"Multi-dimensional",[631,794],{},"\nUses more than distance; it includes time windows, working hours, and resource eligibility constraints when forming clusters.",[627,797,798,801,803],{},[600,799,800],{},"Dynamic",[631,802],{},"\nThe number of clusters cannot be known a priori; it is derived from the problem instance (resources, nodes, constraints).",[762,805,807],{"id":806},"summarized-working-principle-high-level","Summarized working principle (high level)",[596,809,810],{},"The documentation summarizes the working principle in four phases:",[770,812,813,816,819,822],{},[627,814,815],{},"Collect resources and nodes and estimate “free path lengths” to derive cluster scale and potential cluster counts.",[627,817,818],{},"Let resources collect nodes in parallel and compete for nodes acquired by multiple resource clusters.",[627,820,821],{},"Re-adjust clusters using a parallel, savings-like algorithm to build an initial solution.",[627,823,824],{},"Apply “disturbance-theory” strategies to place elements that could not be positioned earlier.",[596,826,827],{},"Operationally, this means the construction stage is not “one clustering pass”; it is a multi-stage attempt to produce a route plan that is immediately useful.",[616,829],{},[619,831,833],{"id":832},"how-to-interpret-a-good-construction-result","How to interpret a “good construction result”",[596,835,836,837,841],{},"Even when you run ",[838,839,840],"em",{},"only"," construction (no optimization iterations), a good result typically exhibits:",[624,843,844,847,850,853,856],{},[627,845,846],{},"low route crossings,",[627,848,849],{},"geographically coherent routes,",[627,851,852],{},"roughly balanced workload across resources (when such balance is feasible),",[627,854,855],{},"consistent handling of time windows (e.g., odd\u002Feven day splitting),",[627,857,858],{},"reasonable “ownership” of node groups by resources without pathological oscillation.",[596,860,861],{},"The examples below are designed to make those outcomes visible via KML export.",[616,863],{},[619,865,867],{"id":866},"the-advanced-clustering-examples-what-each-one-is-proving","The Advanced clustering examples (what each one is proving)",[762,869,871,872,875],{"id":870},"_1-clusteringinnercityexample-inner-city-multi-depot-clustering-using-a-phyllotaxis-pattern","1) ",[757,873,874],{},"ClusteringInnerCityExample"," — Inner-city multi-depot clustering using a Phyllotaxis pattern",[596,877,878],{},[600,879,880],{},"What it showcases",[624,882,883,890],{},[627,884,885,886,889],{},"A large synthetic “inner-city” instance in\u002Faround Cologne using a ",[600,887,888],{},"Phyllotaxis"," distribution (spiral sampling) to place nodes and resources.",[627,891,892],{},"A visually inspectable cluster\u002Froute structure where distance dominates, but time windows can be used as a second dimension.",[596,894,895],{},[600,896,897],{},"How the input is generated",[624,899,900,906,912,923,931],{},[627,901,902,903,686],{},"Nodes: sampled around a Cologne center position using ",[757,904,905],{},"samplePhyllotaxis(...)",[627,907,908,909,911],{},"Resources: also sampled via ",[757,910,905],{}," around the same center (multi-depot style).",[627,913,914,915],{},"Node OpeningHours:\n",[624,916,917,920],{},[627,918,919],{},"08:00–22:00 (Europe\u002FBerlin)",[627,921,922],{},"optionally split by even\u002Fodd node id into different days (multi-dimensional clustering behavior).",[627,924,925,926],{},"Visit duration:\n",[624,927,928],{},[627,929,930],{},"5 minutes per node.",[627,932,933,934],{},"Resource WorkingHours:\n",[624,935,936],{},[627,937,938,939,942],{},"produced via ",[757,940,941],{},"getWorkingHours(addDay)"," (supports the even\u002Fodd day split).",[596,944,945,948],{},[600,946,947],{},"How it runs","\nTo highlight clustering construction quality, the example disables later optimization stages:",[624,950,951,956],{},[627,952,953],{},[757,954,955],{},"JOptExitCondition.JOptGenerationCount = 0",[627,957,958],{},[757,959,960],{},"JOpt.Algorithm.PreOptimization.SA.NumIterations = 0",[596,962,963],{},"This means:",[624,965,966],{},[627,967,968,969,972],{},"The output is ",[600,970,971],{},"pure construction"," (no SA, no GA).",[596,974,975,978],{},[600,976,977],{},"How you inspect the result","\nThe example exports a KML file with a parameterized name including:",[624,980,981,984],{},[627,982,983],{},"number of resources\u002Fnodes,",[627,985,986],{},"spacing parameters.",[596,988,989],{},"That makes it convenient to generate multiple instances and compare construction behavior.",[616,991],{},[762,993,995,996,999],{"id":994},"_2-clusteringcitytocityexample-germany-wide-effective-single-depot-behavior-city-to-city","2) ",[757,997,998],{},"ClusteringCityToCityExample"," — Germany-wide “effective single depot” behavior (city-to-city)",[596,1001,1002],{},[600,1003,880],{},[624,1005,1006,1017],{},[627,1007,1008,1009],{},"A country-scale setup (Germany) where:\n",[624,1010,1011,1014],{},[627,1012,1013],{},"resources are positioned far apart,",[627,1015,1016],{},"nodes represent many cities across the country.",[627,1018,1019],{},"The construction algorithm must assign geographically and temporally coherent “city clusters” to appropriate resources.",[596,1021,1022],{},[600,1023,1024],{},"Model highlights",[624,1026,1027,1030,1033,1040,1046],{},[627,1028,1029],{},"Resources: 8 resources spread across Germany (examples: Cologne, Jena, Hamburg, Koblenz, Wuppertal, Heilbronn, Goettingen, Dortmund).",[627,1031,1032],{},"Nodes: 66 time-window geo nodes representing many cities.",[627,1034,914,1035],{},[624,1036,1037],{},[627,1038,1039],{},"May 6, 2020, 08:00–22:00 (Europe\u002FBerlin).",[627,1041,933,1042],{},[624,1043,1044],{},[627,1045,1039],{},[627,1047,925,1048],{},[624,1049,1050],{},[627,1051,1052],{},"10 minutes per node.",[596,1054,1055,1058],{},[600,1056,1057],{},"Pure construction execution","\nJust like the inner-city example, it disables the optimization iterations:",[624,1060,1061,1065],{},[627,1062,1063],{},[757,1064,955],{},[627,1066,1067],{},[757,1068,960],{},[596,1070,1071],{},"So the output demonstrates what the construction stage can do on its own at “country scale”.",[596,1073,1074,1077],{},[600,1075,1076],{},"KML output","\nThe example writes:",[624,1079,1080],{},[627,1081,1082],{},[757,1083,1084],{},"ClusteringCityToCityExample.kml",[596,1086,1087],{},"This is intended for visual inspection of cluster ownership, route coherence, and “outlier handling” (where the algorithm deliberately assigns borderline cities to avoid overtime).",[616,1089],{},[762,1091,1093,1094,1097],{"id":1092},"_3-clusteringcitytocitykeepclustersforoptimizationexample-keep-construction-clusters-as-hard-constraints-districting","3) ",[757,1095,1096],{},"ClusteringCityToCityKeepClustersForOptimizationExample"," — Keep construction clusters as hard constraints (“districting”)",[596,1099,1100,1102],{},[600,1101,880],{},"\nThis example is the bridge between:",[624,1104,1105,1108],{},[627,1106,1107],{},"construction clustering (creating good initial clusters), and",[627,1109,1110,1111,686],{},"optimization (improving the solution), ",[600,1112,1113],{},"without destroying cluster ownership",[596,1115,1116],{},"This pattern is highly relevant in production when:",[624,1118,1119,1122,1125],{},[627,1120,1121],{},"you want stable service territories,",[627,1123,1124],{},"you want predictable resource ownership of customer groups,",[627,1126,1127,1128,1131],{},"you want to optimize ",[838,1129,1130],{},"within"," a cluster but not “move nodes across districts”.",[596,1133,1134,1136],{},[600,1135,947],{},"\nUnlike the pure-construction examples, this one enables optimization:",[624,1138,1139,1144],{},[627,1140,1141],{},[757,1142,1143],{},"JOptExitCondition.JOptGenerationCount = 5000",[627,1145,1146],{},[757,1147,1148],{},"JOpt.Algorithm.PreOptimization.SA.NumIterations = 500000",[596,1150,1151],{},"Then it adds two key clustering properties:",[624,1153,1154,1162],{},[627,1155,1156,1159,1161],{},[757,1157,1158],{},"JOpt.Clustering.AutoZoneCodeClusters = True",[631,1160],{},"\nMeaning: create zone codes from the clusters found by construction (automatic zoning).",[627,1163,1164,1167,1169,1170,1173],{},[757,1165,1166],{},"JOpt.Clustering.AutoZoneCodeClusters.isHard = True",[631,1168],{},"\nMeaning: these clusters become ",[600,1171,1172],{},"hard constrained",". No node is allowed to leave its initial cluster during optimization.",[596,1175,1176,1179,1180,1183],{},[600,1177,1178],{},"Why this matters","\nThis is not a cost “preference” strategy. With ",[757,1181,1182],{},"isHard = True",", the solver is architecturally restricted:",[624,1185,1186,1192],{},[627,1187,1188,1189,715],{},"optimization may improve routes, order, timing, and distance ",[600,1190,1191],{},"within the cluster",[627,1193,1194],{},"but it may not break the cluster allocation.",[596,1196,1197],{},"This enables robust “cluster-first, optimize-second” workflows for territory-driven operations.",[596,1199,1200,1077],{},[600,1201,1076],{},[624,1203,1204],{},[627,1205,1206],{},[757,1207,1208],{},"ClusteringCityToCityKeepClustersForOptimizationExample.kml",[596,1210,1211],{},"This allows you to compare:",[624,1213,1214,1217],{},[627,1215,1216],{},"the constructed solution,",[627,1218,1219],{},"vs. the optimized solution that respects hard cluster boundaries.",[616,1221],{},[619,1223,1225],{"id":1224},"recommended-way-to-demonstrate-clustering-capability-for-customers-demos-and-benchmarks","Recommended way to demonstrate clustering capability (for customers, demos, and benchmarks)",[762,1227,1229],{"id":1228},"a-construction-only-demonstration-fast-and-persuasive","A. Construction-only demonstration (fast and persuasive)",[596,1231,1232],{},"Use:",[624,1234,1235],{},[627,1236,1237,1239,1240],{},[757,1238,874],{}," and ",[757,1241,998],{},[596,1243,1244],{},"Why:",[624,1246,1247,1250],{},[627,1248,1249],{},"they show immediate route structure without “solver magic” from later stages,",[627,1251,1252],{},"results are easy to explain (“this is what the constructor can do before optimization”).",[762,1254,1256],{"id":1255},"b-construction-optimization-with-stable-ownership-production-narrative","B. Construction + optimization with stable ownership (production narrative)",[596,1258,1232],{},[624,1260,1261],{},[627,1262,1263],{},[757,1264,1096],{},[596,1266,1244],{},[624,1268,1269],{},[627,1270,1271,1272],{},"it demonstrates that JOpt can deliver both:\n",[624,1273,1274,1277],{},[627,1275,1276],{},"strong initial territories, and",[627,1278,1279],{},"improved route quality,\nwhile keeping ownership stable via hard constraints.",[616,1281],{},[619,1283,1285],{"id":1284},"practical-notes-for-running-the-examples","Practical notes for running the examples",[762,1287,1289],{"id":1288},"license-requirement","License requirement",[596,1291,1292,1293,1296],{},"These examples contain more than 10 elements (nodes\u002Fresources), therefore a ",[600,1294,1295],{},"valid license is required"," (the source files explicitly warn about this).",[762,1298,1300],{"id":1299},"output-artifacts","Output artifacts",[596,1302,1303,1304,1306],{},"All examples export KML files to the working directory.",[631,1305],{},"\nUse Google Earth (or a KML-capable GIS viewer) to inspect:",[624,1308,1309,1312,1315],{},[627,1310,1311],{},"cluster coherence,",[627,1313,1314],{},"route crossing behavior,",[627,1316,1317],{},"territory separation (especially in the “keep clusters hard” example).",[762,1319,1321],{"id":1320},"keep-the-examples-construction-only-when-you-want-to-explain-clustering","Keep the examples “construction-only” when you want to explain clustering",[596,1323,1324,1325,1327],{},"If your goal is to showcase clustering construction itself, do not add later optimization stages.",[631,1326],{},"\nThe examples show you the canonical way to do this:",[624,1329,1330],{},[627,1331,1332],{},"set generation count and SA iterations to zero.",[616,1334],{},[619,1336,1338],{"id":1337},"common-questions-and-the-correct-answer","Common questions and the correct answer",[762,1340,1342],{"id":1341},"is-clustering-just-a-post-processing-visualization-step","“Is clustering just a post-processing visualization step?”",[596,1344,1345],{},"No. In JOpt, clustering during construction is a solver stage that produces the initial working solution. It directly influences:",[624,1347,1348,1351,1354],{},[627,1349,1350],{},"feasibility,",[627,1352,1353],{},"runtime-to-quality,",[627,1355,1356],{},"final plan quality.",[762,1358,1360],{"id":1359},"is-keeping-clusters-for-optimization-done-by-cost-weights","“Is keeping clusters for optimization done by cost weights?”",[596,1362,1363,1364,1366,1367,686,1370,1372],{},"Not when ",[757,1365,1182],{},". In that mode, cluster boundaries are enforced as a ",[600,1368,1369],{},"hard constraint",[631,1371],{},"\nCosts and weights are used for soft trade-offs, but hard cluster boundaries are a structural restriction.",[762,1374,1376],{"id":1375},"why-does-jopt-care-about-openinghoursworkinghours-in-clustering","“Why does JOpt care about OpeningHours\u002FWorkingHours in clustering?”",[596,1378,1379,1380,1382],{},"Because in real routing problems, feasibility and quality are dominated by time.",[631,1381],{},"\nDistance-only clustering can produce routes that look compact but are impossible to execute within time windows.",[616,1384],{},[619,1386,1388],{"id":1387},"summary","Summary",[624,1390,1391,1394,1397],{},[627,1392,1393],{},"Clustering during construction creates high-quality starting solutions quickly and robustly.",[627,1395,1396],{},"The construction algorithm is designed to be fast, robust, multi-dimensional, and dynamic.",[627,1398,1399,1400],{},"The Advanced examples show three distinct narratives:\n",[770,1401,1402,1408,1414],{},[627,1403,1404,1407],{},[600,1405,1406],{},"Inner-city phyllotaxis"," (distance-driven, scalable, visually convincing),",[627,1409,1410,1413],{},[600,1411,1412],{},"Germany city-to-city"," (macro clustering and outlier handling),",[627,1415,1416,1419],{},[600,1417,1418],{},"Keep clusters for optimization"," (territory stability enforced as hard constraints).",[596,1421,1422],{},"If you want a single “wow moment” for customers, start with the KML output of the construction-only examples, then show how hard cluster preservation keeps territories stable while optimization improves route quality.",{"title":1424,"searchDepth":1425,"depth":1425,"links":1426},"",2,[1427,1428,1429,1430,1435,1436,1444,1448,1453,1458],{"id":621,"depth":1425,"text":622},{"id":666,"depth":1425,"text":667},{"id":703,"depth":1425,"text":704},{"id":747,"depth":1425,"text":748,"children":1431},[1432,1434],{"id":764,"depth":1433,"text":765},3,{"id":806,"depth":1433,"text":807},{"id":832,"depth":1425,"text":833},{"id":866,"depth":1425,"text":867,"children":1437},[1438,1440,1442],{"id":870,"depth":1433,"text":1439},"1) ClusteringInnerCityExample — Inner-city multi-depot clustering using a Phyllotaxis pattern",{"id":994,"depth":1433,"text":1441},"2) ClusteringCityToCityExample — Germany-wide “effective single depot” behavior (city-to-city)",{"id":1092,"depth":1433,"text":1443},"3) ClusteringCityToCityKeepClustersForOptimizationExample — Keep construction clusters as hard constraints (“districting”)",{"id":1224,"depth":1425,"text":1225,"children":1445},[1446,1447],{"id":1228,"depth":1433,"text":1229},{"id":1255,"depth":1433,"text":1256},{"id":1284,"depth":1425,"text":1285,"children":1449},[1450,1451,1452],{"id":1288,"depth":1433,"text":1289},{"id":1299,"depth":1433,"text":1300},{"id":1320,"depth":1433,"text":1321},{"id":1337,"depth":1425,"text":1338,"children":1454},[1455,1456,1457],{"id":1341,"depth":1433,"text":1342},{"id":1359,"depth":1433,"text":1360},{"id":1375,"depth":1433,"text":1376},{"id":1387,"depth":1425,"text":1388},"This document explains JOpt TourOptimizer’s clustering construction capabilities and how to reproduce and inspect them using the provided Advanced Java examples.","md",{},true,{"title":333,"description":1459},"cuggZ4AMbfUARpUb5P3D8kYpahlmMooMhnXi4RzN5AE",[1466,1468],{"title":329,"path":330,"stem":331,"description":1467,"children":-1},"This example explains JOpt’s capacity plausibility check and how to deactivate it if you really need to run with extreme or intentionally infeasible input.",{"title":337,"path":338,"stem":339,"description":1424,"children":-1},1776184514114]