Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ortools_vrp.proto
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ message Service {
repeated bool refill_quantities = 14;
uint32 problem_index = 15;
string point_id = 16;
uint32 alternative_index = 17;
}

message Rest {
Expand Down
1 change: 1 addition & 0 deletions ortools_vrp_pb.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

51 changes: 34 additions & 17 deletions tsp_simple.cc
Original file line number Diff line number Diff line change
Expand Up @@ -725,11 +725,16 @@ void RelationBuilder(const TSPTWDataDT& data, RoutingModel& routing,
break;
case NeverFirst:
for (int link_index = 0; link_index < relation.linked_ids.size(); ++link_index) {
current_index = data.IdIndex(relation.linked_ids[link_index]);
int32 service_index =
data.ProblemIndex(RoutingIndexManager::NodeIndex(current_index));
alternative_size = data.AlternativeSize(service_index);

current_index = data.AlternativeActivityIndex(relation.linked_ids[link_index]);
if (current_index >= 0) {
alternative_size =
data.AlternativeActivitySize(relation.linked_ids[link_index]);
} else {
current_index = data.IdIndex(relation.linked_ids[link_index]);
alternative_size = data.AlternativeSize(current_index);
}
std::cout << "alternative_size :" << alternative_size
<< " current_index : " << current_index << std::endl;
for (int64 alternative_index = current_index;
alternative_index < current_index + alternative_size; ++alternative_index) {
for (std::size_t v = 0; v < data.Vehicles().size(); ++v) {
Expand All @@ -747,10 +752,14 @@ void RelationBuilder(const TSPTWDataDT& data, RoutingModel& routing,
}

for (int link_index = 0; link_index < relation.linked_ids.size(); ++link_index) {
current_index = data.IdIndex(relation.linked_ids[link_index]);
int32 service_index =
data.ProblemIndex(RoutingIndexManager::NodeIndex(current_index));
alternative_size = data.AlternativeSize(service_index);
current_index = data.AlternativeActivityIndex(relation.linked_ids[link_index]);
if (current_index >= 0) {
alternative_size =
data.AlternativeActivitySize(relation.linked_ids[link_index]);
} else {
current_index = data.IdIndex(relation.linked_ids[link_index]);
alternative_size = data.AlternativeSize(current_index);
}

for (int64 alternative_index = current_index;
alternative_index < current_index + alternative_size; ++alternative_index) {
Expand All @@ -769,10 +778,14 @@ void RelationBuilder(const TSPTWDataDT& data, RoutingModel& routing,
break;
case NeverLast:
for (int link_index = 0; link_index < relation.linked_ids.size(); ++link_index) {
current_index = data.IdIndex(relation.linked_ids[link_index]);
int32 service_index =
data.ProblemIndex(RoutingIndexManager::NodeIndex(current_index));
alternative_size = data.AlternativeSize(service_index);
current_index = data.AlternativeActivityIndex(relation.linked_ids[link_index]);
if (current_index >= 0) {
alternative_size =
data.AlternativeActivitySize(relation.linked_ids[link_index]);
} else {
current_index = data.IdIndex(relation.linked_ids[link_index]);
alternative_size = data.AlternativeSize(current_index);
}

for (int64 alternative_index = current_index;
alternative_index < current_index + alternative_size; ++alternative_index) {
Expand All @@ -786,10 +799,14 @@ void RelationBuilder(const TSPTWDataDT& data, RoutingModel& routing,
break;
case ForceLast:
for (int link_index = 0; link_index < relation.linked_ids.size(); ++link_index) {
current_index = data.IdIndex(relation.linked_ids[link_index]);
int32 service_index =
data.ProblemIndex(RoutingIndexManager::NodeIndex(current_index));
alternative_size = data.AlternativeSize(service_index);
current_index = data.AlternativeActivityIndex(relation.linked_ids[link_index]);
if (current_index >= 0) {
alternative_size =
data.AlternativeActivitySize(relation.linked_ids[link_index]);
} else {
current_index = data.IdIndex(relation.linked_ids[link_index]);
alternative_size = data.AlternativeSize(current_index);
}

for (int64 alternative_index = current_index;
alternative_index < current_index + alternative_size; ++alternative_index) {
Expand Down
48 changes: 48 additions & 0 deletions tsptw_data_dt.h
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,20 @@ class TSPTWDataDT {
return tsptw_clients_[i.value()].alternative_index;
}

int32 AlternativeActivityIndex(const std::string id) const {
if (alternative_activity_ids_map_.find(id) != alternative_activity_ids_map_.end()) {
return alternative_activity_ids_map_.at(id);
}
return -1;
}

int32 AlternativeActivitySize(const std::string id) const {
if (alternative_activity_size_map_.find(id) != alternative_activity_size_map_.end()) {
return alternative_activity_size_map_.at(id);
}
return 0;
}

const std::vector<int64>& ReadyTime(const RoutingIndexManager::NodeIndex i) const {
return tsptw_clients_[i.value()].ready_time;
}
Expand Down Expand Up @@ -702,6 +716,7 @@ class TSPTWDataDT {
int32 matrix_index;
int32 problem_index;
int32 alternative_index;
int32 alternative_activity_index;
std::vector<int64> ready_time;
std::vector<int64> due_time;
std::vector<int64> maximum_lateness;
Expand Down Expand Up @@ -745,6 +760,8 @@ class TSPTWDataDT {
std::vector<Relation> tsptw_relations_;
std::vector<TSPTWClient> tsptw_clients_;
std::map<int32, int32> alternative_size_map_;
std::map<std::string, int32> alternative_activity_size_map_;
std::map<std::string, int32> alternative_activity_ids_map_;
std::vector<Route> tsptw_routes_;
std::vector<CompleteGraphArcCost> distances_matrices_;
std::vector<CompleteGraphArcCost> times_matrices_;
Expand Down Expand Up @@ -861,6 +878,23 @@ void TSPTWDataDT::LoadInstance(const std::string& filename) {
alternative_size_map_[service.problem_index()] += 1;
if (ids_map_.find((std::string)service.id()) == ids_map_.end())
ids_map_[(std::string)service.id()] = node_index;

if (alternative_activity_ids_map_.find(
(std::string)service.id() + "#" +
std::to_string(service.alternative_index())) ==
alternative_activity_ids_map_.end()) {
alternative_activity_ids_map_[service.id() + "#" +
std::to_string(service.alternative_index())] =
node_index;
alternative_activity_size_map_[service.id() + "#" +
std::to_string(service.alternative_index())] =
1;
} else {
alternative_activity_size_map_[service.id() + "#" +
std::to_string(service.alternative_index())] +=
1;
}

node_index++;
}
++timewindow_index;
Expand Down Expand Up @@ -901,6 +935,20 @@ void TSPTWDataDT::LoadInstance(const std::string& filename) {
alternative_size_map_[service.problem_index()] += 1;
if (ids_map_.find((std::string)service.id()) == ids_map_.end())
ids_map_[(std::string)service.id()] = node_index;

if (alternative_activity_ids_map_.find(
(std::string)service.id() + "#" +
std::to_string(service.alternative_index())) ==
alternative_activity_ids_map_.end()) {
alternative_activity_ids_map_[service.id() + "#" +
std::to_string(service.alternative_index())] =
node_index;
alternative_activity_size_map_[service.id() + "#" +
std::to_string(service.alternative_index())] = 1;
} else {
alternative_activity_size_map_[service.id() + "#" +
std::to_string(service.alternative_index())] += 1;
}
node_index++;
}
if (previous_matrix_size == (int32)matrix_indices.size()) {
Expand Down