我有2个表googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener(){
@Override
public boolean onMarkerClick(Marker marker){
return false;
}
});
和schedules
。
我的places
表如下
schedules
我的- Id
- From Place Id
- To Place Id
- Departure Time
- Arrival Time
表如下
places
例如:当用户搜索从- Id
- Name
5到place_id
1的路由时,系统应返回一个包含调度表的路由。例如,该时间表可能看起来像这样
place_id
我知道有很多算法,例如广度优先搜索,深度优先搜索等。我从未使用过雄辩的Laravel来完成这些算法。请给我一些实现结果的技巧。有很多网站介绍了可用的不同算法,但是没有一个网站对此进行解释。
答案 0 :(得分:1)
要查找路径,您必须根据计划表构建图形数据结构。您可以从进度表中获取所有记录,并从中创建图表。
在这种情况下,可以使用bfs或dfs。但是IMO,最好使用bfs,因为dfs不适用于在基于距离的图中查找最短路径。万一将来您会在计划表中应用距离。
您还必须在计划数据中考虑出发和到达时间。这意味着在您的bfs实现中,当前位置下一条路线的出发时间不能少于当前节点的到达时间。
答案 1 :(得分:1)
根据我对您的问题的了解,请尝试以下代码:
$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
。