如何选择最佳路线?

news2024/9/22 1:18:01

交通线路的选择

日常交通线路的选择,并不是按最短路径选择的。还要参考道路的等级,道路是否拥堵,道路通行速度等多种情形。本程序列举出所有能通行的线路,并计算出行驶距离,来供用户选择。当然,也可以加入道路实时通行情况,收费情况,并依据用户的偏好,计算出最佳线路。

线路如何描述?

·交通线路纷繁复杂,是一种无序的网状结构。对于线路的描述,本人认为所有的交通图,都是由点互相连通组成的。每个点,如果相连的点为一个,则增加一个虚拟终点。即一个点最少与另外两个点连通。·

数据结构如下:

  public class NodeStation
  {
      public int Id;//nodeId
      public string Child="";//以 nodeId1:distance1>nodeId2:distance2>nodeId3:distance3.....表示子结点List
   
  }

线路的描述如下:

 public class NodeWay
 {
     public string WayStr="";//>nodeId1>nodeId2>nodeId3表示线路
     public int Distance;//表示距离
     public int Time;//表示所需时间
     public int Next;//表示下一node
     public bool Arrive=false;//表示是否到达终点
 }
 List<NodeWay> listWay 表示所有找到的线路

算法

`1.找到起点(nodeStation)。
2.以起点为当前结点,将起点的所有子点(nodeStation)为起点.重复第一步。
3.若本结点的子结点为虚拟终点,删除本线路。
4若子结点为终点,本线路结束查找。
4.若不是,要么增加线路,要么在原有的线路上重复下一步。

代码

 public bool FindNodeWay(List<NodeStation> lns,List<NodeWay> listWay,int start,int end)
{
    bool b=false,first,arrive=false;
    List<int> starts = new List<int>();
    List<int> dist=new List<int>();
    string s0,s1,s2;
    string[] sa,sb;
    int dist0 = 0, d1, nextStation;
    NodeStation ns;
    NodeWay nw,nw0;
    if (starts.Count == 0)
    {
        ns = lns[start];
        sa = ns.Child.Split(">");
        for (int i = 0; i < sa.Length; i++)
        {
            sb = sa[i].Split(":");
            if (sb[0] != "-1")
            {
                nw = new NodeWay();
                nw.Next = int.Parse(sb[0]);
                nw.WayStr = $">{start}>{nw.Next}>";
                nw.Distance = int.Parse(sb[1]);
                listWay.Add(nw);
            }
        }
    }
    int n = 0;
    for (int i=0;i<listWay.Count;i++)
    {
        n++;
        nw=listWay[i];
        s0 = nw.WayStr;
        dist0 = nw.Distance;
        first = true;       
        if (!nw.Arrive)
         {
                ns = lns[nw.Next];
                sa = ns.Child.Split(">");
                for (int j = 0; j < sa.Length; j++)
                {
                    sb = sa[j].Split(":");
                    nextStation = int.Parse(sb[0]);
                    d1 = int.Parse(sb[1]);
                    s1 = $">{nextStation}>";
                    s2 = $"{nextStation}>";
                    if (!nw.WayStr.Contains(s1))
                    {
                        arrive = nextStation == end ? true : false;
                        if (first)
                        {
                            first = false;
                            if (nextStation != -1)
                            {
                                nw.Arrive = arrive;
                                nw.Next = nextStation;
                                nw.Distance = dist0 + d1; ;
                                nw.WayStr = s0 + s2;
                            }
                            else
                            {
                                listWay.RemoveAt(i);
                            }
                        }
                        else
                        {
                            if (nextStation != -1)
                            {
                                nw0 = new NodeWay();
                                nw0.WayStr = s0 + s2;
                                nw0.Next = nextStation;
                                nw0.Arrive = arrive;
                                nw0.Distance = dist0 + d1;
                                listWay.Add(nw0);
                            }
                        }
                    }
                }
            }
            if (first)
            {
                listWay.RemoveAt(i);
            }
            i = -1;
        }
    }
    return b;
}

在这里插入图片描述

这是深圳地铁图的描述数据

 List<NodeStation> lns = new List<NodeStation>();
 NodeStation ns;
 string[] nsStr = [
                "1:1>-1:0",
                "0:1>2:1>6:1>16:1",
                "1:4>3:6>7:3>15:1",
                "2:1>4:2>9:3>15:1",
                "3:2>15:1>10:3",
                "6:4>-1:1",
                "1:6>5:3>7:5>11:1",
                "8:1>2:1>9:1>10:1",
                "7:1>9:1>6:1",
                "7:1>8:1>10:1>3:1" ,
                "4:1>9:1",
                "6:1>12:1",
                "8:1>11:1>13:1>14:1",
                "12:1>-1:0",
                "12:1>-1:0",
                "2:1>3:1>4:1>20:1>21:1",
                "1:1>18:1",
                "18:1>-1:0",
                "16:1>17:1>19:1>20:1",
                "18:1>20:1>-1:0",
                "18:1>19:1>15:1",
                "15:1>-1:1"
                ];
 for (int i=0;i<nsStr.Length;i++)
	{
       ns = new NodeStation(i, nsStr[i]);
      lns.Add(ns); 
	}
         

现假设深圳地铁为交通网络图,以从机场东到蛇口为例,模拟用户驾车出行。本程序共计算出线路90条,共叠代61324次。经检查前十个和后十个线路,无循环线路,无重复线路,结果完全正确。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux | ubuntu虚拟机创建硬盘、磁盘分区、分区挂载、自动挂载、磁盘清理

点击上方"蓝字"关注我们 01、创建硬盘 >>> 什么使硬盘? 点击虚拟机设置,这里有两个硬盘,一个100G,一个20G 应用场景,下载yocto时,磁盘空间不足,所以写下这篇文章,供大家参考 >>> 开始创建一个新的硬盘 点击添加 【选择硬盘 下一步】 【推…

三、Vuex是什么?Vuex详解

什么是Vuex 在理解Vuex之前&#xff0c;首先需要理解我们为什么要使用它&#xff1f;它解决了什么问题&#xff1f; 为什么要使用它 在Vue开发中&#xff0c;我们常常会用到组件直接的传值、通讯。有父子通讯&#xff0c;兄弟组件通讯…但是传参对于多层嵌套就显得非常繁琐&am…

分享思源笔记的几个骚操作

文章目录 思维导图复习法效果视频制作过程使用方法 大纲复习方法制作过程 人工智能简易使用效果制作过程 思维导图复习法 效果视频 bandicam20240817222246034.mp4 制作过程 首先下载【写味】主题或者是[自定义块样式]插件 他两个的区别是 思维导图以列表形式写出来 选择转…

计算机毕业设计选题推荐-旅游景点数据分析-Python爬虫可视化

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Unity教程(十一)使用Cinemachine添加并调整相机

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

武林外传书生版单机安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;武林外传书生版。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;绝对是完整…

快速带你玩转高性能web服务器后续

目录 一、Nginx 高级配置 1.1 Nginx 状态页 1.2 Nginx 压缩功能 1.3 Nginx的版本隐藏 1.4 Nginx 变量使用 1.4.1 内置变量 二、 Nginx Rewrite 相关功能 2.1 ngx_http_rewrite_module 模块指令 2.1.1 if 指令 2.1.2 set 指令 2.1.3 break 指令 2.1.4 return 指令 2…

cmake install setlocal错误

cmake中的代码如下&#xff1a; #设置安装目录的前缀 set(CMAKE_INSTALL_PREFIX $ENV{PUBLISH_DIR}) #这边的输出满足要求 message(STATUS "install dir:${CMAKE_INSTALL_PREFIX}") #指定安装 install(TARGETS ${TARGET_NAME} RUNTIME DESTINATION bin …

数据埋点系列总结|从基础到实践的深度总结

在当今数字化时代,数据已成为企业的核心资产,而数据驱动决策则是充分利用这一资产的关键方法。本系列文章全面探讨了从数据收集到分析,再到实际应用的整个过程,为读者提供了深入而实用的指导。让我们深入回顾这个journey,详细探讨每个主题的核心内容,并思考数据驱动决策的未来发…

SHOPLINE x TiDB丨集群成本降低 50%!跨境电商 SHOPLINE 交易、商品管理等核心业务的数据库升级之路

导读 本文整理自 TiDB 社区深圳站——SHOPLINE 数据库/TiDB 负责人车佳蔚的演讲《SHOPLINE & TiDB 在跨境电商中的应用实践》。本次分享深入探讨了 SHOPLINE 在跨境电商领域的数字化转型过程中&#xff0c;如何通过 TiDB 技术应对技术挑战&#xff0c;实现降本增效。 本文…

《重生到现代之从零开始的C语言生活》—— 指针3

数组名的理解 在我们使用&arr[0]的方式拿到了数组第一个元素的地址&#xff0c;但是其实&#xff0c;数组名本来就地址&#xff0c;而且是数组首元素的地址 所以数组名就是数组首元素的地址 但是会有两个例外 sizeof(数组名)&#xff0c;sizeof中单独放数组名&#xff0c…

『功能项目』移动后的光标显示【04】

我们打开上一篇03的射线双击项目&#xff0c; 本章要做的事情是在PlayerRayNavgation脚本中添加一个移动光标&#xff0c;实现人物在场景中鼠标点击移动后在移动过程中出现移动目标光标的效果。 在unity编辑器中创建一个Plane 重命名为MovementSign 删掉碰撞器 创建一个材质 选…

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式&#xff1a;* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…

avue-crud 自定义搜索项 插槽

加上 -search 就可以自定义查询项了

制定sbti科学碳目标的主要原则是什么?

制定科学碳目标主要遵循以下原则&#xff1a; 科学性&#xff1a; 基于气候科学&#xff1a;科学碳目标的设定必须依据可靠的气候科学研究成果&#xff0c;以确保目标能够真实反映对气候变化的有效应对。例如&#xff0c;要考虑到将全球平均气温升幅控制在远低于工业化前水平 2…

全国产化服务器:飞腾FT2000+/64核密集计算、显控及存储一体式加固服务器

飞腾FT2000/64核的加固服务器是一款专为高安全性、高可靠性及能在严苛环境下稳定运行而设计的服务器产品。以下是对该服务器的详细介绍&#xff1a; 一、处理器与核心组件 处理器&#xff1a;搭载飞腾FT2000/64核处理器&#xff0c;该处理器基于ARM架构&#xff0c;集成了64个…

C语言--01基础数据类型

1.整型 概念&#xff1a;表达整数类型的数据语法&#xff1a; int a 123; // 定义了一个专门用来存储整数的变量a a 456 ; 需要注意的地方&#xff1a; int 的本意是 integer&#xff0c;即整数的意思int a 代表在内存中开辟一块小区域&#xff0c;称为 a&#xff0c;用来…

Kafka快速入门:Kafka驱动JavaApi的使用

生产者和消费者是Kafka的核心概念之一&#xff0c;它们在客户端被创建和使用&#xff0c;并且包含了许多与Kafka性能和机制相关的配置。虽然Kafka提供的命令行工具能够执行许多基本操作&#xff0c;但它无法实现所有可能的性能优化。相比之下&#xff0c;使用Java API可以充分利…

谁有实际开发权限?

需要查一下&#xff0c;谁有实际开发权限。 正常来说&#xff0c;是按权限查&#xff0c;但是&#xff0c;有权限&#xff0c;不见得能开发&#xff0c;谁开发都得要个sap key。 那切入点就是这个key了&#xff0c;毕竟是问谁有实际开发权限。 直接给结果&#xff1a; 好啦&…

通过POJO生成MySQL的DDL语句

背景 有时候下载的源码没有数据库的DDL语句&#xff0c;需要手动去创建&#xff0c;这就很麻烦了&#xff0c;这时需要一个利器通过POJO对象生成DDL语句&#xff0c;一键生成&#xff0c;直接执行即可。 工程结构示例 pom.xml文件 <?xml version"1.0" encodin…