[pgrouting-users] Shortest path with Dijkstra going through a set of points
Talin Salway
talin at codeforamerica.org
Mon Sep 10 10:06:21 PDT 2012
The other option might be to just increase the speed that individual
legs of the route calculate at. 0.3 seconds for a shortest_path query
seems a bit long.
How many points are in your network, total? How long does your sql
passed to shortest_path take to retrieve all the points?
On Sun, Sep 9, 2012 at 9:07 PM, Tao Romera Martinez <taoromera at gmail.com> wrote:
> Hi Steve,
>
> Thank you for the hints. I expect to be able to work on this in 3 or 4
> weeks, until then I am overbooked. I will let you know when I fork the
> code.
> Thaks again,
>
> Tao
>
> 2012/9/10 Stephen Woodbridge <woodbri at swoodbridge.com>:
>> Hi Tao,
>>
>>
>> On 9/9/2012 10:02 PM, Tao Romera Martinez wrote:
>>>
>>> Dear Daniel and Stephen,
>>>
>>> Thank you very much for your answers.
>>> I have not had time to dive into the pgrouting source code and the
>>> dijkstra algorithm, so I very much appreciate your detailed
>>> explanation about the possibilities to speed up the algorithm.
>>>
>>> I think that being able to dynamically generate the graph to be used
>>> in the routing algorithm is a great function, but having the
>>> possibility to work with a static graph would be fantastic if the
>>> speed improvement is in the order of 10x-100x, especially for
>>> web-related services, where the time response is crucial. I don't know
>>> how much time it would take to implement this feature, but I
>>> definitely put my vote for this one.
>>>
>>> In the meanwhile, I would like to help in the implementation of the
>>> via-TRSP (ie, the TRSP going through a set of points). Just one
>>> question: what is the speed up order we can expect? If the dijkstra
>>> algorithm itself is taking most of the time, I guess there is no point
>>> in spending time implementing it, but if generating the graph is
>>> consuming most of the processing time, the speed improvement could be
>>> big.
>>
>>
>> It is hard to estimate this, the best thing to do would be to take some
>> measurements. The time consists of the following:
>>
>> 1. time for SQL query and fetch the edges needed to build the graph
>> 2. time for SQL query and fetch associated turn restrictions if any
>> 3. time to build the graph
>> 4. time to solve the graph
>> 5. time to return the results
>>
>> My assumption is that 1-3 take significant % of the total time. but there
>> are a lot of variables, like how many edges are needed.
>>
>>
>>> Stephen, I have not written a line of C for ages, but I can get to it
>>> again if you allow some time for warming up. Also, I have an
>>> intermediate level of SQL, and have been a heavy user of postgis and
>>> pgrouting since April this year. Tell me how I can help you and I will
>>> be more than eager to work on the via TRSP function!
>>
>>
>> So the way I would approach this is to:
>>
>> 1. figure out a new signature for calling this new method
>> 2. make changes or write new code to implement the new signatures
>>
>> The Current signatures for trsp are:
>>
>> CREATE OR REPLACE FUNCTION turn_restrict_shortest_path(
>> sql text,
>> source_vid integer,
>> target_vid integer,
>> directed boolean,
>> has_reverse_cost boolean,
>> turn_restrict_sql text)
>> RETURNS SETOF path_result
>> AS '$libdir/librouting_trsp', 'turn_restrict_shortest_path_vertex'
>> LANGUAGE 'C' IMMUTABLE;
>>
>> CREATE OR REPLACE FUNCTION turn_restrict_shortest_path(
>> sql text,
>> source_eid integer,
>> source_pos float8,
>> target_eid integer,
>> target_pos float8,
>> directed boolean,
>> has_reverse_cost boolean,
>> turn_restrict_sql text)
>> RETURNS SETOF path_result
>> AS '$libdir/librouting_trsp', 'turn_restrict_shortest_path_edge'
>> LANGUAGE 'C' IMMUTABLE;
>>
>> So I think I might try changing this to be something like:
>>
>> CREATE OR REPLACE FUNCTION turn_restrict_shortest_path(
>> sql text, -- sql for the edges
>> point_eid integer[], -- array of edge ids[start,via,...,end]
>> point_pos float8[], -- array of position on edges
>> [start,via,...,end]
>> directed boolean,
>> has_reverse_cost boolean,
>> turn_restrict_sql text)
>> RETURNS SETOF path_result
>> AS '$libdir/librouting_trsp', 'turn_restrict_shortest_path_vias'
>> LANGUAGE 'C' IMMUTABLE;
>>
>> This would call the C function turn_restrict_shortest_path_vias() and
>> function similar in concept to turn_restrict_shortest_path_edge() but would
>> compute multiple solutions on the assembled graph.
>>
>> If you want to work on this, create a github account and fork pgrouting in
>> your account and let me know where it is so I can clone it and see what you
>> are doing. Then we can work together on it. I have not had time to look
>> closely at the code, so things might change if we run into problems.
>>
>> To get started you might want to clone pgrouting and add some code into trsp
>> to raise notices with timing information to get a better idea of what each
>> piece is costing.
>>
>> Thanks,
>> -Steve
>>
>>
>>>
>>> Tao
>>>
>>> 2012/9/9 Stephen Woodbridge <woodbri at swoodbridge.com>:
>>>>
>>>> On 9/9/2012 5:59 AM, Daniel Kastl wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Sun, Sep 9, 2012 at 1:24 PM, Tao Romera Martinez <taoromera at gmail.com
>>>>> <mailto:taoromera at gmail.com>> wrote:
>>>>>
>>>>> Dear all,
>>>>>
>>>>> I am using shortest_path() to find the shortest route between 2
>>>>> points. I have a set of points (P1, P2, P3, P4...) through which I
>>>>> want to go in order to reach the start and end points (S and E).
>>>>> Right
>>>>> now, I am calling shortest_path() to link each pair of points
>>>>> separately (S-P1, P1-P2, P2-P3, ...). The function shortest_path()
>>>>> computes in 0.3 seconds, but since I have to call it many times,
>>>>> the
>>>>> total time required to generate the final route gets quite high.
>>>>>
>>>>> Does someone know how I could speed up the generation of the final
>>>>> route (ie., the route going through all the points)? Is there a way
>>>>> of
>>>>> calling shortest_path but with "via" points?
>>>>>
>>>>>
>>>>> Unfortunately there is not such a function, as far as I know.
>>>>
>>>>
>>>>
>>>> This is correct, no function like that today.
>>>>
>>>> The optimization might be that you could build the graph once, then solve
>>>> it
>>>> repeatedly for each consecutive pair of nodes. My guess is that this only
>>>> works well if the points are clustered in a small area as opposed to laid
>>>> out in a long linear path. The trade-off here is that creating N small
>>>> graphs and solving them each once versus creating one larger graph and
>>>> solving it N time.
>>>>
>>>> I believe it would be pretty easy to build this in just the plpsql and C
>>>> wrappers. Something along these lines:
>>>>
>>>> 1. get the extents of the points and expand it
>>>> 2. convert the points to edges or nodes
>>>> 3. build the graph from the edges in the expanded extents
>>>> 4. for each pair, solve the graph and return the edges
>>>> 5. cleanup and return
>>>>
>>>> If anyone has time or funding for this, I would be interested in doing
>>>> this
>>>> for the TRSP algorithm. This has the best ability to match points in
>>>> partial
>>>> edges and has support for turn restrictions.
>>>>
>>>> Another way of solving this problem is to provide support for a faster
>>>> solver, like highway contraction hierarchy that is on our wish list. This
>>>> solves problems 10-100x faster but does not fit well into the pgRouting
>>>> structure of dynamically building graphs.
>>>>
>>>> -Steve W
>>>>
>>>> _______________________________________________
>>>> Pgrouting-users mailing list
>>>> Pgrouting-users at lists.osgeo.org
>>>> http://lists.osgeo.org/mailman/listinfo/pgrouting-users
>>>
>>> _______________________________________________
>>> Pgrouting-users mailing list
>>> Pgrouting-users at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/pgrouting-users
>>>
>>
>> _______________________________________________
>> Pgrouting-users mailing list
>> Pgrouting-users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/pgrouting-users
> _______________________________________________
> Pgrouting-users mailing list
> Pgrouting-users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/pgrouting-users
More information about the Pgrouting-users
mailing list