[{"data":1,"prerenderedAt":2513},["ShallowReactive",2],{"navigation":3,"portal-navigation":560,"\u002Fdocs\u002Fgetting-started\u002Ftutorials\u002Fnodes":586,"\u002Fdocs\u002Fgetting-started\u002Ftutorials\u002Fnodes-surround":2510},[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":64,"body":588,"description":2504,"extension":2505,"meta":2506,"navigation":2507,"path":65,"seo":2508,"stem":66,"__hash__":2509},"docs\u002F1.docs\u002F0.getting-started\u002F2.tutorials\u002FNodes.md",{"type":589,"value":590,"toc":2472},"minimark",[591,595,600,604,612,615,619,684,686,689,692,697,700,739,743,750,949,960,1008,1011,1074,1077,1081,1084,1114,1117,1127,1131,1134,1159,1162,1165,1168,1172,1271,1378,1381,1385,1391,1394,1397,1400,1470,1536,1539,1542,1547,1550,1553,1556,1765,1768,1771,1793,1796,1799,1810,1813,1819,1822,1909,1912,1917,1920,1923,1941,1944,1955,1958,1961,1964,1980,1988,1991,1994,2190,2197,2296,2299,2309,2312,2315,2336,2343,2346,2348,2351,2427,2430,2444,2452,2454,2458,2468],[592,593,64],"h1",{"id":594},"nodes",[596,597,599],"h2",{"id":598},"the-work-to-be-scheduled","The work to be scheduled",[601,602,603],"p",{},"A Node represents a task, a location, or an appointment that needs to be visited or performed by a Resource. Nodes are the primary demand objects in JOpt.TourOptimizer. The optimizer assigns nodes to resources and sequences them into routes, respecting time windows, capacity, and all other constraints.",[601,605,606,607,611],{},"JOpt provides several node types, each designed for a different modeling scenario. All node types implement the ",[608,609,610],"code",{},"INode"," interface and share common properties (ID, opening hours, visit duration, importance), but differ in what additional information they carry and how the optimizer treats them.",[613,614],"hr",{},[596,616,618],{"id":617},"overview","Overview",[620,621,622,630,636,642,648,654,660,666,672,678],"ul",{},[623,624,625],"li",{},[626,627,629],"a",{"href":628},"#common-properties","Common properties",[623,631,632],{},[626,633,635],{"href":634},"#timewindowgeonode","TimeWindowGeoNode",[623,637,638],{},[626,639,641],{"href":640},"#eventnode","EventNode",[623,643,644],{},[626,645,647],{"href":646},"#pillartimewindowgeonode","PillarTimeWindowGeoNode",[623,649,650],{},[626,651,653],{"href":652},"#pillareventnode","PillarEventNode",[623,655,656],{},[626,657,659],{"href":658},"#optional-nodes","Optional nodes",[623,661,662],{},[626,663,665],{"href":664},"#stay-nodes","Stay nodes",[623,667,668],{},[626,669,671],{"href":670},"#builder-pattern","Builder pattern",[623,673,674],{},[626,675,677],{"href":676},"#adding-nodes-to-the-optimization","Adding nodes to the optimization",[623,679,680],{},[626,681,683],{"href":682},"#summary","Summary",[613,685],{},[596,687,629],{"id":688},"common-properties",[601,690,691],{},"All node types share the following properties:",[693,694,696],"h3",{"id":695},"unique-id","Unique ID",[601,698,699],{},"Every node needs a unique string identifier. This ID is used throughout the optimization for assignment, reporting, and result analysis. No two nodes may share the same ID.",[701,702,707],"pre",{"className":703,"code":704,"language":705,"meta":706,"style":706},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","String nodeId = \"Cologne\";\n","java","",[608,708,709],{"__ignoreMap":706},[710,711,714,718,722,726,729,733,736],"span",{"class":712,"line":713},"line",1,[710,715,717],{"class":716},"spNyl","String",[710,719,721],{"class":720},"sTEyZ"," nodeId ",[710,723,725],{"class":724},"sMK4o","=",[710,727,728],{"class":724}," \"",[710,730,732],{"class":731},"sfazB","Cologne",[710,734,735],{"class":724},"\"",[710,737,738],{"class":724},";\n",[693,740,742],{"id":741},"opening-hours","Opening hours",[601,744,745,746,749],{},"A node holds a list of ",[608,747,748],{},"IOpeningHours"," entries. Each entry defines a time window during which the node can be visited. Multiple opening hours represent multiple days or multiple time slots.",[701,751,753],{"className":703,"code":752,"language":705,"meta":706,"style":706},"ZonedDateTime start = ZonedDateTime.of(2020, MAY.getValue(), 6, 8, 0, 0, 0,\n    ZoneId.of(\"Europe\u002FBerlin\"));\nZonedDateTime end = ZonedDateTime.of(2020, MAY.getValue(), 6, 17, 0, 0, 0,\n    ZoneId.of(\"Europe\u002FBerlin\"));\n\nIOpeningHours firstDay = new OpeningHours(start, end);\n",[608,754,755,820,842,893,912,919],{"__ignoreMap":706},[710,756,757,760,763,765,768,771,775,778,782,785,788,790,793,796,799,801,804,806,809,811,813,815,817],{"class":712,"line":713},[710,758,759],{"class":716},"ZonedDateTime",[710,761,762],{"class":720}," start ",[710,764,725],{"class":724},[710,766,767],{"class":720}," ZonedDateTime",[710,769,770],{"class":724},".",[710,772,774],{"class":773},"s2Zo4","of",[710,776,777],{"class":724},"(",[710,779,781],{"class":780},"sbssI","2020",[710,783,784],{"class":724},",",[710,786,787],{"class":720}," MAY",[710,789,770],{"class":724},[710,791,792],{"class":773},"getValue",[710,794,795],{"class":724},"(),",[710,797,798],{"class":780}," 6",[710,800,784],{"class":724},[710,802,803],{"class":780}," 8",[710,805,784],{"class":724},[710,807,808],{"class":780}," 0",[710,810,784],{"class":724},[710,812,808],{"class":780},[710,814,784],{"class":724},[710,816,808],{"class":780},[710,818,819],{"class":724},",\n",[710,821,823,826,828,830,832,834,837,839],{"class":712,"line":822},2,[710,824,825],{"class":720},"    ZoneId",[710,827,770],{"class":724},[710,829,774],{"class":773},[710,831,777],{"class":724},[710,833,735],{"class":724},[710,835,836],{"class":731},"Europe\u002FBerlin",[710,838,735],{"class":724},[710,840,841],{"class":724},"));\n",[710,843,845,847,850,852,854,856,858,860,862,864,866,868,870,872,874,876,879,881,883,885,887,889,891],{"class":712,"line":844},3,[710,846,759],{"class":716},[710,848,849],{"class":720}," end ",[710,851,725],{"class":724},[710,853,767],{"class":720},[710,855,770],{"class":724},[710,857,774],{"class":773},[710,859,777],{"class":724},[710,861,781],{"class":780},[710,863,784],{"class":724},[710,865,787],{"class":720},[710,867,770],{"class":724},[710,869,792],{"class":773},[710,871,795],{"class":724},[710,873,798],{"class":780},[710,875,784],{"class":724},[710,877,878],{"class":780}," 17",[710,880,784],{"class":724},[710,882,808],{"class":780},[710,884,784],{"class":724},[710,886,808],{"class":780},[710,888,784],{"class":724},[710,890,808],{"class":780},[710,892,819],{"class":724},[710,894,896,898,900,902,904,906,908,910],{"class":712,"line":895},4,[710,897,825],{"class":720},[710,899,770],{"class":724},[710,901,774],{"class":773},[710,903,777],{"class":724},[710,905,735],{"class":724},[710,907,836],{"class":731},[710,909,735],{"class":724},[710,911,841],{"class":724},[710,913,915],{"class":712,"line":914},5,[710,916,918],{"emptyLinePlaceholder":917},true,"\n",[710,920,922,924,927,929,933,936,938,941,943,946],{"class":712,"line":921},6,[710,923,748],{"class":716},[710,925,926],{"class":720}," firstDay ",[710,928,725],{"class":724},[710,930,932],{"class":931},"s7zQu"," new",[710,934,935],{"class":773}," OpeningHours",[710,937,777],{"class":724},[710,939,940],{"class":720},"start",[710,942,784],{"class":724},[710,944,945],{"class":720}," end",[710,947,948],{"class":724},");\n",[601,950,951,952,955,956,959],{},"Alternatively, you can construct an ",[608,953,954],{},"OpeningHours"," from a ",[608,957,958],{},"TimeWindow"," object:",[701,961,963],{"className":703,"code":962,"language":705,"meta":706,"style":706},"TimeWindow tw = new TimeWindow(start, end);\nIOpeningHours firstDay = new OpeningHours(tw);\n",[608,964,965,989],{"__ignoreMap":706},[710,966,967,969,972,974,976,979,981,983,985,987],{"class":712,"line":713},[710,968,958],{"class":716},[710,970,971],{"class":720}," tw ",[710,973,725],{"class":724},[710,975,932],{"class":931},[710,977,978],{"class":773}," TimeWindow",[710,980,777],{"class":724},[710,982,940],{"class":720},[710,984,784],{"class":724},[710,986,945],{"class":720},[710,988,948],{"class":724},[710,990,991,993,995,997,999,1001,1003,1006],{"class":712,"line":822},[710,992,748],{"class":716},[710,994,926],{"class":720},[710,996,725],{"class":724},[710,998,932],{"class":931},[710,1000,935],{"class":773},[710,1002,777],{"class":724},[710,1004,1005],{"class":720},"tw",[710,1007,948],{"class":724},[601,1009,1010],{},"Multiple opening hours are collected into a list:",[701,1012,1014],{"className":703,"code":1013,"language":705,"meta":706,"style":706},"List\u003CIOpeningHours> openingHours = new ArrayList\u003C>();\nopeningHours.add(dayOneHours);\nopeningHours.add(dayTwoHours);\n",[608,1015,1016,1042,1059],{"__ignoreMap":706},[710,1017,1018,1021,1024,1026,1029,1032,1034,1036,1039],{"class":712,"line":713},[710,1019,1020],{"class":716},"List",[710,1022,1023],{"class":724},"\u003C",[710,1025,748],{"class":716},[710,1027,1028],{"class":724},">",[710,1030,1031],{"class":720}," openingHours ",[710,1033,725],{"class":724},[710,1035,932],{"class":931},[710,1037,1038],{"class":716}," ArrayList",[710,1040,1041],{"class":724},"\u003C>();\n",[710,1043,1044,1047,1049,1052,1054,1057],{"class":712,"line":822},[710,1045,1046],{"class":720},"openingHours",[710,1048,770],{"class":724},[710,1050,1051],{"class":773},"add",[710,1053,777],{"class":724},[710,1055,1056],{"class":720},"dayOneHours",[710,1058,948],{"class":724},[710,1060,1061,1063,1065,1067,1069,1072],{"class":712,"line":844},[710,1062,1046],{"class":720},[710,1064,770],{"class":724},[710,1066,1051],{"class":773},[710,1068,777],{"class":724},[710,1070,1071],{"class":720},"dayTwoHours",[710,1073,948],{"class":724},[601,1075,1076],{},"Each opening hour corresponds to a potential visit slot. If a resource has matching WorkingHours on the same day, the optimizer can schedule the visit during that window.",[693,1078,1080],{"id":1079},"visit-duration","Visit duration",[601,1082,1083],{},"The time required to perform the task at the node. This is the productive service time, not including travel.",[701,1085,1087],{"className":703,"code":1086,"language":705,"meta":706,"style":706},"Duration visitDuration = Duration.ofMinutes(20);\n",[608,1088,1089],{"__ignoreMap":706},[710,1090,1091,1094,1097,1099,1102,1104,1107,1109,1112],{"class":712,"line":713},[710,1092,1093],{"class":716},"Duration",[710,1095,1096],{"class":720}," visitDuration ",[710,1098,725],{"class":724},[710,1100,1101],{"class":720}," Duration",[710,1103,770],{"class":724},[710,1105,1106],{"class":773},"ofMinutes",[710,1108,777],{"class":724},[710,1110,1111],{"class":780},"20",[710,1113,948],{"class":724},[601,1115,1116],{},"The optimizer accounts for this duration when scheduling: the resource must arrive, spend the visit duration at the node, and then travel to the next stop. A node with a 20-minute visit duration and a 30-minute driving time from the previous stop consumes at least 50 minutes of the resource's working time.",[601,1118,1119,1120,1123,1124,770],{},"Visit duration can be made route-dependent using the visit duration efficiency feature, where different resources can perform the same task faster or slower. See ",[608,1121,1122],{},"setHasRouteDependentVisitDuration(true)"," and ",[608,1125,1126],{},"setMinimalVisitDuration(...)",[693,1128,1130],{"id":1129},"importance","Importance",[601,1132,1133],{},"A relative integer value that influences how the optimizer prioritizes nodes when violations are unavoidable. A node with higher importance is less likely to be violated (late arrival, skipping) than a node with lower importance.",[701,1135,1137],{"className":703,"code":1136,"language":705,"meta":706,"style":706},"int importance = 1; \u002F\u002F default\n",[608,1138,1139],{"__ignoreMap":706},[710,1140,1141,1144,1147,1149,1152,1155],{"class":712,"line":713},[710,1142,1143],{"class":716},"int",[710,1145,1146],{"class":720}," importance ",[710,1148,725],{"class":724},[710,1150,1151],{"class":780}," 1",[710,1153,1154],{"class":724},";",[710,1156,1158],{"class":1157},"sHwdD"," \u002F\u002F default\n",[601,1160,1161],{},"Importance is relative. If all nodes have the same importance value, the optimizer treats them equally. The value only matters when nodes compete for limited resources or time windows. Common practice: use a small integer scale (e.g. 1 to 10) and assign higher values to contractually important tasks.",[596,1163,635],{"id":1164},"timewindowgeonode",[601,1166,1167],{},"The most common node type. Represents a physical location that must be visited within a time window.",[693,1169,1171],{"id":1170},"constructor","Constructor",[701,1173,1175],{"className":703,"code":1174,"language":705,"meta":706,"style":706},"INode node = new TimeWindowGeoNode(\n    \"Cologne\",           \u002F\u002F unique ID\n    50.9333,             \u002F\u002F latitude\n    6.95,                \u002F\u002F longitude\n    openingHours,        \u002F\u002F List\u003CIOpeningHours>\n    Duration.ofMinutes(20), \u002F\u002F visit duration\n    1                    \u002F\u002F importance\n);\n",[608,1176,1177,1194,1208,1218,1228,1238,1257,1266],{"__ignoreMap":706},[710,1178,1179,1181,1184,1186,1188,1191],{"class":712,"line":713},[710,1180,610],{"class":716},[710,1182,1183],{"class":720}," node ",[710,1185,725],{"class":724},[710,1187,932],{"class":931},[710,1189,1190],{"class":773}," TimeWindowGeoNode",[710,1192,1193],{"class":724},"(\n",[710,1195,1196,1199,1201,1203,1205],{"class":712,"line":822},[710,1197,1198],{"class":724},"    \"",[710,1200,732],{"class":731},[710,1202,735],{"class":724},[710,1204,784],{"class":724},[710,1206,1207],{"class":1157},"           \u002F\u002F unique ID\n",[710,1209,1210,1213,1215],{"class":712,"line":844},[710,1211,1212],{"class":780},"    50.9333",[710,1214,784],{"class":724},[710,1216,1217],{"class":1157},"             \u002F\u002F latitude\n",[710,1219,1220,1223,1225],{"class":712,"line":895},[710,1221,1222],{"class":780},"    6.95",[710,1224,784],{"class":724},[710,1226,1227],{"class":1157},"                \u002F\u002F longitude\n",[710,1229,1230,1233,1235],{"class":712,"line":914},[710,1231,1232],{"class":720},"    openingHours",[710,1234,784],{"class":724},[710,1236,1237],{"class":1157},"        \u002F\u002F List\u003CIOpeningHours>\n",[710,1239,1240,1243,1245,1247,1249,1251,1254],{"class":712,"line":921},[710,1241,1242],{"class":720},"    Duration",[710,1244,770],{"class":724},[710,1246,1106],{"class":773},[710,1248,777],{"class":724},[710,1250,1111],{"class":780},[710,1252,1253],{"class":724},"),",[710,1255,1256],{"class":1157}," \u002F\u002F visit duration\n",[710,1258,1260,1263],{"class":712,"line":1259},7,[710,1261,1262],{"class":780},"    1",[710,1264,1265],{"class":1157},"                    \u002F\u002F importance\n",[710,1267,1269],{"class":712,"line":1268},8,[710,1270,948],{"class":724},[1272,1273,1274,1290],"table",{},[1275,1276,1277],"thead",{},[1278,1279,1280,1284,1287],"tr",{},[1281,1282,1283],"th",{},"Parameter",[1281,1285,1286],{},"Type",[1281,1288,1289],{},"Description",[1291,1292,1293,1308,1323,1337,1351,1365],"tbody",{},[1278,1294,1295,1301,1305],{},[1296,1297,1298],"td",{},[608,1299,1300],{},"id",[1296,1302,1303],{},[608,1304,717],{},[1296,1306,1307],{},"Unique identifier for the node",[1278,1309,1310,1315,1320],{},[1296,1311,1312],{},[608,1313,1314],{},"latitude",[1296,1316,1317],{},[608,1318,1319],{},"double",[1296,1321,1322],{},"Geographic latitude of the node's location",[1278,1324,1325,1330,1334],{},[1296,1326,1327],{},[608,1328,1329],{},"longitude",[1296,1331,1332],{},[608,1333,1319],{},[1296,1335,1336],{},"Geographic longitude of the node's location",[1278,1338,1339,1343,1348],{},[1296,1340,1341],{},[608,1342,1046],{},[1296,1344,1345],{},[608,1346,1347],{},"List\u003CIOpeningHours>",[1296,1349,1350],{},"Time windows when the node can be visited",[1278,1352,1353,1358,1362],{},[1296,1354,1355],{},[608,1356,1357],{},"visitDuration",[1296,1359,1360],{},[608,1361,1093],{},[1296,1363,1364],{},"Service time required at the node",[1278,1366,1367,1371,1375],{},[1296,1368,1369],{},[608,1370,1129],{},[1296,1372,1373],{},[608,1374,1143],{},[1296,1376,1377],{},"Relative priority (higher = more protected from violations)",[601,1379,1380],{},"The geo coordinates define where the node is located on the map. The optimizer uses these coordinates to calculate distances and travel times between nodes, either through external connection data or the built-in backup connector.",[693,1382,1384],{"id":1383},"when-to-use","When to use",[601,1386,1387,1388,1390],{},"Use ",[608,1389,635],{}," for any task that requires physical presence at a location: customer visits, deliveries, inspections, maintenance jobs, installations.",[596,1392,641],{"id":1393},"eventnode",[601,1395,1396],{},"A node without a geographical location. Represents a task that must happen within a time window but does not require travel.",[693,1398,1171],{"id":1399},"constructor-1",[701,1401,1403],{"className":703,"code":1402,"language":705,"meta":706,"style":706},"INode event = new EventNode(\n    \"Customer Call\",     \u002F\u002F unique ID\n    openingHours,        \u002F\u002F List\u003CIOpeningHours>\n    Duration.ofMinutes(30), \u002F\u002F visit duration\n    1                    \u002F\u002F importance\n);\n",[608,1404,1405,1421,1435,1443,1460,1466],{"__ignoreMap":706},[710,1406,1407,1409,1412,1414,1416,1419],{"class":712,"line":713},[710,1408,610],{"class":716},[710,1410,1411],{"class":720}," event ",[710,1413,725],{"class":724},[710,1415,932],{"class":931},[710,1417,1418],{"class":773}," EventNode",[710,1420,1193],{"class":724},[710,1422,1423,1425,1428,1430,1432],{"class":712,"line":822},[710,1424,1198],{"class":724},[710,1426,1427],{"class":731},"Customer Call",[710,1429,735],{"class":724},[710,1431,784],{"class":724},[710,1433,1434],{"class":1157},"     \u002F\u002F unique ID\n",[710,1436,1437,1439,1441],{"class":712,"line":844},[710,1438,1232],{"class":720},[710,1440,784],{"class":724},[710,1442,1237],{"class":1157},[710,1444,1445,1447,1449,1451,1453,1456,1458],{"class":712,"line":895},[710,1446,1242],{"class":720},[710,1448,770],{"class":724},[710,1450,1106],{"class":773},[710,1452,777],{"class":724},[710,1454,1455],{"class":780},"30",[710,1457,1253],{"class":724},[710,1459,1256],{"class":1157},[710,1461,1462,1464],{"class":712,"line":914},[710,1463,1262],{"class":780},[710,1465,1265],{"class":1157},[710,1467,1468],{"class":712,"line":921},[710,1469,948],{"class":724},[1272,1471,1472,1482],{},[1275,1473,1474],{},[1278,1475,1476,1478,1480],{},[1281,1477,1283],{},[1281,1479,1286],{},[1281,1481,1289],{},[1291,1483,1484,1497,1510,1523],{},[1278,1485,1486,1490,1494],{},[1296,1487,1488],{},[608,1489,1300],{},[1296,1491,1492],{},[608,1493,717],{},[1296,1495,1496],{},"Unique identifier",[1278,1498,1499,1503,1507],{},[1296,1500,1501],{},[608,1502,1046],{},[1296,1504,1505],{},[608,1506,1347],{},[1296,1508,1509],{},"Time windows when the task can be performed",[1278,1511,1512,1516,1520],{},[1296,1513,1514],{},[608,1515,1357],{},[1296,1517,1518],{},[608,1519,1093],{},[1296,1521,1522],{},"Time required for the task",[1278,1524,1525,1529,1533],{},[1296,1526,1527],{},[608,1528,1129],{},[1296,1530,1531],{},[608,1532,1143],{},[1296,1534,1535],{},"Relative priority",[601,1537,1538],{},"An EventNode has no latitude\u002Flongitude. It is placed into the route timeline like any other node (consuming visit duration within the opening hours), but it does not introduce travel distance. The optimizer schedules it in a gap between physical visits where it fits the time window.",[693,1540,1384],{"id":1541},"when-to-use-1",[601,1543,1387,1544,1546],{},[608,1545,641],{}," for phone calls, remote support sessions, paperwork, compliance steps, administrative tasks, or any work that can be done from anywhere within working hours. EventNodes can be mixed freely with geo nodes in the same optimization.",[596,1548,647],{"id":1549},"pillartimewindowgeonode",[601,1551,1552],{},"A geo-located node with a hard-constrained time window. The optimizer's architecture guarantees that the opening hours of a Pillar cannot be violated. This is not a high-penalty soft constraint. It is a structural property of the solution space.",[693,1554,1171],{"id":1555},"constructor-2",[701,1557,1559],{"className":703,"code":1558,"language":705,"meta":706,"style":706},"IOpeningHours pillarWindow = new OpeningHours(\n    ZonedDateTime.of(2020, MAY.getValue(), 6, 10, 0, 0, 0, ZoneId.of(\"Europe\u002FBerlin\")),\n    ZonedDateTime.of(2020, MAY.getValue(), 6, 10, 50, 0, 0, ZoneId.of(\"Europe\u002FBerlin\")));\n\nIPillarNode pillar = new PillarTimeWindowGeoNode(\n    \"Plumbing Appointment\",  \u002F\u002F unique ID\n    50.9333,                 \u002F\u002F latitude\n    6.95,                    \u002F\u002F longitude\n    pillarWindow             \u002F\u002F single OpeningHours (the SLA window)\n);\n",[608,1560,1561,1576,1638,1698,1702,1719,1733,1742,1751,1760],{"__ignoreMap":706},[710,1562,1563,1565,1568,1570,1572,1574],{"class":712,"line":713},[710,1564,748],{"class":716},[710,1566,1567],{"class":720}," pillarWindow ",[710,1569,725],{"class":724},[710,1571,932],{"class":931},[710,1573,935],{"class":773},[710,1575,1193],{"class":724},[710,1577,1578,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1606,1608,1610,1612,1614,1616,1618,1620,1623,1625,1627,1629,1631,1633,1635],{"class":712,"line":822},[710,1579,1580],{"class":720},"    ZonedDateTime",[710,1582,770],{"class":724},[710,1584,774],{"class":773},[710,1586,777],{"class":724},[710,1588,781],{"class":780},[710,1590,784],{"class":724},[710,1592,787],{"class":720},[710,1594,770],{"class":724},[710,1596,792],{"class":773},[710,1598,795],{"class":724},[710,1600,798],{"class":780},[710,1602,784],{"class":724},[710,1604,1605],{"class":780}," 10",[710,1607,784],{"class":724},[710,1609,808],{"class":780},[710,1611,784],{"class":724},[710,1613,808],{"class":780},[710,1615,784],{"class":724},[710,1617,808],{"class":780},[710,1619,784],{"class":724},[710,1621,1622],{"class":720}," ZoneId",[710,1624,770],{"class":724},[710,1626,774],{"class":773},[710,1628,777],{"class":724},[710,1630,735],{"class":724},[710,1632,836],{"class":731},[710,1634,735],{"class":724},[710,1636,1637],{"class":724},")),\n",[710,1639,1640,1642,1644,1646,1648,1650,1652,1654,1656,1658,1660,1662,1664,1666,1668,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689,1691,1693,1695],{"class":712,"line":844},[710,1641,1580],{"class":720},[710,1643,770],{"class":724},[710,1645,774],{"class":773},[710,1647,777],{"class":724},[710,1649,781],{"class":780},[710,1651,784],{"class":724},[710,1653,787],{"class":720},[710,1655,770],{"class":724},[710,1657,792],{"class":773},[710,1659,795],{"class":724},[710,1661,798],{"class":780},[710,1663,784],{"class":724},[710,1665,1605],{"class":780},[710,1667,784],{"class":724},[710,1669,1670],{"class":780}," 50",[710,1672,784],{"class":724},[710,1674,808],{"class":780},[710,1676,784],{"class":724},[710,1678,808],{"class":780},[710,1680,784],{"class":724},[710,1682,1622],{"class":720},[710,1684,770],{"class":724},[710,1686,774],{"class":773},[710,1688,777],{"class":724},[710,1690,735],{"class":724},[710,1692,836],{"class":731},[710,1694,735],{"class":724},[710,1696,1697],{"class":724},")));\n",[710,1699,1700],{"class":712,"line":895},[710,1701,918],{"emptyLinePlaceholder":917},[710,1703,1704,1707,1710,1712,1714,1717],{"class":712,"line":914},[710,1705,1706],{"class":716},"IPillarNode",[710,1708,1709],{"class":720}," pillar ",[710,1711,725],{"class":724},[710,1713,932],{"class":931},[710,1715,1716],{"class":773}," PillarTimeWindowGeoNode",[710,1718,1193],{"class":724},[710,1720,1721,1723,1726,1728,1730],{"class":712,"line":921},[710,1722,1198],{"class":724},[710,1724,1725],{"class":731},"Plumbing Appointment",[710,1727,735],{"class":724},[710,1729,784],{"class":724},[710,1731,1732],{"class":1157},"  \u002F\u002F unique ID\n",[710,1734,1735,1737,1739],{"class":712,"line":1259},[710,1736,1212],{"class":780},[710,1738,784],{"class":724},[710,1740,1741],{"class":1157},"                 \u002F\u002F latitude\n",[710,1743,1744,1746,1748],{"class":712,"line":1268},[710,1745,1222],{"class":780},[710,1747,784],{"class":724},[710,1749,1750],{"class":1157},"                    \u002F\u002F longitude\n",[710,1752,1754,1757],{"class":712,"line":1753},9,[710,1755,1756],{"class":720},"    pillarWindow             ",[710,1758,1759],{"class":1157},"\u002F\u002F single OpeningHours (the SLA window)\n",[710,1761,1763],{"class":712,"line":1762},10,[710,1764,948],{"class":724},[601,1766,1767],{},"When the visit duration equals the opening hour window, it is not necessary to provide the duration separately. The node must be visited during exactly this window.",[601,1769,1770],{},"A Pillar can optionally be attached to a specific resource:",[701,1772,1774],{"className":703,"code":1773,"language":705,"meta":706,"style":706},"pillar.attachResource(john);\n",[608,1775,1776],{"__ignoreMap":706},[710,1777,1778,1781,1783,1786,1788,1791],{"class":712,"line":713},[710,1779,1780],{"class":720},"pillar",[710,1782,770],{"class":724},[710,1784,1785],{"class":773},"attachResource",[710,1787,777],{"class":724},[710,1789,1790],{"class":720},"john",[710,1792,948],{"class":724},[601,1794,1795],{},"This guarantees not only when the task is done but also who does it.",[693,1797,1384],{"id":1798},"when-to-use-2",[601,1800,1387,1801,1803,1804,1809],{},[608,1802,647],{}," for contractual SLAs, legal obligations, appointments with fixed time commitments, or any task where \"almost on time\" is not acceptable. See the ",[626,1805,1808],{"href":1806,"target":1807},"https:\u002F\u002Fwww.dna-evolutions.com\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fpillar_nodes","_blank","Pillar Nodes feature guide"," for detailed conflict resolution behavior.",[596,1811,653],{"id":1812},"pillareventnode",[601,1814,1815,1816,1818],{},"A non-geographical Pillar. The same hard time-window guarantee as ",[608,1817,647],{},", but without a physical location.",[693,1820,1171],{"id":1821},"constructor-3",[701,1823,1825],{"className":703,"code":1824,"language":705,"meta":706,"style":706},"IPillarNode pillarCall = new PillarEventNode(\n    \"Important Call\",            \u002F\u002F unique ID\n    pillarOpeningHours,          \u002F\u002F single OpeningHours\n    Duration.ofMinutes(30)       \u002F\u002F visit duration\n);\n\npillarCall.attachResource(jack);\n",[608,1826,1827,1843,1857,1867,1885,1889,1893],{"__ignoreMap":706},[710,1828,1829,1831,1834,1836,1838,1841],{"class":712,"line":713},[710,1830,1706],{"class":716},[710,1832,1833],{"class":720}," pillarCall ",[710,1835,725],{"class":724},[710,1837,932],{"class":931},[710,1839,1840],{"class":773}," PillarEventNode",[710,1842,1193],{"class":724},[710,1844,1845,1847,1850,1852,1854],{"class":712,"line":822},[710,1846,1198],{"class":724},[710,1848,1849],{"class":731},"Important Call",[710,1851,735],{"class":724},[710,1853,784],{"class":724},[710,1855,1856],{"class":1157},"            \u002F\u002F unique ID\n",[710,1858,1859,1862,1864],{"class":712,"line":844},[710,1860,1861],{"class":720},"    pillarOpeningHours",[710,1863,784],{"class":724},[710,1865,1866],{"class":1157},"          \u002F\u002F single OpeningHours\n",[710,1868,1869,1871,1873,1875,1877,1879,1882],{"class":712,"line":895},[710,1870,1242],{"class":720},[710,1872,770],{"class":724},[710,1874,1106],{"class":773},[710,1876,777],{"class":724},[710,1878,1455],{"class":780},[710,1880,1881],{"class":724},")",[710,1883,1884],{"class":1157},"       \u002F\u002F visit duration\n",[710,1886,1887],{"class":712,"line":914},[710,1888,948],{"class":724},[710,1890,1891],{"class":712,"line":921},[710,1892,918],{"emptyLinePlaceholder":917},[710,1894,1895,1898,1900,1902,1904,1907],{"class":712,"line":1259},[710,1896,1897],{"class":720},"pillarCall",[710,1899,770],{"class":724},[710,1901,1785],{"class":773},[710,1903,777],{"class":724},[710,1905,1906],{"class":720},"jack",[710,1908,948],{"class":724},[693,1910,1384],{"id":1911},"when-to-use-3",[601,1913,1387,1914,1916],{},[608,1915,653],{}," for time-critical phone calls, compliance deadlines, or remote tasks that must happen in an exact window and cannot be missed.",[596,1918,659],{"id":1919},"optional-nodes",[601,1921,1922],{},"Any node type can be marked as optional. An optional node may or may not be visited, depending on what is globally optimal. The optimizer decides whether including the node improves or worsens the total cost.",[701,1924,1926],{"className":703,"code":1925,"language":705,"meta":706,"style":706},"node.setIsOptional(true);\n",[608,1927,1928],{"__ignoreMap":706},[710,1929,1930,1933,1935,1938],{"class":712,"line":713},[710,1931,1932],{"class":720},"node",[710,1934,770],{"class":724},[710,1936,1937],{"class":773},"setIsOptional",[710,1939,1940],{"class":724},"(true);\n",[601,1942,1943],{},"Optional nodes are useful for:",[620,1945,1946,1949,1952],{},[623,1947,1948],{},"Intermediate stops in pickup and delivery (e.g. waste dumps, reload points)",[623,1950,1951],{},"Nice-to-have visits that can be deferred if the schedule is too tight",[623,1953,1954],{},"Buffer nodes that absorb excess capacity",[601,1956,1957],{},"When an optional node is not visited, it does not appear in the result routes. The optimizer reports which optional nodes were included and which were skipped.",[596,1959,665],{"id":1960},"stay-nodes",[601,1962,1963],{},"Any geo node can be marked as a stay node, making it eligible as an overnight position for multi-day routing:",[701,1965,1967],{"className":703,"code":1966,"language":705,"meta":706,"style":706},"node.setIsStayNode(true);\n",[608,1968,1969],{"__ignoreMap":706},[710,1970,1971,1973,1975,1978],{"class":712,"line":713},[710,1972,1932],{"class":720},[710,1974,770],{"class":724},[710,1976,1977],{"class":773},"setIsStayNode",[710,1979,1940],{"class":724},[601,1981,1982,1983,1987],{},"A stay node can simultaneously be optional. The optimizer will visit the hotel only if staying out is beneficial. See the ",[626,1984,1986],{"href":1985,"target":1807},"https:\u002F\u002Fwww.dna-evolutions.com\u002Fdocs\u002Flearn-and-explore\u002Ffeature-guides\u002Fovernight_stay","Overnight Stay feature guide"," for policy controls.",[596,1989,671],{"id":1990},"builder-pattern",[601,1992,1993],{},"For enterprise integrations and REST-compatible workflows, JOpt provides an immutable builder pattern. Instead of using constructors, you compose nodes fluently:",[701,1995,1997],{"className":703,"code":1996,"language":705,"meta":706,"style":706},"Node node = Node.builder()\n    .id(\"Cologne\")\n    .type(GeoNode.of(Position.of(50.9333, 6.95)))\n    .visitDuration(Duration.ofMinutes(20))\n    .addOpeningHours(\n        OpeningHours.builder()\n            .begin(begin.toInstant())\n            .end(end.toInstant())\n            .zoneId(begin.getZone())\n            .build())\n    .build();\n",[608,1998,1999,2019,2037,2075,2096,2105,2116,2136,2153,2171,2180],{"__ignoreMap":706},[710,2000,2001,2004,2006,2008,2011,2013,2016],{"class":712,"line":713},[710,2002,2003],{"class":716},"Node",[710,2005,1183],{"class":720},[710,2007,725],{"class":724},[710,2009,2010],{"class":720}," Node",[710,2012,770],{"class":724},[710,2014,2015],{"class":773},"builder",[710,2017,2018],{"class":724},"()\n",[710,2020,2021,2024,2026,2028,2030,2032,2034],{"class":712,"line":822},[710,2022,2023],{"class":724},"    .",[710,2025,1300],{"class":773},[710,2027,777],{"class":724},[710,2029,735],{"class":724},[710,2031,732],{"class":731},[710,2033,735],{"class":724},[710,2035,2036],{"class":724},")\n",[710,2038,2039,2041,2044,2046,2049,2051,2053,2055,2058,2060,2062,2064,2067,2069,2072],{"class":712,"line":844},[710,2040,2023],{"class":724},[710,2042,2043],{"class":773},"type",[710,2045,777],{"class":724},[710,2047,2048],{"class":720},"GeoNode",[710,2050,770],{"class":724},[710,2052,774],{"class":773},[710,2054,777],{"class":724},[710,2056,2057],{"class":720},"Position",[710,2059,770],{"class":724},[710,2061,774],{"class":773},[710,2063,777],{"class":724},[710,2065,2066],{"class":780},"50.9333",[710,2068,784],{"class":724},[710,2070,2071],{"class":780}," 6.95",[710,2073,2074],{"class":724},")))\n",[710,2076,2077,2079,2081,2083,2085,2087,2089,2091,2093],{"class":712,"line":895},[710,2078,2023],{"class":724},[710,2080,1357],{"class":773},[710,2082,777],{"class":724},[710,2084,1093],{"class":720},[710,2086,770],{"class":724},[710,2088,1106],{"class":773},[710,2090,777],{"class":724},[710,2092,1111],{"class":780},[710,2094,2095],{"class":724},"))\n",[710,2097,2098,2100,2103],{"class":712,"line":914},[710,2099,2023],{"class":724},[710,2101,2102],{"class":773},"addOpeningHours",[710,2104,1193],{"class":724},[710,2106,2107,2110,2112,2114],{"class":712,"line":921},[710,2108,2109],{"class":720},"        OpeningHours",[710,2111,770],{"class":724},[710,2113,2015],{"class":773},[710,2115,2018],{"class":724},[710,2117,2118,2121,2124,2126,2128,2130,2133],{"class":712,"line":1259},[710,2119,2120],{"class":724},"            .",[710,2122,2123],{"class":773},"begin",[710,2125,777],{"class":724},[710,2127,2123],{"class":720},[710,2129,770],{"class":724},[710,2131,2132],{"class":773},"toInstant",[710,2134,2135],{"class":724},"())\n",[710,2137,2138,2140,2143,2145,2147,2149,2151],{"class":712,"line":1268},[710,2139,2120],{"class":724},[710,2141,2142],{"class":773},"end",[710,2144,777],{"class":724},[710,2146,2142],{"class":720},[710,2148,770],{"class":724},[710,2150,2132],{"class":773},[710,2152,2135],{"class":724},[710,2154,2155,2157,2160,2162,2164,2166,2169],{"class":712,"line":1753},[710,2156,2120],{"class":724},[710,2158,2159],{"class":773},"zoneId",[710,2161,777],{"class":724},[710,2163,2123],{"class":720},[710,2165,770],{"class":724},[710,2167,2168],{"class":773},"getZone",[710,2170,2135],{"class":724},[710,2172,2173,2175,2178],{"class":712,"line":1762},[710,2174,2120],{"class":724},[710,2176,2177],{"class":773},"build",[710,2179,2135],{"class":724},[710,2181,2183,2185,2187],{"class":712,"line":2182},11,[710,2184,2023],{"class":724},[710,2186,2177],{"class":773},[710,2188,2189],{"class":724},"();\n",[601,2191,2192,2193,2196],{},"The builder produces an immutable object that can be serialized to JSON and used across REST, SDK, and test environments. The ",[608,2194,2195],{},"OptimizationConfig"," builder composes nodes, resources, and properties into a single immutable configuration:",[701,2198,2200],{"className":703,"code":2199,"language":705,"meta":706,"style":706},"OptimizationConfig\u003CJSONConfig> config = OptimizationConfig.\u003CJSONConfig>builder()\n    .addAllNodes(createNodes())\n    .addAllResources(createResources())\n    .extension(createExtension())\n    .options(createOptions())\n    .build();\n",[608,2201,2202,2232,2246,2260,2274,2288],{"__ignoreMap":706},[710,2203,2204,2206,2208,2211,2213,2216,2218,2221,2224,2226,2228,2230],{"class":712,"line":713},[710,2205,2195],{"class":716},[710,2207,1023],{"class":724},[710,2209,2210],{"class":716},"JSONConfig",[710,2212,1028],{"class":724},[710,2214,2215],{"class":720}," config ",[710,2217,725],{"class":724},[710,2219,2220],{"class":720}," OptimizationConfig",[710,2222,2223],{"class":724},".\u003C",[710,2225,2210],{"class":720},[710,2227,1028],{"class":724},[710,2229,2015],{"class":773},[710,2231,2018],{"class":724},[710,2233,2234,2236,2239,2241,2244],{"class":712,"line":822},[710,2235,2023],{"class":724},[710,2237,2238],{"class":773},"addAllNodes",[710,2240,777],{"class":724},[710,2242,2243],{"class":773},"createNodes",[710,2245,2135],{"class":724},[710,2247,2248,2250,2253,2255,2258],{"class":712,"line":844},[710,2249,2023],{"class":724},[710,2251,2252],{"class":773},"addAllResources",[710,2254,777],{"class":724},[710,2256,2257],{"class":773},"createResources",[710,2259,2135],{"class":724},[710,2261,2262,2264,2267,2269,2272],{"class":712,"line":895},[710,2263,2023],{"class":724},[710,2265,2266],{"class":773},"extension",[710,2268,777],{"class":724},[710,2270,2271],{"class":773},"createExtension",[710,2273,2135],{"class":724},[710,2275,2276,2278,2281,2283,2286],{"class":712,"line":914},[710,2277,2023],{"class":724},[710,2279,2280],{"class":773},"options",[710,2282,777],{"class":724},[710,2284,2285],{"class":773},"createOptions",[710,2287,2135],{"class":724},[710,2289,2290,2292,2294],{"class":712,"line":921},[710,2291,2023],{"class":724},[710,2293,2177],{"class":773},[710,2295,2189],{"class":724},[601,2297,2298],{},"This is the recommended approach when building optimization inputs programmatically, especially in service contexts where reproducibility and serialization matter.",[2300,2301,2302],"note",{},[601,2303,2304,2305,770],{},"Example on GitHub: ",[626,2306,2308],{"href":2307,"target":1807},"https:\u002F\u002Fgithub.com\u002FDNA-Evolutions\u002FJava-TourOptimizer-Examples\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fdna\u002Fjopt\u002Ftouroptimizer\u002Fjava\u002Fexamples\u002Fadvanced\u002Fbuilderpattern\u002FBuilderPatternExample.java","BuilderPatternExample.java",[596,2310,677],{"id":2311},"adding-nodes-to-the-optimization",[601,2313,2314],{},"Once constructed, nodes are added to the optimization instance:",[701,2316,2318],{"className":703,"code":2317,"language":705,"meta":706,"style":706},"opti.addElement(node);\n",[608,2319,2320],{"__ignoreMap":706},[710,2321,2322,2325,2327,2330,2332,2334],{"class":712,"line":713},[710,2323,2324],{"class":720},"opti",[710,2326,770],{"class":724},[710,2328,2329],{"class":773},"addElement",[710,2331,777],{"class":724},[710,2333,1932],{"class":720},[710,2335,948],{"class":724},[601,2337,2338,2339,2342],{},"All node types use the same ",[608,2340,2341],{},"addElement(...)"," method. Geo nodes, event nodes, pillars, and optional nodes are all added the same way. The optimizer identifies the type internally and applies the appropriate handling.",[601,2344,2345],{},"Node IDs must be unique. If you add a node with an ID that already exists, it will be rejected.",[613,2347],{},[596,2349,683],{"id":2350},"summary",[1272,2352,2353,2369],{},[1275,2354,2355],{},[1278,2356,2357,2360,2363,2366],{},[1281,2358,2359],{},"Node type",[1281,2361,2362],{},"Has location",[1281,2364,2365],{},"Hard time window",[1281,2367,2368],{},"Typical use case",[1291,2370,2371,2386,2400,2414],{},[1278,2372,2373,2377,2380,2383],{},[1296,2374,2375],{},[608,2376,635],{},[1296,2378,2379],{},"Yes",[1296,2381,2382],{},"No (soft)",[1296,2384,2385],{},"Customer visits, deliveries, inspections",[1278,2387,2388,2392,2395,2397],{},[1296,2389,2390],{},[608,2391,641],{},[1296,2393,2394],{},"No",[1296,2396,2382],{},[1296,2398,2399],{},"Phone calls, remote tasks, paperwork",[1278,2401,2402,2406,2408,2411],{},[1296,2403,2404],{},[608,2405,647],{},[1296,2407,2379],{},[1296,2409,2410],{},"Yes (architectural)",[1296,2412,2413],{},"Contractual SLAs, fixed appointments",[1278,2415,2416,2420,2422,2424],{},[1296,2417,2418],{},[608,2419,653],{},[1296,2421,2394],{},[1296,2423,2410],{},[1296,2425,2426],{},"Time-critical calls, compliance deadlines",[601,2428,2429],{},"Additional flags applicable to any node:",[620,2431,2432,2438],{},[623,2433,2434,2437],{},[608,2435,2436],{},"setIsOptional(true)",": optimizer decides whether to visit",[623,2439,2440,2443],{},[608,2441,2442],{},"setIsStayNode(true)",": eligible as overnight position",[601,2445,2446,2447,2451],{},"For the next step, see the ",[626,2448,2450],{"href":2449,"target":1807},"https:\u002F\u002Fwww.dna-evolutions.com\u002Fdocs\u002Fgetting-started\u002Ftutorials\u002Fbasic-elements","Basic Elements tutorial"," to learn how nodes and resources work together in an optimization.",[613,2453],{},[596,2455,2457],{"id":2456},"authors","Authors",[601,2459,2460,2461,2467],{},"A product by ",[626,2462,2466],{"href":2463,"rel":2464},"https:\u002F\u002Fwww.dna-evolutions.com",[2465],"nofollow","dna-evolutions ","©",[2469,2470,2471],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":706,"searchDepth":822,"depth":822,"links":2473},[2474,2475,2476,2482,2486,2490,2494,2498,2499,2500,2501,2502,2503],{"id":598,"depth":822,"text":599},{"id":617,"depth":822,"text":618},{"id":688,"depth":822,"text":629,"children":2477},[2478,2479,2480,2481],{"id":695,"depth":844,"text":696},{"id":741,"depth":844,"text":742},{"id":1079,"depth":844,"text":1080},{"id":1129,"depth":844,"text":1130},{"id":1164,"depth":822,"text":635,"children":2483},[2484,2485],{"id":1170,"depth":844,"text":1171},{"id":1383,"depth":844,"text":1384},{"id":1393,"depth":822,"text":641,"children":2487},[2488,2489],{"id":1399,"depth":844,"text":1171},{"id":1541,"depth":844,"text":1384},{"id":1549,"depth":822,"text":647,"children":2491},[2492,2493],{"id":1555,"depth":844,"text":1171},{"id":1798,"depth":844,"text":1384},{"id":1812,"depth":822,"text":653,"children":2495},[2496,2497],{"id":1821,"depth":844,"text":1171},{"id":1911,"depth":844,"text":1384},{"id":1919,"depth":822,"text":659},{"id":1960,"depth":822,"text":665},{"id":1990,"depth":822,"text":671},{"id":2311,"depth":822,"text":677},{"id":2350,"depth":822,"text":683},{"id":2456,"depth":822,"text":2457},null,"md",{},{"icon":67},{"title":64,"description":2504},"sUk1DJvftan60cMrLWYbQtzF3b9mntXtMp43ydo42T8",[2511,2512],{"title":59,"path":60,"stem":61,"description":706,"icon":62,"children":-1},{"title":69,"path":70,"stem":71,"description":2504,"icon":72,"children":-1},1775759478879]