leonard/route-generator

此包的最新版本(dev-master)没有提供许可证信息。

从给定的票据中生成成功概率最高的路线

dev-master 2021-08-08 09:46 UTC

This package is not auto-updated.

Last update: 2024-09-30 23:12:12 UTC


README

基本思路是从票据的位置和目的地生成一个有向图,并根据方向添加弧线。之后,我们使用深度优先搜索算法找到终端节点,并确定到达那里的最快路线。如果存在多个终端节点,程序将抛出错误。

注意,即使没有为不同类型的票据设置不同的类,大部分时间都花在了尝试优化算法和提出最佳路线的建议上。此外,只进行了手动测试。

这里还有一些假设

  • 凯文的家人将拥有与凯文相同的票据
  • 凯文的家人将使用所有票据,但凯文不一定要用
  • 如果凯文在家人之前到达某个地方,这实际上是有益的,因为他们有先发优势,他将在那里等待他们(因为票据上没有旅行时间,他将在最终地点等待他们。)
  • 可能会有多个票据的位置。如果这不是旅程的终点,我们需要确保有替代路线可以从那里返回,否则凯文将陷入需要在多个可能适合此角色的选择中选择最终位置的情况。
    以上述情况为例,如果使用票据生成路线,凯文将不知道最终位置应该是3,5还是6节点,因此将抛出错误。

先决条件

您可以安装它

  • 使用composer
    composer require test/route-generator
  • 或者克隆此仓库,并在项目的根目录中运行以下命令
    composer dump-autoload 

用法

use Test\RouteGenerator\RouteGenerator;
use Test\RouteGenerator\Ticket;
use Test\RouteGenerator\TicketType;


 $routerGenerator = new RouteGenerator([
   new Ticket('Germany', 'Italy', TicketType::Boat, 'RJ 45', 'Seat 32'),
   new Ticket('Germany', 'France', TicketType::Bus, '336'),
   new Ticket('Italy', 'Spain', TicketType::Airplane, 'ITSP 453'),
   new Ticket('Spain', 'Austria', TicketType::Bus, '', 'No seats'),
   new Ticket('France', 'Portugal', TicketType::Boat),
   new Ticket('Portugal', 'France', TicketType::Airplane),
   new Ticket('France', 'Bulgaria', TicketType::Boat),
   new Ticket('Bulgaria', 'France', TicketType::Bus),
   new Ticket('France', 'Romania', TicketType::Airplane),
   new Ticket('Romania', 'Greece', TicketType::Train),
   new Ticket('Greece', 'Germany', TicketType::Bus),
], 'Germany');


foreach($routerGenerator->getRoute() as $ticket){
   echo $ticket;
}

可能的改进

对此的一些可能的改进是,当算法困惑时,而不是抛出错误,给凯文手动选择下一步的机会。

在票据上添加旅行时间,这样会更准确地估计会合地点。