php路径查找算法,用于查找从一个地方到另一个地方的路径

szqfcxe2  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(373)

我有两张table schedules 以及 places .
我的 schedules 表格如下

- Id
- From Place Id
- To Place Id
- Departure Time
- Arrival Time

我的 places 表格如下

- Id
- Name

例如:当用户从 place_id 5至 place_id 1,系统应返回包含计划数组的路由数组。例如,这个时间表可能是这样的

[
    {
         from_place_id: 5,
         to_place_id: 3,
         ...
    },
    {
         from_place_id: 3,
         to_place_id: 8,
         ...
    },
    {
         from_place_id: 8,
         to_place_id: 1,
         ...
    },
]

我知道有很多算法,如广度优先搜索,深度优先搜索等,我从来没有做过他们使用拉威尔雄辩。请,给我一些实现结果的提示。有许多网站告诉不同的算法可用,但没有一个解释它。

xesrikrc

xesrikrc1#

根据我对你问题的理解,尝试以下代码:

$schedules = Schedule::where('from_place_id', '!=', $from_place_id)->where('to_place_id', '!=', $to_place_id)->get();

$roots = Schedule::where('from_place_id', $from_place_id)->get();
$goals = Schedule::where('to_place_id', $to_place_id)->get();

$stack = ['schedules' => []];

foreach ($roots as $root) {
    $travelTime = date('H:i:s', $this->timeDiff($root->departure_time, $root->arrival_time));
    $root['travel_time'] = $travelTime;
    $child = [$root];

    $requiredTime = $this->timeDiff($departure_time, $root->departure_time);

    if ($requiredTime >= 0) {
        foreach ($schedules as $schedule) {
            $previous = $child[count($child) - 1];

            $timeDiff = $this->timeDiff($previous->arrival_time, $schedule->departure_time);

            if ($schedule->from_place_id == $previous->to_place_id &&
        $timeDiff >= 0 && $timeDiff <= 3600) {
                $travelTime = date('H:i:s', $this->timeDiff($schedule->departure_time, $schedule->arrival_time));
                $schedule['travel_time'] = $travelTime;
                array_push($child, $schedule);

                foreach ($goals as $goal) {
                    $goalTimeDiff = $this->timeDiff($schedule->arrival_time, $goal->departure_time);

                    if ($goal->from_place_id == $schedule->to_place_id &&
                    $goalTimeDiff >= 0 && $goalTimeDiff <= 3600) {
                        $travelTime = date('H:i:s', $this->timeDiff($goal->departure_time, $goal->arrival_time));
                        $goal['travel_time'] = $travelTime;
                        array_push($child, $goal);
                        array_push($stack['schedules'], $child);
                        break 2;
                    }
                }
            }
        }
    }
}

return $stack;

此外,还需要为创建一个新的受保护函数 timeDiff 看起来像这样

protected function timeDiff($first, $second)
{
    return Carbon::parse($first)->diffInSeconds(Carbon::parse($second), false);
}

别忘了导入 Carbon 以及 Schedule 在顶端。

np8igboo

np8igboo2#

要找到路径,必须基于明细表构建图形数据结构。您可以从schedule表中获取所有记录并从中构建图形。
对于这种情况,可以使用bfs或dfs。但在imo中,dfs不适用于基于距离图的最短路径搜索,因此最好使用bfs。以防将来您将在明细表中应用距离。
您还必须在日程数据中考虑出发和到达时间。这意味着在您的bfs实现中,当前地点的下一条路线的出发时间不能小于当前节点的到达时间。

相关问题