当前位置: 首页 > news >正文

如何选择最佳路线?

交通线路的选择

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

线路如何描述?

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

数据结构如下:

  public class NodeStation{public int Id;//nodeIdpublic 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;//表示下一nodepublic 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次。经检查前十个和后十个线路,无循环线路,无重复线路,结果完全正确。

在这里插入图片描述

相关文章:

  • sql盲注python脚本学习 (基于bWAPP靶场)
  • 谈谈hash算法
  • Leetcode-day31-01背包问题
  • 《Programming from the Ground Up》阅读笔记:p103-p116
  • Linux内核定时器
  • Java--Zuul网关中的过滤器
  • AIGC深度学习教程:Transformer模型中的Position Embedding实现与应用
  • IO与进程
  • 通信系统收发原理冷知识
  • Datawhale X 李宏毅苹果书 AI夏令营(深度学习入门)taks2
  • 跟《经济学人》学英文:2024年08月24日这期 What to make of America’s topsy-turvy economy
  • centos7安装Kafka单节点环境部署三-安装Logstash
  • MURF860AC-ASEMI智能AI专用MURF860AC
  • 虚幻游戏开发| 编辑器内正常运行但打包出错
  • 高级java每日一道面试题-2024年8月23日-框架篇[SpringBoot篇]-什么是JavaConfig?
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [数据结构]链表的实现在PHP中
  • Apache的基本使用
  • bearychat的java client
  • Java 网络编程(2):UDP 的使用
  • Linux中的硬链接与软链接
  • 回流、重绘及其优化
  • 基于webpack 的 vue 多页架构
  • 看域名解析域名安全对SEO的影响
  • 盘点那些不知名却常用的 Git 操作
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端面试之闭包
  • 前端自动化解决方案
  • 如何用vue打造一个移动端音乐播放器
  • 使用 Docker 部署 Spring Boot项目
  • 微信小程序实战练习(仿五洲到家微信版)
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​TypeScript都不会用,也敢说会前端?
  • # Panda3d 碰撞检测系统介绍
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (4)(4.6) Triducer
  • (52)只出现一次的数字III
  • (AngularJS)Angular 控制器之间通信初探
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (每日一问)基础知识:堆与栈的区别
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net中生成excel后调整宽度
  • /etc/fstab和/etc/mtab的区别
  • @Autowired @Resource @Qualifier的区别
  • @Import注解详解
  • @RequestBody与@ModelAttribute
  • [20171101]rman to destination.txt
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [bzoj1901]: Zju2112 Dynamic Rankings