Skip to content

Commit 6c805fa

Browse files
authored
Merge pull request #14 from route4me/advanced_constraints
Added "Advanced constraints" examples.
2 parents 77a95b5 + dec8f12 commit 6c805fa

22 files changed

+2490
-8
lines changed

UnitTestFiles/Test/AdvancedConstraintsUnitTests.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ public static function tearDownAfterClass()
8080
'redirect' => 0,
8181
];
8282

83-
$result = self:: $problem->removeOptimization($params);
83+
$result = self::$problem->removeOptimization($params);
8484

85-
if ($result!=null && $result['status']==true) {
85+
if ($result != null && $result['status'] == true) {
8686
echo "The test optimization was removed <br>";
8787
} else {
8888
echo "Cannot remove the test optimization <br>";

UnitTestFiles/Test/OrderTests.php

+4-5
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ public function testCreateOrderWithCustomField()
325325
self::assertNotNull($response);
326326
self::assertInstanceOf(Order::class, Order::fromArray($response));
327327
$this->assertEquals(93,$response['custom_user_fields'][0]['order_custom_field_id']);
328-
$this->assertEquals('false',$response['custom_user_fields'][0]['order_custom_field_value']);
328+
$this->assertEquals(false,$response['custom_user_fields'][0]['order_custom_field_value']);
329329

330330
self::$createdOrders[] = $response;
331331
}
@@ -484,9 +484,8 @@ public function testUpdateOrder()
484484
$this->assertInstanceOf(Order::class, Order::fromArray($response));
485485
$this->assertEquals('Lviv', $response['address_2']);
486486
$this->assertEquals('032268593', $response['EXT_FIELD_phone']);
487-
$this->assertEquals(
488-
[
489-
0 => [ 'customer_no' => '11' ],
487+
$this->assertEquals([
488+
0 => '{"order_id":"10","name":"Bill Soul"}'
490489
],
491490
$response['EXT_FIELD_custom_data']
492491
);
@@ -511,7 +510,7 @@ public function testUpdateOrderWithCustomFiel()
511510
$this->assertNotNull($response);
512511
$this->assertInstanceOf(Order::class, Order::fromArray($response));
513512
$this->assertEquals(93, $response['custom_user_fields'][0]['order_custom_field_id']);
514-
$this->assertEquals('true', $response['custom_user_fields'][0]['order_custom_field_value']);
513+
$this->assertEquals(true, $response['custom_user_fields'][0]['order_custom_field_value']);
515514
}
516515

517516
public static function tearDownAfterClass()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
//**********************************************************************
4+
// Driver's Different Working Time
5+
// Drivers have 2 Working Times:
6+
// Full Time 8h
7+
// Partial Time 4h
8+
//**********************************************************************
9+
10+
namespace Route4Me;
11+
12+
$root = realpath(dirname(__FILE__).'/../../');
13+
require $root.'/vendor/autoload.php';
14+
15+
use Route4Me\Enum\OptimizationType;
16+
use Route4Me\Enum\AlgorithmType;
17+
use Route4Me\Enum\DistanceUnit;
18+
use Route4Me\Enum\DeviceType;
19+
use Route4Me\Enum\OptimizationStates;
20+
use Route4Me\Enum\TravelMode;
21+
use Route4Me\V5\Addresses\RouteAdvancedConstraints;
22+
23+
// Set the api key in the Route4me class
24+
Route4Me::setApiKey(Constants::API_KEY);
25+
26+
// Depot
27+
$depots = [
28+
Address::fromArray([
29+
'alias' => 'Start Depot',
30+
'address' => '1604 PARKRIDGE PKWY, Louisville, KY, 40214',
31+
'lat' => 38.141598,
32+
'lng' => -80.190211
33+
])
34+
];
35+
36+
//**********************************************************************
37+
// General Route Parameters
38+
$parameters = RouteParameters::fromArray([
39+
'algorithm_type' => Algorithmtype::ADVANCED_CVRP_TW,
40+
'route_name' => 'Drivers Different Working Time Example - Single Depot, Multiple Driver '.date('Y-m-d H:i:s', time()),
41+
'route_date' => time() + 24 * 60 * 60,
42+
'route_time' => 6 * 3600,
43+
'distance_unit' => DistanceUnit::MILES,
44+
'device_type' => DeviceType::WEB,
45+
'optimize' => OptimizationType::DISTANCE,
46+
'travel_mode' => TravelMode::DRIVING,
47+
'route_max_duration' => 8 * 60 * 60,
48+
'parts' => 6,
49+
'advanced_constraints' => []
50+
]);
51+
52+
//**********************************************************************
53+
// Schedules
54+
// Schedule part time
55+
// Time Window Start: 7:00 am EST
56+
// Time Window End: 11:00 am EST
57+
$parameters->advanced_constraints[] = RouteAdvancedConstraints::fromArray([
58+
'max_cargo_volume' => 0.0,
59+
'members_count' => 4,
60+
'available_time_windows' => [[(7 + 5) * 3600 , (11 + 5) * 3600]]
61+
]);
62+
63+
// Schedule full time
64+
// Time Window Start: 7:00 am EST
65+
// Time Window End: 15:00 am EST
66+
$parameters->advanced_constraints[] = RouteAdvancedConstraints::fromArray([
67+
'max_cargo_volume' => 0.0,
68+
'members_count' => 2,
69+
'available_time_windows' => [[(7 + 5) * 3600 , (15 + 5) * 3600]]
70+
]);
71+
72+
//**********************************************************************
73+
// Addresses
74+
$json = json_decode(file_get_contents(dirname(__FILE__).'/data/addresses_9.json'), true);
75+
$addresses = [];
76+
77+
foreach ($json as $address) {
78+
$addresses[] = Address::fromArray([
79+
'address' => $address['address'],
80+
'lat' => $address['lat'],
81+
'lng' => $address['lng'],
82+
'time' => $address['time']
83+
]);
84+
}
85+
86+
$optimizationParams = new OptimizationProblemParams();
87+
$optimizationParams->setAddresses($addresses);
88+
$optimizationParams->setDepots($depots);
89+
$optimizationParams->setParameters($parameters);
90+
91+
$problem = OptimizationProblem::optimize($optimizationParams);
92+
93+
echo "Optimization Problem ID: " . $problem->optimization_problem_id . PHP_EOL;
94+
echo "State: " . OptimizationStates::getName($problem->state) . " (" . $problem->state . ")" . PHP_EOL;
95+
96+
echo "Optimization Problem ID: " . $problem->optimization_problem_id . PHP_EOL;
97+
echo "State: " . OptimizationStates::getName($problem->state) . " (" . $problem->state . ")" . PHP_EOL;
98+
99+
echo "Routes:" . PHP_EOL;
100+
foreach($problem->routes as $route)
101+
{
102+
echo "\tID: " . $route->route_id . PHP_EOL;
103+
echo "\tDistance: " . $route->trip_distance . PHP_EOL;
104+
echo "\tAddresses:" . PHP_EOL;
105+
106+
foreach($route->addresses as $address) echo "\t\t" . $address->address . PHP_EOL;
107+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
3+
//**********************************************************************
4+
// Driver's Different Working Time
5+
// Drivers have 2 Working Times:
6+
// Full Time 8h
7+
// Partial Time 4h
8+
// 110 Stops
9+
// 3 Territories
10+
// 10 Drivers
11+
//**********************************************************************
12+
13+
namespace Route4Me;
14+
15+
$root = realpath(dirname(__FILE__).'/../../');
16+
require $root.'/vendor/autoload.php';
17+
18+
use Route4Me\Enum\OptimizationType;
19+
use Route4Me\Enum\AlgorithmType;
20+
use Route4Me\Enum\DistanceUnit;
21+
use Route4Me\Enum\DeviceType;
22+
use Route4Me\Enum\OptimizationStates;
23+
use Route4Me\Enum\TravelMode;
24+
use Route4Me\V5\Addresses\RouteAdvancedConstraints;
25+
26+
// Set the api key in the Route4me class
27+
Route4Me::setApiKey(Constants::API_KEY);
28+
29+
//**********************************************************************
30+
// General Route Parameters
31+
$parameters = RouteParameters::fromArray([
32+
'rt' => true,
33+
'algorithm_type' => Algorithmtype::ADVANCED_CVRP_TW,
34+
'route_name' => 'Drivers Different Working Time Example - Territories '.date('Y-m-d H:i:s', time()),
35+
'distance_unit' => DistanceUnit::MILES,
36+
'device_type' => DeviceType::WEB,
37+
'optimize' => OptimizationType::DISTANCE,
38+
'travel_mode' => TravelMode::DRIVING,
39+
'parts' => 10,
40+
'advanced_constraints'=> []
41+
]);
42+
43+
//**********************************************************************
44+
// Territories
45+
$zones = [["ZONE 01"], ["ZONE 02"], ["ZONE 03"]];
46+
47+
//**********************************************************************
48+
// Schedules
49+
// Time Window Start: 7:00 am EST
50+
// Part Time Window End: 11:00 am EST
51+
// Full Time Window End: 15:00 am EST
52+
for($i = 0; $i < 6; ++$i)
53+
{
54+
$parameters->advanced_constraints[] = RouteAdvancedConstraints::fromArray([
55+
'max_cargo_volume' => 0.0,
56+
'members_count' => 100,
57+
'available_time_windows' => [[(7 + 5) * 3600, ($i % 2 == 0 ? (11 + 5) : (15 + 5)) * 3600]],
58+
'tags' => $zones[intdiv($i, 2) % 3]
59+
]);
60+
}
61+
62+
//**********************************************************************
63+
// Addresses
64+
$json = json_decode(file_get_contents(dirname(__FILE__).'/data/addresses_110.json'), true);
65+
$addresses = [];
66+
67+
foreach ($json as $address) {
68+
$addresses[] = Address::fromArray($address);
69+
}
70+
71+
$optimizationParams = new OptimizationProblemParams();
72+
$optimizationParams->setAddresses($addresses);
73+
$optimizationParams->setParameters($parameters);
74+
75+
$problem = OptimizationProblem::optimize($optimizationParams);
76+
77+
echo "Optimization Problem ID: " . $problem->optimization_problem_id . PHP_EOL;
78+
echo "State: " . OptimizationStates::getName($problem->state) . " (" . $problem->state . ")" . PHP_EOL;
79+
80+
echo "Optimization Problem ID: " . $problem->optimization_problem_id . PHP_EOL;
81+
echo "State: " . OptimizationStates::getName($problem->state) . " (" . $problem->state . ")" . PHP_EOL;
82+
83+
echo "Routes:" . PHP_EOL;
84+
foreach($problem->routes as $route)
85+
{
86+
echo "\tID: " . $route->route_id . PHP_EOL;
87+
echo "\tDistance: " . $route->trip_distance . PHP_EOL;
88+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
3+
//**********************************************************************
4+
// Drivers Schedules with Territories and Retail Location
5+
// 110 Stops
6+
// 2 Drivers
7+
// 6 Schedules
8+
// 3 Territories
9+
// Retail Location
10+
//**********************************************************************
11+
12+
namespace Route4Me;
13+
14+
$root = realpath(dirname(__FILE__).'/../../');
15+
require $root.'/vendor/autoload.php';
16+
17+
use Route4Me\Enum\OptimizationType;
18+
use Route4Me\Enum\AlgorithmType;
19+
use Route4Me\Enum\DistanceUnit;
20+
use Route4Me\Enum\DeviceType;
21+
use Route4Me\Enum\OptimizationStates;
22+
use Route4Me\Enum\TravelMode;
23+
use Route4Me\V5\Addresses\RouteAdvancedConstraints;
24+
25+
// Set the api key in the Route4me class
26+
Route4Me::setApiKey(Constants::API_KEY);
27+
28+
//**********************************************************************
29+
// General Route Parameters
30+
$parameters = RouteParameters::fromArray([
31+
'rt' => true,
32+
'algorithm_type' => Algorithmtype::ADVANCED_CVRP_TW,
33+
'route_name' => 'Drivers Schedules - 3 Territories '.date('Y-m-d H:i:s', time()),
34+
'distance_unit' => DistanceUnit::MILES,
35+
'device_type' => DeviceType::WEB,
36+
'optimize' => OptimizationType::DISTANCE,
37+
'travel_mode' => TravelMode::DRIVING,
38+
'parts' => 2,
39+
'advanced_constraints' => []
40+
]);
41+
42+
//**********************************************************************
43+
// Territories
44+
$zones = [["ZONE 01"], ["ZONE 02"], ["ZONE 03"]];
45+
46+
//**********************************************************************
47+
// Schedules
48+
// Time Window Start: 8:00 am EST
49+
// Time Window End: 11:00 am EST
50+
for($i = 0; $i < 6; ++$i)
51+
{
52+
$parameters->advanced_constraints[] = RouteAdvancedConstraints::fromArray([
53+
'max_cargo_volume' => 0.0,
54+
'members_count' => 1,
55+
'available_time_windows' => [[(8 + 5) * 3600 , (11 + 5) * 3600]],
56+
'tags' => $zones[$i % 3],
57+
'location_sequence_pattern' => [
58+
'',
59+
Address::fromArray([
60+
'alias' => 'RETAIL LOCATION',
61+
'address' => 'RETAIL LOCATION',
62+
'lat' => 25.8741751,
63+
'lng' => -80.1288583,
64+
'time' => 300
65+
])
66+
]
67+
]);
68+
}
69+
70+
//**********************************************************************
71+
// Addresses
72+
$json = json_decode(file_get_contents(dirname(__FILE__).'/data/addresses_110.json'), true);
73+
$addresses = [];
74+
75+
foreach ($json as $address) {
76+
$addresses[] = Address::fromArray($address);
77+
}
78+
79+
$optimizationParams = new OptimizationProblemParams();
80+
$optimizationParams->setAddresses($addresses);
81+
$optimizationParams->setParameters($parameters);
82+
83+
$problem = OptimizationProblem::optimize($optimizationParams);
84+
85+
echo "Optimization Problem ID: " . $problem->optimization_problem_id . PHP_EOL;
86+
echo "State: " . OptimizationStates::getName($problem->state) . " (" . $problem->state . ")" . PHP_EOL;
87+
88+
echo "Routes:" . PHP_EOL;
89+
foreach($problem->routes as $route)
90+
{
91+
echo "\tID: " . $route->route_id . PHP_EOL;
92+
echo "\tDistance: " . $route->trip_distance . PHP_EOL;
93+
}

0 commit comments

Comments
 (0)