Hi Anton,<div><br></div><div>Just yesterday this question was also asked in the Github ticket tracker:</div><div><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="https://github.com/pgRouting/pgrouting/issues/34">https://github.com/pgRouting/pgrouting/issues/34</a></div>

<div><br></div><div>And there is another pretty simple way to solve this if you &quot;ORDER BY cost&quot;.</div><div>Then it takes always the cheapest, because it takes the first entry.</div><div><br></div><div>Possible to add this &quot;ORDER BY&quot; by default?</div>

<div><br></div><div>Daniel</div><div><br><br><div class="gmail_quote">2011/6/3 Anton Patrushev <span dir="ltr">&lt;<a href="mailto:anton.patrushev@georepublic.de">anton.patrushev@georepublic.de</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Hi Steve,<br>
<br>
About parallel edges.<br>
It is well known issue of Dijkstra/A*. As it creates a graph as<br>
vertices list with one c cost between them (edge), it takes only one<br>
edge from set of parallel edges (one we add least no matter how high<br>
the cost is).<br>
There are three possible solutions. One with predecessors. Another one<br>
is to modify add_edge() to check previously added edges for given pair<br>
of vertices and add one with lowest cost. And one more solution is to<br>
break parallel edges to two with additional vertices.<br>
<br>
Anton.<br>
<div><div></div><div class="h5"><br>
On 5/24/11, Stephen Woodbridge &lt;<a href="mailto:woodbri@swoodbridge.com">woodbri@swoodbridge.com</a>&gt; wrote:<br>
&gt; Anton, Daniel,<br>
&gt;<br>
&gt; Have either of you had a chance to look at this problem?<br>
&gt; I wrote a test program outside of the postgresql environment that<br>
&gt; effectively runs the same query using the libpq-fe.h interface from C to<br>
&gt; retrieve results. I returned path elements like:<br>
&gt;<br>
&gt; typedef struct path_element<br>
&gt; {<br>
&gt;      int vertex_id;<br>
&gt;      int parent_id;<br>
&gt;      int edge_id;<br>
&gt;      float8 cost;<br>
&gt; } path_element_t;<br>
&gt;<br>
&gt; where the parent_id is gotten from the predecessors map in C++ like:<br>
&gt;<br>
&gt; p = vertex(predecessors[*vi], graph);<br>
&gt; pe.parent_id = graph[p].id;<br>
&gt;<br>
&gt; And in this case I can assemble a full tree using the vertex_id and the<br>
&gt; parent_id with the records returned from C++. My leading theory is that<br>
&gt; something is broken when we return records to postgresql and somehow<br>
&gt; some of the records get lost.<br>
&gt;<br>
&gt; That said, I have stared at the pgRouting code and I can not see what is<br>
&gt; wrong or missing.<br>
&gt;<br>
&gt; Any thoughts?<br>
&gt;<br>
&gt; -Steve<br>
&gt;<br>
&gt; On 5/19/2011 2:53 PM, Stephen Woodbridge wrote:<br>
&gt;&gt; Hi Anton, Daniel<br>
&gt;&gt;<br>
&gt;&gt; I have taken an additional look at this and it appears to be two strange<br>
&gt;&gt; things happening in the results.<br>
&gt;&gt;<br>
&gt;&gt; 1. there are definitely edges missing from the out. The missing edges<br>
&gt;&gt; would in fact connect the disconnected trees and obviously dijkstra<br>
&gt;&gt; traversed those edges because it is the only way to get to the<br>
&gt;&gt; disconnected trees.<br>
&gt;&gt;<br>
&gt;&gt; 2. I have noticed at least one case where I had two parallel edges and<br>
&gt;&gt; one had a significantly larger cost, and it shows in the results but not<br>
&gt;&gt; the short edge. For example:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; s-----A------o-------B-------m--------C------o<br>
&gt;&gt;              |               |<br>
&gt;&gt;              |               |<br>
&gt;&gt;              \-------D------/<br>
&gt;&gt;<br>
&gt;&gt; edge D parallels B, but is 4x as long as B. In the output A, D, and C<br>
&gt;&gt; are exist but not B, the driving distance starts at s and the cost at m<br>
&gt;&gt; is A + D, not A + B and C is missing.<br>
&gt;&gt;<br>
&gt;&gt; I&#39;m not sure what if anything more I can do at this point. There is<br>
&gt;&gt; nothing special about my data that I can think of. I have been running<br>
&gt;&gt; my tests and analysis in pgAdmin3 to get lists of input edges and output<br>
&gt;&gt; nodes and then generating trees of it by hand. I/m also plotting the<br>
&gt;&gt; segments and gids using mapserver from the table in postgis. The are no<br>
&gt;&gt; costs &lt;= 0 so it should be well behaved.<br>
&gt;&gt;<br>
&gt;&gt; Thoughts?<br>
&gt;&gt;<br>
&gt;&gt; -Steve<br>
&gt;&gt;<br>
&gt;&gt; On 5/17/2011 9:54 AM, Stephen Woodbridge wrote:<br>
&gt;&gt;&gt; Hi Anton,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I need some help with this. I think I have run into a bug. What I am<br>
&gt;&gt;&gt; trying to do is reconstruct the Dijkstra tree from the driving<br>
&gt;&gt;&gt; directions node list.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; So I run this query (my driving_distance() is listed below:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; SELECT vertex_id, case when b.source=vertex_id then b.target else<br>
&gt;&gt;&gt; b.source end as tid, edge_id, cost<br>
&gt;&gt;&gt; FROM driving_distance(<br>
&gt;&gt;&gt; &#39;SELECT gid AS id, source, target, cost_len::double precision AS cost<br>
&gt;&gt;&gt; FROM streets<br>
&gt;&gt;&gt; WHERE expand(setsrid(makepoint(-71.38776, 42.62),4326),<br>
&gt;&gt;&gt; 800./111120.+0.05) &amp;&amp; the_geom&#39;, 14350697, 800, false, false) as a,<br>
&gt;&gt;&gt; streets b<br>
&gt;&gt;&gt; WHERE a.edge_id=b.gid<br>
&gt;&gt;&gt; order by cost;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; And get back this list of nodes:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; vertex_id;tid;edge_id;cost<br>
&gt;&gt;&gt; 14350697;14324143;17585631;0<br>
&gt;&gt;&gt; 14324152;14350697;17559046;65.7600693996609<br>
&gt;&gt;&gt; 14324153;14324155;17525943;151.931780105486<br>
&gt;&gt;&gt; 14324154;14333339;17535960;170.771041457689<br>
&gt;&gt;&gt; 14324142;14350697;17559045;270.404042264354<br>
&gt;&gt;&gt; 14324145;14324142;17525935;312.38892285178<br>
&gt;&gt;&gt; 14352132;14357502;17568711;327.943430630889<br>
&gt;&gt;&gt; 14324150;14357469;17568653;372.73455007583<br>
&gt;&gt;&gt; 14324146;14324145;17525934;385.363174877394<br>
&gt;&gt;&gt; 14324140;14324145;17525933;388.831846843193<br>
&gt;&gt;&gt; 14357469;14324150;17568653;409.460621733005<br>
&gt;&gt;&gt; 14324205;14352132;17561074;438.800178615358<br>
&gt;&gt;&gt; 14324143;14350697;17585631;440.463055899486<br>
&gt;&gt;&gt; 14324149;14324151;17525953;463.817008548616<br>
&gt;&gt;&gt; 14324155;14335807;17539031;505.011855607214<br>
&gt;&gt;&gt; 14324141;14350696;17559044;522.697129188522<br>
&gt;&gt;&gt; 14324144;14324140;17525932;529.29745870764<br>
&gt;&gt;&gt; 14333339;14324154;17535960;538.752343241644<br>
&gt;&gt;&gt; 14335807;14335809;17539033;545.433040614225<br>
&gt;&gt;&gt; 14350695;14333339;17559042;549.17256774511<br>
&gt;&gt;&gt; 14324164;14324155;17525998;608.754587443993<br>
&gt;&gt;&gt; 14324151;14324149;17525953;611.133336570719<br>
&gt;&gt;&gt; 14335809;14335807;17539033;617.050097622648<br>
&gt;&gt;&gt; 14350696;14324141;17559044;624.884390435334<br>
&gt;&gt;&gt; 14350693;14350696;17559043;630.386775977662<br>
&gt;&gt;&gt; 14350692;14350693;17559040;635.388795958097<br>
&gt;&gt;&gt; 14335808;14350705;17559060;676.985348880917<br>
&gt;&gt;&gt; 14324206;14324205;17525992;690.86142794178<br>
&gt;&gt;&gt; 14324207;14354647;17564505;698.702994306955<br>
&gt;&gt;&gt; 14350705;14357566;17568800;725.054574549748<br>
&gt;&gt;&gt; 14357566;14361210;17574058;744.377671982209<br>
&gt;&gt;&gt; 14324156;14324164;17525954;775.199428174955<br>
&gt;&gt;&gt; 14361210;14362309;17575712;785.251952246793<br>
&gt;&gt;&gt; 14324165;14324164;17525955;788.303395916384<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This looks reason about until I try to reconstruct the tree and find<br>
&gt;&gt;&gt; that I actually have multiple disconnected trees :(<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Leaving off the 143 prefix to all the nodes above, I get the following 9<br>
&gt;&gt;&gt; trees. Any ideas why I am not getting a single connected tree? Am I not<br>
&gt;&gt;&gt; interpreting the results correctly? Would it be possible to patch the C<br>
&gt;&gt;&gt; code to just return all the nodes in the tree?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Other thoughts? I really need to be able to get to this data.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Thanks,<br>
&gt;&gt;&gt; -Steve<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; In these trees, in-dent means child of the the previous out-dent.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 50697<br>
&gt;&gt;&gt; +24143<br>
&gt;&gt;&gt; +24152<br>
&gt;&gt;&gt; +24142<br>
&gt;&gt;&gt; +24145<br>
&gt;&gt;&gt; +24146<br>
&gt;&gt;&gt; +24140<br>
&gt;&gt;&gt; +24144<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 24153<br>
&gt;&gt;&gt; +24155<br>
&gt;&gt;&gt; +35807<br>
&gt;&gt;&gt; +35809<br>
&gt;&gt;&gt; +24164<br>
&gt;&gt;&gt; +24156<br>
&gt;&gt;&gt; +24165<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 24154<br>
&gt;&gt;&gt; +33339<br>
&gt;&gt;&gt; +50695<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 52132<br>
&gt;&gt;&gt; +57502<br>
&gt;&gt;&gt; +24205<br>
&gt;&gt;&gt; +24206<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 24150<br>
&gt;&gt;&gt; +57469<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 24149<br>
&gt;&gt;&gt; +24151<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 24207<br>
&gt;&gt;&gt; +54647<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 24141<br>
&gt;&gt;&gt; +50696<br>
&gt;&gt;&gt; +50693<br>
&gt;&gt;&gt; +50692<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 35808<br>
&gt;&gt;&gt; +50705<br>
&gt;&gt;&gt; +57566<br>
&gt;&gt;&gt; +61210<br>
&gt;&gt;&gt; +62309<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; -- this function sets up a call the the pg_routing driving_distance()<br>
&gt;&gt;&gt; -- function and returns the rows without creating polygons<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; CREATE OR REPLACE FUNCTION driving_distance(table_name character<br>
&gt;&gt;&gt; varying, x double precision, y double precision, maxcost double<br>
&gt;&gt;&gt; precision, bufdist double precision, &quot;cost&quot; character varying,<br>
&gt;&gt;&gt; reverse_cost character varying, directed boolean, has_reverse_cost<br>
&gt;&gt;&gt; boolean)<br>
&gt;&gt;&gt; RETURNS SETOF path_result AS<br>
&gt;&gt;&gt; $BODY$<br>
&gt;&gt;&gt; DECLARE<br>
&gt;&gt;&gt; q text;<br>
&gt;&gt;&gt; srid integer;<br>
&gt;&gt;&gt; r record;<br>
&gt;&gt;&gt; source_id integer;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; BEGIN<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; FOR r IN EXECUTE &#39;SELECT srid FROM geometry_columns WHERE f_table_name =<br>
&gt;&gt;&gt; &#39;&#39;&#39;||table_name||&#39;&#39;&#39;&#39; LOOP<br>
&gt;&gt;&gt; END LOOP;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; srid := r.srid;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; RAISE NOTICE &#39;SRID: %&#39;, srid;<br>
&gt;&gt;&gt; RAISE NOTICE &#39;SELECT id FROM<br>
&gt;&gt;&gt; find_node_by_nearest_link_within_distance(&#39;&#39;POINT(% %)&#39;&#39;, %, &#39;&#39;%&#39;&#39;);&#39;,<br>
&gt;&gt;&gt; x, y, bufdist, table_name;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; SELECT id INTO source_id<br>
&gt;&gt;&gt; FROM find_node_by_nearest_link_within_distance(&#39;POINT(&#39;||x||&#39; &#39;||y||&#39;)&#39;,<br>
&gt;&gt;&gt; bufdist, table_name);<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; RAISE NOTICE &#39;SOURCE_ID: %&#39;, source_id;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; q := &#39;SELECT gid AS id, source::integer, target::integer, &#39;||cost||&#39; AS<br>
&gt;&gt;&gt; cost&#39;<br>
&gt;&gt;&gt; || CASE WHEN has_reverse_cost THEN &#39;, &#39;||reverse_cost||&#39; AS reverse_cost<br>
&gt;&gt;&gt; &#39; ELSE &#39;&#39; END<br>
&gt;&gt;&gt; ||&#39; FROM &#39;||table_name||&#39; WHERE setsrid(&#39;&#39;BOX3D(&#39;||x-bufdist||&#39;<br>
&gt;&gt;&gt; &#39;||y-bufdist||&#39;,&#39;<br>
&gt;&gt;&gt; ||x+bufdist||&#39; &#39;||y+bufdist||&#39;)&#39;&#39;::BOX3D, &#39;||srid||&#39;) &amp;&amp; the_geom&#39;;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; RAISE NOTICE &#39;Query: %&#39;, q;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; FOR r IN SELECT * FROM driving_distance(q, source_id, maxcost, directed,<br>
&gt;&gt;&gt; has_reverse_cost)<br>
&gt;&gt;&gt; LOOP<br>
&gt;&gt;&gt; RETURN NEXT r;<br>
&gt;&gt;&gt; END LOOP;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; RETURN;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; END;<br>
&gt;&gt;&gt; $BODY$<br>
&gt;&gt;&gt; LANGUAGE plpgsql VOLATILE STRICT<br>
&gt;&gt;&gt; COST 100<br>
&gt;&gt;&gt; ROWS 1000;<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; pgrouting-dev mailing list<br>
&gt;&gt;&gt; <a href="mailto:pgrouting-dev@lists.osgeo.org">pgrouting-dev@lists.osgeo.org</a><br>
&gt;&gt;&gt; <a href="http://lists.osgeo.org/mailman/listinfo/pgrouting-dev" target="_blank">http://lists.osgeo.org/mailman/listinfo/pgrouting-dev</a><br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; pgrouting-dev mailing list<br>
&gt;&gt; <a href="mailto:pgrouting-dev@lists.osgeo.org">pgrouting-dev@lists.osgeo.org</a><br>
&gt;&gt; <a href="http://lists.osgeo.org/mailman/listinfo/pgrouting-dev" target="_blank">http://lists.osgeo.org/mailman/listinfo/pgrouting-dev</a><br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; pgrouting-dev mailing list<br>
&gt; <a href="mailto:pgrouting-dev@lists.osgeo.org">pgrouting-dev@lists.osgeo.org</a><br>
&gt; <a href="http://lists.osgeo.org/mailman/listinfo/pgrouting-dev" target="_blank">http://lists.osgeo.org/mailman/listinfo/pgrouting-dev</a><br>
&gt;<br>
<br>
<br>
</div></div>--<br>
Georepublic UG (haftungsbeschränkt)<br>
Salzmannstraße 44,<br>
81739 München, Germany<br>
<br>
Anton Patrushev<br>
CTO<br>
<br>
eMail: <a href="mailto:anton.patrushev@georepublic.de">anton.patrushev@georepublic.de</a><br>
Web: <a href="http://georepublic.de" target="_blank">http://georepublic.de</a><br>
<br>
Tel: +49 (089) 420 959 519<br>
Sip: <a href="mailto:1959519@sipgate.de">1959519@sipgate.de</a><br>
<br>
Commercial register: Amtsgericht München, HRB 181428<br>
CEO: Daniel Kastl<br>
<div><div></div><div class="h5">_______________________________________________<br>
pgrouting-dev mailing list<br>
<a href="mailto:pgrouting-dev@lists.osgeo.org">pgrouting-dev@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/pgrouting-dev" target="_blank">http://lists.osgeo.org/mailman/listinfo/pgrouting-dev</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><span style="font-family:arial, sans-serif;font-size:13px;border-collapse:collapse">Georepublic UG &amp; Georepublic Japan<br>eMail: <a href="mailto:daniel.kastl@georepublic.de" style="color:rgb(66, 99, 171)" target="_blank">daniel.kastl@georepublic.de</a><br>

Web: <a href="http://georepublic.de/" style="color:rgb(66, 99, 171)" target="_blank">http://georepublic.de</a></span><br>
</div>