1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
/*PGR-GNU*****************************************************************
File: vehicle_pickDeliver.hpp
Copyright (c) 2016 pgRouting developers
Mail: project@pgrouting.org
------
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
/*! @file */
#ifndef INCLUDE_VRP_VEHICLE_PICKDELIVER_HPP_
#define INCLUDE_VRP_VEHICLE_PICKDELIVER_HPP_
#pragma once
#include <set>
#include <cstdint>
#include "vrp/order.hpp"
#include "vrp/pd_orders.hpp"
#include "vrp/tw_node.hpp"
#include "vrp/vehicle.hpp"
#include "vrp/initials_code.hpp"
#include "cpp_common/identifiers.hpp"
namespace pgrouting {
namespace vrp {
class Initial_solution;
class Optimize;
class Vehicle_pickDeliver : public Vehicle {
protected:
double cost;
//! orders inserted in this vehicle
Identifiers<size_t> m_orders_in_vehicle;
PD_Orders m_orders;
//! orders that fit in the truck
Identifiers<size_t> m_feasable_orders;
public:
friend class Initial_solution;
friend class Optimize;
Vehicle_pickDeliver(
size_t idx,
int64_t id,
const Vehicle_node &starting_site,
const Vehicle_node &ending_site,
double p_capacity,
double p_speed,
double factor);
void set_compatibles(const PD_Orders &orders);
bool is_order_feasable(const Order &order) const;
Identifiers<size_t> feasable_orders() const {return m_feasable_orders;}
const PD_Orders& orders() const {return m_orders;}
size_t orders_size() const {return m_orders_in_vehicle.size();}
Identifiers<size_t> orders_in_vehicle() const {return m_orders_in_vehicle;}
bool has_order(const Order &order) const;
/*! @brief puts an order at the end of the truck
*
* Precondition:
* !has_order(order)
*
* Postcondition:
* has_order(order)
* !has_cv();
*
* ~~~~{.c}
* Before: S <nodes> E
* After: S <nodes> P D E
* ~~~~
*
* Can generate time window violation
* No capacity violation
*/
void push_back(const Order &order);
/*! @brief Puts an order at the end front of the truck
*
* Precondition:
* !has_order(order)
*
* Postcondition:
* has_order(order)
* !has_cv();
*
* ~~~~{.c}
* Before: S <nodes> E
* After: S P D <nodes> E
* ~~~~
*
* Can generate time window violation
* No capacity violation
*/
void push_front(const Order &order);
/*! @brief Inserts an order
*
* Precondition:
* !has_order(order)
*
* Postcondition:
* has_order(order)
* !has_cv();
*
* ~~~~{.c}
* Before: S <nodes> E
* After: S ....P .... D .... E
* ~~~~
*
* push_back is performed when
* - pickup
*
* Can generate time window violation
* No capacity violation
*/
bool insert(const Order &order);
/*! @brief Inserts an order In semi-Lifo order
*
* Precondition:
* !has_order(order)
*
* Postcondition:
* has_order(order)
* !has_cv();
*
* ~~~~{.c}
* Before: S .... (P1 ....... P2) ... D2 .... D1 .... E
* After: S .... (P .. P1 .. P2) ... D2 .. D .. D1 .... E
* ~~~~
*
* push_back is performed when
* - drop generates a time window violation
*
* Can generate time window violation
* No capacity violation
*/
bool semiLIFO(const Order &order);
/* @brief erases the order from the vehicle
*
* Precondition:
* has_order(order)
*
* Precondition:
* !has_order(order)
*/
void erase(const Order &order);
void do_while_feasable(
Initials_code kind,
Identifiers<size_t> &unassigned,
Identifiers<size_t> &assigned);
};
} // namespace vrp
} // namespace pgrouting
#endif // INCLUDE_VRP_VEHICLE_PICKDELIVER_HPP_
|