Skip to content

Commit 31ef6e5

Browse files
committed
Added Bundling and Advanced Constraints Examples. Change Depot in Advance Constrints from Source to Address
1 parent 8799acb commit 31ef6e5

9 files changed

+330
-8
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>io.github.route4me</groupId>
66
<artifactId>route4me-java-sdk</artifactId>
7-
<version>1.11.3</version>
7+
<version>1.12.0</version>
88
<packaging>jar</packaging>
99
<properties>
1010
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package com.route4me.sdk.examples.advancedconstraints;
7+
8+
import com.route4me.sdk.exception.APIException;
9+
import com.route4me.sdk.services.routing.Address;
10+
import com.route4me.sdk.services.routing.Constants.AlgorithmType;
11+
import com.route4me.sdk.services.routing.Constants.DeviceType;
12+
import com.route4me.sdk.services.routing.Constants.OptimizationState;
13+
import com.route4me.sdk.services.routing.Constants.TravelMode;
14+
import com.route4me.sdk.services.routing.DataObject;
15+
import com.route4me.sdk.services.routing.OptimizationParameters;
16+
import com.route4me.sdk.services.routing.Parameters;
17+
import com.route4me.sdk.services.routing.RoutingManager;
18+
import com.route4me.sdk.services.routing.advancedconstraints.AdvancedConstraints;
19+
import com.route4me.sdk.services.territories.TerritoriesManager;
20+
import com.route4me.sdk.services.territories.Territory;
21+
import java.util.ArrayList;
22+
import java.util.Arrays;
23+
import java.util.List;
24+
import java.util.logging.Level;
25+
import java.util.logging.Logger;
26+
27+
/**
28+
*
29+
* @author juan
30+
*/
31+
public class OptimizationUsingTerritoriesOrdersDifferentDepot {
32+
33+
34+
35+
public static void main(String[] args) {
36+
try {
37+
String apiKey = System.getenv("R4M_API_KEY");
38+
RoutingManager manager = new RoutingManager(apiKey, true);
39+
OptimizationParameters optParameters = new OptimizationParameters();
40+
41+
//**********************************************************************
42+
// TEST CASE: Optimization using Territories Orders
43+
// 3 Territories
44+
//**********************************************************************
45+
46+
TerritoriesManager territoriesManager = new TerritoriesManager(apiKey);
47+
48+
49+
Parameters parameters = new Parameters();
50+
parameters.setAlgorithmType(AlgorithmType.ADVANCED_CVRP_TW.getValue());
51+
parameters.setStoreRoute(Boolean.FALSE);
52+
parameters.setShareRoute(Boolean.FALSE);
53+
parameters.setRouteTime((8 + 5) * 3600);
54+
parameters.setRouteName("Multiple Depot, Multiple Driver - 3 Territories Order IDs");
55+
parameters.setDeviceType(DeviceType.WEB.toString());
56+
parameters.setTravelMode(TravelMode.DRIVING.toString());
57+
optParameters.setParameters(parameters);
58+
59+
60+
// Territories
61+
// **********************
62+
List<String> zone1 = Arrays.asList("477FF1EB618FDE5C1CA85292B2A6DE92");
63+
List<String> zone2 = Arrays.asList("2A6E027E74A3623762BEA3D6E94B643E");
64+
List<String> zone3 = Arrays.asList("C8B7DEFFC4C42AB7674EA27CBC607B3F");
65+
66+
67+
68+
List<Address> addresses = new ArrayList<>();
69+
70+
Address address;
71+
72+
Territory territory = territoriesManager.getOrdersInTerritory(zone1.get(0));
73+
for (Integer orderId: territory.getOrders()){
74+
address = new Address();
75+
address.setOrderId(orderId);
76+
address.setTags(zone1);
77+
addresses.add(address);
78+
}
79+
80+
territory = territoriesManager.getOrdersInTerritory(zone2.get(0));
81+
for (Integer orderId: territory.getOrders()){
82+
address = new Address();
83+
address.setOrderId(orderId);
84+
address.setTags(zone2);
85+
addresses.add(address);
86+
}
87+
88+
territory = territoriesManager.getOrdersInTerritory(zone3.get(0));
89+
for (Integer orderId: territory.getOrders()){
90+
address = new Address();
91+
address.setTags(zone3);
92+
address.setOrderId(orderId);
93+
addresses.add(address);
94+
}
95+
96+
AdvancedConstraints schedule1 = new AdvancedConstraints();
97+
schedule1.setDepotAddress(new Address("15110 Oakmont St, Overland Park, KS 66221, USA", "DEPOT KS", 38.854268, -94.7333895, 0));
98+
schedule1.setTags(zone1);
99+
schedule1.setMembersCount(1);
100+
List<List<Integer>> timeWindowsSchedule1 = new ArrayList<>();
101+
List<Integer> timeWindowSchedule1 = Arrays.asList((8 + 5) * 3600 , (11 + 5) * 3600);
102+
timeWindowsSchedule1.add(timeWindowSchedule1);
103+
schedule1.setAvailableTimeWindows(timeWindowsSchedule1);
104+
105+
106+
// Schedule 2
107+
// Time Window Start: 8:00 am EST
108+
// Time Window End: 12:00 pm EST
109+
AdvancedConstraints schedule2 = new AdvancedConstraints();
110+
schedule2.setDepotAddress(new Address("754 5th Ave, New York, NY 10019, USA", "DEPOT NY", 40.7636197, -73.9744388, 0));
111+
schedule2.setTags(zone2);
112+
schedule2.setMembersCount(1);
113+
List<List<Integer>> timeWindowsSchedule2 = new ArrayList<>();
114+
List<Integer> timeWindowSchedule2 = Arrays.asList((8 + 5) * 3600 , (12 + 5) * 3600);
115+
timeWindowsSchedule2.add(timeWindowSchedule2);
116+
schedule2.setAvailableTimeWindows(timeWindowsSchedule2);
117+
118+
119+
// Schedule 3
120+
// Time Window Start: 8:00 am EST
121+
// Time Window End: 01:00 pm EST
122+
AdvancedConstraints schedule3 = new AdvancedConstraints();
123+
schedule3.setDepotAddress(new Address("106 W Columbus Dr, Tampa, FL 33602, USA", "DEPOT FL", 27.9664433, -82.4564934, 0));
124+
125+
schedule3.setTags(zone3);
126+
schedule3.setMembersCount(1);
127+
List<List<Integer>> timeWindowsSchedule3 = new ArrayList<>();
128+
List<Integer> timeWindowSchedule3 = Arrays.asList((8 + 5) * 3600 , (13 + 5) * 3600);
129+
timeWindowsSchedule3.add(timeWindowSchedule3);
130+
schedule3.setAvailableTimeWindows(timeWindowsSchedule3);
131+
132+
133+
// Schedules registration
134+
List<AdvancedConstraints> advancedConstraints = Arrays.asList(schedule1, schedule2, schedule3);
135+
parameters.setAdvancedConstraints(advancedConstraints);
136+
137+
optParameters.setAddresses(addresses);
138+
139+
try {
140+
DataObject responseObject = manager.runOptimization(optParameters);
141+
System.out.println("Optimization Problem ID:" + responseObject.getOptimizationProblemId());
142+
System.out.println("State:" + OptimizationState.get(responseObject.getState().intValue()));
143+
if (responseObject.getAddresses() != null) {
144+
for (Address addressResponse : responseObject.getAddresses()) {
145+
System.out.println(addressResponse);
146+
}
147+
}
148+
} catch (APIException e) {
149+
//handle exception
150+
e.printStackTrace();
151+
}
152+
} catch (APIException ex) {
153+
Logger.getLogger(OptimizationUsingTerritoriesOrdersDifferentDepot.class.getName()).log(Level.SEVERE, null, ex);
154+
}
155+
}
156+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
/*
2+
* The MIT License
3+
*
4+
* Copyright 2022 Route4Me.
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
* THE SOFTWARE.
23+
*/
24+
package com.route4me.sdk.examples.bundling;
25+
26+
import com.route4me.sdk.exception.APIException;
27+
import com.route4me.sdk.services.routing.Address;
28+
import com.route4me.sdk.services.routing.Bundling;
29+
import com.route4me.sdk.services.routing.BundlingEnum;
30+
import com.route4me.sdk.services.routing.Constants;
31+
import com.route4me.sdk.services.routing.DataObject;
32+
import com.route4me.sdk.services.routing.OptimizationParameters;
33+
import com.route4me.sdk.services.routing.Parameters;
34+
import com.route4me.sdk.services.routing.RoutingManager;
35+
import com.route4me.sdk.services.routing.ServiceTimeRules;
36+
import java.util.ArrayList;
37+
import java.util.Arrays;
38+
import java.util.List;
39+
40+
/**
41+
*
42+
* @author route4me
43+
*/
44+
public class BundlingByAddressAndProrityConstraint {
45+
46+
public static void main(String[] args) {
47+
String apiKey = System.getenv("R4M_API_KEY");
48+
RoutingManager manager = new RoutingManager(apiKey, true);
49+
OptimizationParameters optParameters = new OptimizationParameters();
50+
51+
Parameters parameters = new Parameters();
52+
parameters.setAlgorithmType(Constants.AlgorithmType.CVRP_TW_SD.getValue());
53+
parameters.setStoreRoute(Boolean.FALSE);
54+
parameters.setShareRoute(Boolean.FALSE);
55+
parameters.setRouteName("Single Depot, Multiple Driver, Bundling by Address and having Priority Constraint");
56+
parameters.setTravelMode(Constants.TravelMode.DRIVING.toString());
57+
58+
List<Address> addresses = new ArrayList<>();
59+
// DEPOT
60+
addresses.add(new Address("1604 PARKRIDGE PKWY, Louisville, KY, 40214", true, 38.141598, -85.793846, 300));
61+
62+
// Addresses
63+
addresses.add(new Address("1407 MCCOY, Louisville, KY, 40215", 38.202496, -85.786514, 300));
64+
addresses.add(new Address("730 CECIL AVENUE, Louisville, KY, 40211", 38.248684, -85.821121, 300));
65+
addresses.add(new Address("650 SOUTH 29TH ST UNIT 315, Louisville, KY, 40211", 38.251923, -85.800034, 300));
66+
addresses.add(new Address("4629 HILLSIDE DRIVE, Louisville, KY, 40216", 38.176067, -85.824638, 300));
67+
68+
// Bundling Addresses
69+
Address address;
70+
71+
address = new Address("318 SO. 39TH STREET, Louisville, KY, 40212", 38.259335, -85.815094, 300);
72+
address.setPriority(1);
73+
addresses.add(address);
74+
address = new Address("318 SO. 39TH STREET, Louisville, KY, 40212", 38.259335, -85.815094, 300);
75+
address.setPriority(2);
76+
addresses.add(address);
77+
78+
address = new Address("4629 HILLSIDE DRIVE, Louisville, KY, 40216", 38.176067, -85.824638, 300);
79+
address.setPriority(2);
80+
addresses.add(address);
81+
address = new Address("4629 HILLSIDE DRIVE, Louisville, KY, 40216", 38.176067, -85.824638, 300);
82+
address.setPriority(3);
83+
addresses.add(address);
84+
85+
86+
87+
address = new Address("4738 BELLEVUE AVE, Louisville, KY, 40215", 38.179806, -85.775558, 300);
88+
address.setPriority(3);
89+
addresses.add(address);
90+
address = new Address("4738 BELLEVUE AVE, Louisville, KY, 40215", 38.179806, -85.775558, 300);
91+
address.setPriority(4);
92+
addresses.add(address);
93+
address = new Address("4738 BELLEVUE AVE, Louisville, KY, 40215", 38.179806, -85.775558, 300);
94+
address.setPriority(5);
95+
addresses.add(address);
96+
address = new Address("4738 BELLEVUE AVE, Louisville, KY, 40215", 38.179806, -85.775558, 300);
97+
address.setPriority(6);
98+
99+
100+
address = new Address("1324 BLUEGRASS AVE, Louisville, KY, 40215", 38.179253, -85.785118, 300);
101+
address.setPriority(4);
102+
addresses.add(address);
103+
address = new Address("1324 BLUEGRASS AVE, Louisville, KY, 40215", 38.179253, -85.785118, 300);
104+
address.setPriority(5);
105+
addresses.add(address);
106+
address = new Address("1324 BLUEGRASS AVE, Louisville, KY, 40215", 38.179253, -85.785118, 300);
107+
address.setPriority(6);
108+
addresses.add(address);
109+
address = new Address("1324 BLUEGRASS AVE, Louisville, KY, 40215", 38.179253, -85.785118, 300);
110+
address.setPriority(7);
111+
addresses.add(address);
112+
address = new Address("1324 BLUEGRASS AVE, Louisville, KY, 40215", 38.179253, -85.785118, 300);
113+
address.setPriority(8);
114+
addresses.add(address);
115+
address = new Address("1324 BLUEGRASS AVE, Louisville, KY, 40215", 38.179253, -85.785118, 300);
116+
address.setPriority(9);
117+
addresses.add(address);
118+
119+
address = new Address("4805 BELLEVUE AVE, Louisville, KY, 40215", 38.162472, -85.792854, 300);
120+
address.setPriority(5);
121+
addresses.add(address);
122+
address = new Address("4805 BELLEVUE AVE, Louisville, KY, 40215", 38.162472, -85.792854, 300);
123+
address.setPriority(6);
124+
addresses.add(address);
125+
address = new Address("4805 BELLEVUE AVE, Louisville, KY, 40215", 38.162472, -85.792854, 300);
126+
address.setPriority(7);
127+
addresses.add(address);
128+
address = new Address("4805 BELLEVUE AVE, Louisville, KY, 40215", 38.162472, -85.792854, 300);
129+
address.setPriority(8);
130+
addresses.add(address);
131+
132+
optParameters.setAddresses(addresses);
133+
134+
Bundling bundling = new Bundling();
135+
136+
bundling.setMergeMode(BundlingEnum.BundledItemsMode.KEEP_AS_SEPARATE_DESTINATIONS.getValue());
137+
138+
bundling.setMode(BundlingEnum.BundlingMode.BUNDLING_BY_ADDRESS.getValue());
139+
List<String> modeParams = Arrays.asList("custom_fields.BUNDLING_KEY", "custom_fields.LOCATION_ID");
140+
bundling.setModeParams(modeParams);
141+
ServiceTimeRules serviceTimeRules = new ServiceTimeRules();
142+
serviceTimeRules.setFirstItemMode(BundlingEnum.BundlingFirstItemMode.USE_CUSTOM_SERVICE_TIME.getValue());
143+
serviceTimeRules.setAdditionalItemsMode(BundlingEnum.BundlingAdditionalItemMode.USE_CUSTOM_SERVICE_TIME_FOR_ADDITIONAL_ITEM.getValue());
144+
ArrayList<Integer> firstItemModeParams = new ArrayList();
145+
firstItemModeParams.add(900);
146+
ArrayList<Integer> additionalItemModeParams = new ArrayList();
147+
additionalItemModeParams.add(200);
148+
serviceTimeRules.setFirstItemModeParams(firstItemModeParams);
149+
serviceTimeRules.setAdditionalItemsModeParams(additionalItemModeParams);
150+
bundling.setServiceTimeRules(serviceTimeRules);
151+
parameters.setBundling(bundling);
152+
153+
optParameters.setParameters(parameters);
154+
155+
try {
156+
DataObject responseObject = manager.runOptimization(optParameters);
157+
System.out.println("Optimization Problem ID:" + responseObject.getOptimizationProblemId());
158+
System.out.println("State:" + Constants.OptimizationState.get(responseObject.getState().intValue()));
159+
} catch (APIException e) {
160+
//handle exception
161+
e.printStackTrace();
162+
}
163+
164+
}
165+
166+
}

src/main/java/com/route4me/sdk/examples/bundling/BundlingUsingAddressStaticField.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static void main(String[] args) {
4444

4545
bundling.setMode(BundlingEnum.BundlingMode.BUNDLING_BY_ANY_STATIC_ADDRESS_FIELD.getValue());
4646

47-
bundling.setMergeMode(BundlingEnum.BundledItemsMode.MERGE_INTO_SINGLE_DESTINATION.getValue());
47+
bundling.setMergeMode(BundlingEnum.BundledItemsMode.KEEP_AS_SEPARATE_DESTINATIONS.getValue());
4848

4949

5050
List<String> modeParams = new ArrayList<>();

src/main/java/com/route4me/sdk/examples/bundling/BundlingUsingCustomField.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static void main(String[] args) {
5858

5959
Bundling bundling = new Bundling();
6060

61-
bundling.setMergeMode(BundlingEnum.BundledItemsMode.MERGE_INTO_SINGLE_DESTINATION.getValue());
61+
bundling.setMergeMode(BundlingEnum.BundledItemsMode.KEEP_AS_SEPARATE_DESTINATIONS.getValue());
6262

6363
bundling.setMode(BundlingEnum.BundlingMode.BUNDLING_BY_ANY_CUSTOM_DATA.getValue());
6464
List<String> modeParams = new ArrayList<>();

src/main/java/com/route4me/sdk/examples/bundling/DoNotAddServiceTimeAdditionalItem.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static void main(String[] args) {
2626

2727
Bundling bundling = new Bundling();
2828

29-
bundling.setMergeMode(BundlingEnum.BundledItemsMode.MERGE_INTO_SINGLE_DESTINATION.getValue());
29+
bundling.setMergeMode(BundlingEnum.BundledItemsMode.KEEP_AS_SEPARATE_DESTINATIONS.getValue());
3030

3131
bundling.setMode(BundlingEnum.BundlingMode.BUNDLING_BY_ADDRESS.getValue());
3232
ServiceTimeRules serviceTimeRules = new ServiceTimeRules();

src/main/java/com/route4me/sdk/examples/bundling/UseCustomServiceTimeFirstAndAdditionalItem.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static void main(String[] args) {
2626

2727
Bundling bundling = new Bundling();
2828

29-
bundling.setMergeMode(BundlingEnum.BundledItemsMode.MERGE_INTO_SINGLE_DESTINATION.getValue());
29+
bundling.setMergeMode(BundlingEnum.BundledItemsMode.KEEP_AS_SEPARATE_DESTINATIONS.getValue());
3030

3131
bundling.setMode(BundlingEnum.BundlingMode.BUNDLING_BY_ADDRESS.getValue());
3232
ServiceTimeRules serviceTimeRules = new ServiceTimeRules();

src/main/java/com/route4me/sdk/examples/bundling/UseCustomServiceTimeFirstItem.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static void main(String[] args) {
2626

2727
Bundling bundling = new Bundling();
2828

29-
bundling.setMergeMode(BundlingEnum.BundledItemsMode.MERGE_INTO_SINGLE_DESTINATION.getValue());
29+
bundling.setMergeMode(BundlingEnum.BundledItemsMode.KEEP_AS_SEPARATE_DESTINATIONS.getValue());
3030

3131
bundling.setMode(BundlingEnum.BundlingMode.BUNDLING_BY_ADDRESS.getValue());
3232
ServiceTimeRules serviceTimeRules = new ServiceTimeRules();

src/main/java/com/route4me/sdk/services/routing/advancedconstraints/AdvancedConstraints.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import com.google.gson.annotations.SerializedName;
99
import com.route4me.sdk.queryconverter.QueryParameter;
10-
import com.route4me.sdk.services.routing.Source;
10+
import com.route4me.sdk.services.routing.Address;
1111
import java.util.List;
1212
import lombok.Data;
1313

@@ -40,7 +40,7 @@ public class AdvancedConstraints {
4040

4141
@SerializedName("depot_address")
4242
@QueryParameter("depot_address")
43-
private Source depotAddress;
43+
private Address depotAddress;
4444

4545
@SerializedName("location_sequence_pattern")
4646
@QueryParameter("location_sequence_pattern")

0 commit comments

Comments
 (0)