]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trainrouteplanner.h
Use a better cost estimator for the route planner
[r2c2.git] / source / libr2c2 / trainrouteplanner.h
index 726ebe4229e5fb9d7a3b931bff9e1d8602e5c9f3..57d2de508cdc27be0dbc17c3953d24bc2d9c4c61 100644 (file)
@@ -22,9 +22,11 @@ private:
        struct TrainRoutingInfo
        {
                Train *train;
+               float speed;
                TrainRouter *router;
-               Route *route;
-               std::list<TrainRoutingState *> waits;
+               std::list<Route *> routes;
+               Track *track_history[3];
+               std::list<const TrainRoutingState *> waits;
 
                TrainRoutingInfo(Train &);
        };
@@ -59,27 +61,44 @@ private:
                float offset;
                float back_offset;
                TrainState state;
+               Msp::Time::TimeDelta delay;
+               int waypoint;
+               float distance_traveled;
+               float remaining_estimate;
+               Msp::Time::TimeDelta wait_time;
+               int blocked_by;
 
                TrainRoutingState(TrainRoutingInfo &);
                TrainRoutingState(const TrainRoutingState &);
                ~TrainRoutingState();
 
                Msp::Time::TimeDelta get_time_to_next_track() const;
-               bool is_occupied(Track &) const;
+               bool is_occupying(Track &) const;
+               bool check_arrival();
                void advance(float);
+               void advance(const Msp::Time::TimeDelta &);
                void advance_track(unsigned);
+               void update_estimate();
        };
 
        struct RoutingStep
        {
                Msp::Time::TimeDelta time;
+               Msp::Time::TimeDelta cost_estimate;
                std::vector<TrainRoutingState> trains;
-               RoutingStep *prev;
+               const RoutingStep *prev;
 
                RoutingStep();
-               RoutingStep(RoutingStep *);
+               RoutingStep(const RoutingStep *);
 
+               void create_successors(std::list<RoutingStep> &) const;
+               bool update_states();
+               bool check_deadlocks() const;
+               int get_occupant(Track &) const;
+               int find_next_train() const;
                void advance(const Msp::Time::TimeDelta &);
+               void update_estimate();
+               bool is_viable() const;
                bool is_goal() const;
 
                bool operator<(const RoutingStep &) const;
@@ -87,18 +106,16 @@ private:
 
        std::vector<TrainRoutingInfo> routed_trains;
        std::list<RoutingStep> steps;
+       std::list<RoutingStep> queue;
 
 public:
        TrainRoutePlanner(Layout &);
 
        void plan();
 private:
-       bool update_states(RoutingStep &);
-       int find_next_train(RoutingStep &);
-       void add_steps(RoutingStep &, unsigned);
-       void add_waiting_step(RoutingStep &, unsigned);
-       void add_steps(RoutingStep &, TrainRoutingState &train);
-       void create_routes(RoutingStep &);
+       const RoutingStep &get_step();
+       void add_steps(const RoutingStep &);
+       void create_routes(const RoutingStep &);
 };
 
 } // namespace R2C2