[{"data":1,"prerenderedAt":1339},["ShallowReactive",2],{"navigation":3,"portal-navigation":560,"\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Fexternalnodeconnection":586,"\u002Fdocs\u002Flearn-and-explore\u002Fbase-examples\u002Fexternalnodeconnection-surround":1334},[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":268,"body":588,"description":1328,"extension":1329,"meta":1330,"navigation":1331,"path":269,"seo":1332,"stem":270,"__hash__":1333},"docs\u002F1.docs\u002F1.learn-and-explore\u002F3.base-examples\u002FExternalNodeConnection.md",{"type":589,"value":590,"toc":1297},"minimark",[591,595,617,620,640,643,670,673,678,681,723,730,732,736,747,771,781,783,787,790,795,801,804,808,815,818,825,827,831,849,853,897,900,904,907,915,919,941,943,947,960,964,974,994,997,1011,1015,1018,1029,1032,1036,1046,1054,1057,1059,1063,1069,1084,1087,1100,1102,1106,1110,1113,1133,1137,1140,1144,1150,1161,1165,1168,1187,1191,1194,1205,1207,1211,1256,1258,1262],[592,593,268],"h1",{"id":594},"external-node-connection-custom-distances-and-driving-times",[596,597,598,599,603,604,607,608,611,612,616],"p",{},"This document explains how to integrate ",[600,601,602],"strong",{},"external distance\u002Ftime information"," into ",[600,605,606],{},"JOpt TourOptimizer (Java)"," by supplying explicit ",[600,609,610],{},"element-to-element connections"," (“edge data”) via a ",[613,614,615],"code",{},"NodeEdgeConnector",".",[596,618,619],{},"It is based on the example implementations:",[621,622,623,633],"ul",{},[624,625,626],"li",{},[627,628,632],"a",{"href":629,"rel":630},"https:\u002F\u002Fgithub.com\u002FDNA-Evolutions\u002FJava-TourOptimizer-Examples\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fdna\u002Fjopt\u002Ftouroptimizer\u002Fjava\u002Fexamples\u002Fbasic\u002Fconnection_04\u002FExternalNodeConnectionExample.java",[631],"nofollow","ExternalNodeConnectionExample.java",[624,634,635],{},[627,636,639],{"href":637,"rel":638},"https:\u002F\u002Fgithub.com\u002FDNA-Evolutions\u002FJava-TourOptimizer-Examples\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fdna\u002Fjopt\u002Ftouroptimizer\u002Fjava\u002Fexamples\u002Fbasic\u002Fconnection_04\u002FExternalNodeConnectionWithLocationIdExample.java",[631],"ExternalNodeConnectionWithLocationIdExample.java",[596,641,642],{},"…and it connects the examples to the official documentation sections:",[621,644,645,658],{},[624,646,647,650,651,654],{},[600,648,649],{},"Basic Elements"," (especially “Element connections”):",[652,653],"br",{},[627,655,656],{"href":656,"rel":657},"https:\u002F\u002Fwww.dna-evolutions.com\u002Fdocs\u002Fgetting-started\u002Ftutorials\u002Fbasic-elements",[631],[624,659,660,663,664,666],{},[600,661,662],{},"BackupConnector"," (how default distances\u002Ftimes are calculated and how to modify them):",[652,665],{},[627,667,668],{"href":668,"rel":669},"https:\u002F\u002Fwww.dna-evolutions.com\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fbackupconnector#description-how-jopttouroptimizer-calculates-distances-and-times",[631],[671,672],"hr",{},[674,675,677],"h2",{"id":676},"why-this-matters","Why this matters",[596,679,680],{},"For many problems, JOpt’s built-in “auto connection” behavior is good enough: you provide nodes\u002Fresources with geo-coordinates and time windows and the optimizer can infer missing connections. However, in real routing use-cases you often need:",[621,682,683,689,706],{},[624,684,685,688],{},[600,686,687],{},"Road network"," distances instead of straight-line distances",[624,690,691,692,695,696,695,699,702,703],{},"Travel times depending on ",[600,693,694],{},"traffic",", ",[600,697,698],{},"vehicle type",[600,700,701],{},"terrain",", or ",[600,704,705],{},"service policies",[624,707,708,709],{},"A precomputed matrix coming from:\n",[621,710,711,714,717,720],{},[624,712,713],{},"OSRM \u002F Valhalla \u002F GraphHopper,",[624,715,716],{},"Google Distance Matrix,",[624,718,719],{},"internal GIS systems,",[624,721,722],{},"company-specific routing engines.",[596,724,725,726,729],{},"In those cases, you can inject ",[600,727,728],{},"external edge data"," by defining explicit connections for selected (or all) pairs of elements.",[671,731],{},[674,733,735],{"id":734},"concept-connections-are-edges-between-optimization-elements","Concept: “connections” are edges between optimization elements",[596,737,738,739,742,743,746],{},"A ",[613,740,741],{},"NodeEdgeConnectorItem"," (via ",[613,744,745],{},"INodeConnectorItem",") represents:",[621,748,749,755,761],{},[624,750,751,752],{},"a directed edge from ",[600,753,754],{},"element A → element B",[624,756,757,760],{},[600,758,759],{},"distance"," (unit-aware quantity)",[624,762,763,766,767,770],{},[600,764,765],{},"driving time"," (",[613,768,769],{},"Duration",")",[596,772,773,774,777,778,780],{},"Important: connections are generally ",[600,775,776],{},"directional"," (A→B is not assumed to equal B→A). The Basic Elements tutorial explicitly demonstrates creating both directions.",[652,779],{},"\nPractical implication: if you want symmetry, you must provide both edges yourself.",[671,782],{},[674,784,786],{"id":785},"two-layers-of-behavior","Two layers of behavior",[596,788,789],{},"When you set a node connector, the optimizer uses a layered strategy:",[791,792,794],"h3",{"id":793},"layer-1-explicit-connections-you-provide","Layer 1 — Explicit connections you provide",[596,796,797,798,800],{},"If a connection for a pair exists in your ",[613,799,615],{},", it is used as-is.",[596,802,803],{},"This is how you “induce” external travel times\u002Fdistances.",[791,805,807],{"id":806},"layer-2-fallback-for-missing-connections","Layer 2 — Fallback for missing connections",[596,809,810,811,814],{},"If a connection is ",[600,812,813],{},"missing",", the optimizer can auto-calculate it.",[596,816,817],{},"By default (per docs), the fallback distance uses a flat-surface earth approximation (projected model), and driving time is derived using an average speed; the BackupConnector documentation explains both the default model and how to override it.",[596,819,820,821,824],{},"This is a powerful design: you can provide a ",[600,822,823],{},"partial matrix"," (only where you have high-quality external data or need special handling) and rely on fallback for everything else.",[671,826],{},[674,828,830],{"id":829},"pattern-1-partial-external-matrix-externalnodeconnectionexample","Pattern 1 — Partial external matrix (ExternalNodeConnectionExample)",[596,832,833,836,837,839,841,848],{},[600,834,835],{},"File:"," ",[613,838,632],{},[652,840],{},[600,842,843,844,847],{},"Intent (from ",[613,845,846],{},"toString()","):"," “Setting custom node driving times and distances by using a node connector.”",[791,850,852],{"id":851},"what-it-does","What it does",[854,855,856,859,874,879,894],"ol",{},[624,857,858],{},"Builds nodes\u002Fresources as usual.",[624,860,861,862,865,866],{},"Creates ",[600,863,864],{},"two explicit connections"," between Cologne and Oberhausen:\n",[621,867,868,871],{},[624,869,870],{},"Koeln → Oberhausen",[624,872,873],{},"Oberhausen → Koeln",[624,875,876,877,616],{},"Adds only those edges to a ",[613,878,615],{},[624,880,881,882],{},"Assigns the connector to the optimization:\n",[621,883,884,889],{},[624,885,886],{},[613,887,888],{},"myNodeConnector.putNodeConnections(nodeConnectionItems);",[624,890,891],{},[613,892,893],{},"this.setNodeConnector(myNodeConnector);",[624,895,896],{},"Starts a run.",[596,898,899],{},"Everything else (all other pairs) is computed via fallback behavior.",[791,901,903],{"id":902},"why-this-is-a-good-starter-pattern","Why this is a good “starter” pattern",[596,905,906],{},"It is the cleanest mental model:",[621,908,909,912],{},[624,910,911],{},"“Here are the edges I care about or got from an external system.”",[624,913,914],{},"“For all other edges, do something reasonable.”",[791,916,918],{"id":917},"typical-real-world-usage","Typical real-world usage",[621,920,921,938],{},[624,922,923,924],{},"Provide external edges for:\n",[621,925,926,929,932,935],{},[624,927,928],{},"depot ↔ customer,",[624,930,931],{},"high-priority customers,",[624,933,934],{},"cross-city edges (where straight-line is especially misleading),",[624,936,937],{},"known restricted segments.",[624,939,940],{},"Leave the rest to fallback to reduce integration complexity.",[671,942],{},[674,944,946],{"id":945},"pattern-2-location-ids-externalnodeconnectionwithlocationidexample","Pattern 2 — Location IDs (ExternalNodeConnectionWithLocationIdExample)",[596,948,949,836,951,953,955,959],{},[600,950,835],{},[613,952,639],{},[652,954],{},[600,956,843,957,847],{},[613,958,846],{}," “Setting custom node driving times and distances by using a node connector and location ids.”",[791,961,963],{"id":962},"what-locationid-changes","What “locationId” changes",[596,965,966,967,973],{},"This example assigns the ",[600,968,969,970],{},"same ",[613,971,972],{},"locationId"," to multiple nodes:",[621,975,976,981,986,991],{},[624,977,978],{},[613,979,980],{},"koeln.setLocationId(\"TestLocationId1\");",[624,982,983],{},[613,984,985],{},"koeln1.setLocationId(\"TestLocationId1\");",[624,987,988],{},[613,989,990],{},"oberhausen.setLocationId(\"TestLocationId1\");",[624,992,993],{},"…and so on",[596,995,996],{},"The file comment explains the key semantics:",[621,998,999,1005],{},[624,1000,1001,1002,1004],{},"Elements sharing a ",[613,1003,972],{}," effectively share the same position.",[624,1006,1007,1008,1010],{},"You must ensure that all elements sharing a ",[613,1009,972],{}," also share the same geo-coordinates—this becomes important when fallback calculations rely on geo coordinates.",[791,1012,1014],{"id":1013},"why-you-would-use-location-ids","Why you would use location IDs",[596,1016,1017],{},"Location IDs are a practical tool when your “logical nodes” are not all distinct physical points, for example:",[621,1019,1020,1023,1026],{},[624,1021,1022],{},"multiple tasks at the same customer site,",[624,1024,1025],{},"multiple deliveries at one facility,",[624,1027,1028],{},"clustered tasks that should share travel-time semantics.",[596,1030,1031],{},"In addition, location IDs can reduce the number of distinct “places” your external matrix must cover (depending on how you structure your integration), because multiple nodes map to one physical location identity.",[791,1033,1035],{"id":1034},"when-to-be-careful","When to be careful",[596,1037,1038,1039,1041,1042,1045],{},"If you assign the same ",[613,1040,972],{}," to nodes that do ",[600,1043,1044],{},"not"," share the same latitude\u002Flongitude, you create ambiguity:",[621,1047,1048,1051],{},[624,1049,1050],{},"explicit connections might be applied unexpectedly,",[624,1052,1053],{},"fallback distances might be computed from an inconsistent geo position.",[596,1055,1056],{},"The example explicitly warns about this.",[671,1058],{},[674,1060,1062],{"id":1061},"how-fallback-distances-and-times-work-and-why-backupconnector-matters","How fallback distances and times work (and why BackupConnector matters)",[596,1064,1065,1066,1068],{},"When you do ",[600,1067,1044],{}," supply all connections, fallback kicks in. The BackupConnector documentation describes:",[621,1070,1071,1074,1077],{},[624,1072,1073],{},"Default distance calculation: a flat-surface earth approximation (efficient; usually accurate enough for short edges in optimized tours).",[624,1075,1076],{},"Default driving time: derived from an assumed average speed (the docs mention a default average speed and show how to set a per-resource average speed).",[624,1078,1079,1080,1083],{},"How to override\u002Fadjust the calculation by providing a custom ",[613,1081,1082],{},"BackupElementConnector"," implementation.",[596,1085,1086],{},"Practical recommendation:",[621,1088,1089],{},[624,1090,1091,1092],{},"If you only provide a partial external matrix, consider whether fallback should be:\n",[854,1093,1094,1097],{},[624,1095,1096],{},"“good enough” straight-line + average speed, or",[624,1098,1099],{},"replaced with a custom BackupConnector (e.g., correction factor, haversine, custom terrain model).",[671,1101],{},[674,1103,1105],{"id":1104},"a-recommended-implementation-strategy-production-grade","A recommended implementation strategy (production-grade)",[791,1107,1109],{"id":1108},"step-1-decide-your-external-data-scope","Step 1 — Decide your external data scope",[596,1111,1112],{},"Choose one:",[621,1114,1115,1121,1127],{},[624,1116,1117,1120],{},[600,1118,1119],{},"Full matrix"," (best accuracy; highest integration cost).",[624,1122,1123,1126],{},[600,1124,1125],{},"Partial matrix"," + fallback (excellent ROI for many scenarios).",[624,1128,1129,1132],{},[600,1130,1131],{},"No matrix"," but custom BackupConnector (low integration; better than default).",[791,1134,1136],{"id":1135},"step-2-generate-directed-edges","Step 2 — Generate directed edges",[596,1138,1139],{},"Even if your external system returns symmetric values, explicitly create both directions unless you are certain JOpt is configured to interpret them otherwise.",[791,1141,1143],{"id":1142},"step-3-use-stable-identifiers","Step 3 — Use stable identifiers",[596,1145,1146,1147,1149],{},"If you use ",[613,1148,972],{},", ensure it is:",[621,1151,1152,1155,1158],{},[624,1153,1154],{},"stable,",[624,1156,1157],{},"consistent across runs,",[624,1159,1160],{},"consistent with your geo-coordinate assignment.",[791,1162,1164],{"id":1163},"step-4-validate-and-harden","Step 4 — Validate and harden",[596,1166,1167],{},"Before running optimization:",[621,1169,1170],{},[624,1171,1172,1173],{},"Verify every external edge has:\n",[621,1174,1175,1178,1181,1184],{},[624,1176,1177],{},"non-negative distance,",[624,1179,1180],{},"non-negative driving time,",[624,1182,1183],{},"correct units,",[624,1185,1186],{},"correct “from\u002Fto” direction.",[791,1188,1190],{"id":1189},"step-5-observe-and-test","Step 5 — Observe and test",[596,1192,1193],{},"Attach observables (progress\u002Fstatus\u002Ferrors) early during development so you can immediately see:",[621,1195,1196,1199,1202],{},[624,1197,1198],{},"if the connector is applied,",[624,1200,1201],{},"if a missing connection forces fallback,",[624,1203,1204],{},"if infeasible time windows emerge due to travel-time inflation.",[671,1206],{},[674,1208,1210],{"id":1209},"practical-interesting-thought-experiments-to-validate-your-integration","Practical “interesting” thought experiments (to validate your integration)",[854,1212,1213,1221,1237],{},[624,1214,1215,1218,1220],{},[600,1216,1217],{},"Asymmetry test",[652,1219],{},"\nMake A→B short and B→A long; verify the resulting tour order changes accordingly.",[624,1222,1223,1226,1228,1229],{},[600,1224,1225],{},"Fallback boundary test",[652,1227],{},"\nProvide external edges for only 10% of pairs. Compare results with:",[621,1230,1231,1234],{},[624,1232,1233],{},"default fallback,",[624,1235,1236],{},"a custom BackupConnector (e.g., scaled distances),\nto measure sensitivity.",[624,1238,1239,1242,1244,1245,1247,1248],{},[600,1240,1241],{},"LocationId consolidation test",[652,1243],{},"\nCreate multiple nodes at one physical location (same ",[613,1246,972],{},") and observe whether:",[621,1249,1250,1253],{},[624,1251,1252],{},"the run becomes faster (smaller effective geography),",[624,1254,1255],{},"the solution becomes more “grouped” around those clustered tasks.",[671,1257],{},[674,1259,1261],{"id":1260},"summary","Summary",[621,1263,1264,1276,1283,1292],{},[624,1265,1266,1267,1269,1270,1272,1273,1275],{},"Use ",[613,1268,741],{}," to inject external ",[600,1271,759],{}," and ",[600,1274,765],{}," data.",[624,1277,1278,1279,1282],{},"Treat connections as ",[600,1280,1281],{},"directed"," (define both directions when needed).",[624,1284,1285,1286,1289,1290,616],{},"Missing connections fall back to ",[600,1287,1288],{},"auto-calculated"," values; this fallback can be customized via ",[600,1291,662],{},[624,1293,1294,1296],{},[613,1295,972],{}," is a powerful concept to represent multiple tasks at the same physical position—use it carefully and consistently.",{"title":1298,"searchDepth":1299,"depth":1299,"links":1300},"",2,[1301,1302,1303,1308,1313,1318,1319,1326,1327],{"id":676,"depth":1299,"text":677},{"id":734,"depth":1299,"text":735},{"id":785,"depth":1299,"text":786,"children":1304},[1305,1307],{"id":793,"depth":1306,"text":794},3,{"id":806,"depth":1306,"text":807},{"id":829,"depth":1299,"text":830,"children":1309},[1310,1311,1312],{"id":851,"depth":1306,"text":852},{"id":902,"depth":1306,"text":903},{"id":917,"depth":1306,"text":918},{"id":945,"depth":1299,"text":946,"children":1314},[1315,1316,1317],{"id":962,"depth":1306,"text":963},{"id":1013,"depth":1306,"text":1014},{"id":1034,"depth":1306,"text":1035},{"id":1061,"depth":1299,"text":1062},{"id":1104,"depth":1299,"text":1105,"children":1320},[1321,1322,1323,1324,1325],{"id":1108,"depth":1306,"text":1109},{"id":1135,"depth":1306,"text":1136},{"id":1142,"depth":1306,"text":1143},{"id":1163,"depth":1306,"text":1164},{"id":1189,"depth":1306,"text":1190},{"id":1209,"depth":1299,"text":1210},{"id":1260,"depth":1299,"text":1261},"This document explains how to integrate external distance\u002Ftime information into JOpt TourOptimizer (Java) by supplying explicit element-to-element connections (“edge data”) via a NodeEdgeConnector.","md",{},true,{"title":268,"description":1328},"zQ0xQHcHRxNsPRO7wV2Ag_QlPgafEyekv7p8o0a4hb0",[1335,1337],{"title":264,"path":265,"stem":266,"description":1336,"children":-1},"This example demonstrates a practical “last mile” step after solving a tour optimization: exporting the resulting optimization container to a KML file so you can visualize routes and locations in map tools such as Google Earth or other KML-capable viewers.",{"title":272,"path":273,"stem":274,"description":1338,"children":-1},"This document consolidates and explains the load\u002Fsave patterns demonstrated by the io_03 examples.\nIt is written as a practical reference for building restartable, recoverable, and portable optimization runs.",1776184506806]