起点和终点列表的基本非加权寻路
Posted
技术标签:
【中文标题】起点和终点列表的基本非加权寻路【英文标题】:Basic non-weighted pathfinding for list of start and end points 【发布时间】:2012-11-27 06:19:25 【问题描述】:我正在制作一个旅游项目,但遇到了一个问题。我已经创建了一个数据库:
ID Source Destination
1 C1 C2
2 C3 c4
3 C3 C5
4 C4 C6
5 C8 C9
6 C2 C3
当我从 C1->C6 进行游览时,它应该遵循路径 c1->c2->c3->c4->c6。但是当通过查询检索时,我在到达 c3 时遇到了冲突:还有另一个 C3->c5。
我该如何克服这个问题?
首先我通过签入 mysql 将 c1 作为源 从那里我得到目的地作为源检查相关目的地的目的地
【问题讨论】:
添加你已经完成的代码sn-p 系统怎么知道从 c3 到 c6 必须遵循 c3->c4 而不是 c3->c5 ? @jtheman 这就是重点。 user1702477,你必须尝试所有路径。 请参考:***.com/questions/11064913/… 【参考方案1】:试试:
CREATE TABLE test (
ID INTEGER NOT NULL,
SOURCE CHAR(2) NOT NULL,
DESTINATION CHAR(2) NOT NULL
);
INSERT INTO test VALUES (1, 'C1', 'C2');
INSERT INTO test VALUES (2, 'C3', 'C4');
INSERT INTO test VALUES (3, 'C3', 'C5');
INSERT INTO test VALUES (4, 'C4', 'C6');
INSERT INTO test VALUES (5, 'C8', 'C9');
INSERT INTO test VALUES (6, 'C2', 'C3');
然后:
SELECT
CONCAT_WS(
'->',
A.SOURCE,
A.DESTINATION,
B.DESTINATION,
C.DESTINATION,
D.DESTINATION
)
FROM test A
LEFT JOIN test B ON B.SOURCE = A.DESTINATION
LEFT JOIN test C ON C.SOURCE = B.DESTINATION
LEFT JOIN test D ON D.SOURCE = C.DESTINATION
WHERE
A.SOURCE = 'C1'
AND 'C6' IN (A.DESTINATION, B.DESTINATION, C.DESTINATION, D.DESTINATION);
这给出了:
C1->C2->C3->C4->C6
请记住,此示例只会给出最大深度为 4 的路径,但您可以轻松扩展它。此外,您将获得所有可能的路径(如果有多个)。所以你需要决定选择哪一个。
【讨论】:
嗨 eisberg,它对我非常有用,但如果我添加更多源和目标,那么它就不会出现 @user1702477 更多源和目标是什么意思?能给我举个例子吗?正如我在回答中所说,可以通过添加更多连接并将 A、B、C、D 扩展为 E、F、G、a.s.o. 来增加搜索深度 是的,但问题是如果他添加了更多 SOURCE 和 DESTINATION ...那么我如何重复 A、B、c 值..因为它们是动态添加的...SOURCE 和 DESTINATION 限制不是固定 @user1702477 您可能想要编辑您的问题,以便每个人都有机会了解您的问题。给出一个更详细的例子和你想要的输出以及你不想要的输出。【参考方案2】:1)您可以通过将数据存储到树中来解决,并使用算法到达目的地:
2) 使用数组和递归的简单解决方案:
这里复杂的部分只是带来“提到的源和目标所需的数据”,即离开 c8->c9
我还没有工作来带来以下数据。但是,你可以继续: $目的地['c1'] = 'c2'; $destination['c3'][] = 'c4'; $destination['c4'] = 'c6'; $destination['c2'] = 'c3';
$route = array();
$int = 0;
function route_to($route,$source_statn, $dest_statn)
global $int, $destination,$path;
if ($source_statn != '' && $dest_statn != '')
if ($destination[$source_statn] == $dest_statn)
$route[++$int] = "$source_statn -> $destination[$source_statn]";
$path = $route;
return $path;
else
if (is_array($destination[$source_statn]))
foreach ($destination[$source_statn] as $each)
$route[++$int] = "$source_statn -> $each";
route_to($route,$each, $dest_statn);
else
if($destination[$source_statn] != '')
$route[++$int] = "$source_statn -> $destination[$source_statn]";
route_to($route,$destination[$source_statn], $dest_statn);
route_to($route,'c1','c6');
echo '<pre>path';
print_r($path);
echo '</pre>';
---------o/p------------
Array
(
[1] => c1 -> c2
[2] => c2 -> c3
[3] => c3 -> c4
[4] => c4 -> c6
)
【讨论】:
这里的复杂部分只是带来“上述来源和目的地所需的数据”以上是关于起点和终点列表的基本非加权寻路的主要内容,如果未能解决你的问题,请参考以下文章