路线规划问题

文章目录

      • 1、问题描述
      • 2、节点类设置
      • 3、设置节点之间的关系
      • 4、路线规划
      • 5、完整类
      • 6、结果
      • 7、优化

1、问题描述

如下图,存在A~F六个地点,已知所有地点的相关关系(每个地点能到达的下一节点名称以及对应的路程);
计算某个起点(A~F)到某个终点(A~F)所需要的路程以及经过的地点顺序

在这里插入图片描述

2、节点类设置

public class Node {// 当前节点名称public String name;// 记录当前节点所能能到达的节点路程 节点名称:对应的路程public Map<String,Integer> map = new HashMap<String,Integer>();// 存储所有能到达节点的对象public List<Node> nodeList = new ArrayList<Node>();public Node(){}public Node(String name){this.name = name;}public void setValue(String key,Integer value) {map.put(key,value);}public void setNode(Node node) {nodeList.add(node);}
}

3、设置节点之间的关系

public static Node setRoute() {Node nodeA = new Node("A");Node nodeB = new Node("B");Node nodeC = new Node("C");Node nodeD = new Node("D");Node nodeE = new Node("E");Node nodeF = new Node("F");nodeA.setValue("B",10);nodeA.setValue("C",14);nodeA.setNode(nodeB);nodeA.setNode(nodeC);nodeB.setValue("A",10);nodeB.setValue("C",11);nodeB.setValue("D",8);nodeB.setNode(nodeA);nodeB.setNode(nodeC);nodeB.setNode(nodeD);nodeC.setValue("A",14);nodeC.setValue("B",11);nodeC.setValue("D",6);nodeC.setValue("E",15);nodeC.setNode(nodeA);nodeC.setNode(nodeB);nodeC.setNode(nodeD);nodeC.setNode(nodeE);nodeD.setValue("B",8);nodeD.setValue("C",6);nodeD.setValue("F",10);nodeD.setNode(nodeB);nodeD.setNode(nodeC);nodeD.setNode(nodeF);nodeE.setValue("C",15);nodeE.setValue("F",12);nodeE.setNode(nodeC);nodeE.setNode(nodeF);nodeF.setValue("D",10);nodeF.setValue("E",12);nodeF.setNode(nodeD);nodeF.setNode(nodeE);return nodeA; // 起点
}

4、路线规划

/*** 计算到达某个节点所有的方式* @param node      当前节点* @param stepStr   所走过的路径(避免重复)* @param steps     总路程* @param endNode   终点节点*/
public static void calculate(Node node,String stepStr,Integer steps,String endNode) {if(!node.name.equals(endNode)) {List<Node> nodeList = node.nodeList;for (int i = 0; i < nodeList.size(); i++) {Node n = nodeList.get(i);if(stepStr.contains(n.name)) { continue; }String stepStrT = stepStr + "->" + n.name;int stepsT = steps + node.map.get(n.name);calculate(n,stepStrT,stepsT,endNode);}}else {System.out.println("finish:" + steps +"\t" + stepStr);}
}

5、完整类

package Test;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;// 路线规划
public class RoutePlanning {// 记录执行次数public static int num = 0;public static void main(String[] args) {Node route = setRoute();calculate(route,"A",0,"F");System.out.println("execute times: " + num);}/*** 计算到达某个节点所有的方式* @param node      当前节点* @param stepStr   所走过的路径(避免重复)* @param steps     总路程* @param endNode   终点节点*/public static void calculate(Node node,String stepStr,Integer steps,String endNode) {if(!node.name.equals(endNode)) {List<Node> nodeList = node.nodeList;for (int i = 0; i < nodeList.size(); i++) {++num;Node n = nodeList.get(i);if(stepStr.contains(n.name)) { continue; }String stepStrT = stepStr + "->" + n.name;int stepsT = steps + node.map.get(n.name);calculate(n,stepStrT,stepsT,endNode);}}else {System.out.println("finish:" + steps +"\t" + stepStr);}}/*** 创建节点以及设置节点信息*/public static Node setRoute() {Node nodeA = new Node("A");Node nodeB = new Node("B");Node nodeC = new Node("C");Node nodeD = new Node("D");Node nodeE = new Node("E");Node nodeF = new Node("F");nodeA.setValue("B",10);nodeA.setValue("C",14);nodeA.setNode(nodeB);nodeA.setNode(nodeC);nodeB.setValue("A",10);nodeB.setValue("C",11);nodeB.setValue("D",8);nodeB.setNode(nodeA);nodeB.setNode(nodeC);nodeB.setNode(nodeD);nodeC.setValue("A",14);nodeC.setValue("B",11);nodeC.setValue("D",6);nodeC.setValue("E",15);nodeC.setNode(nodeA);nodeC.setNode(nodeB);nodeC.setNode(nodeD);nodeC.setNode(nodeE);nodeD.setValue("B",8);nodeD.setValue("C",6);nodeD.setValue("F",10);nodeD.setNode(nodeB);nodeD.setNode(nodeC);nodeD.setNode(nodeF);nodeE.setValue("C",15);nodeE.setValue("F",12);nodeE.setNode(nodeC);nodeE.setNode(nodeF);nodeF.setValue("D",10);nodeF.setValue("E",12);nodeF.setNode(nodeD);nodeF.setNode(nodeE);return nodeA;}public static class Node {// 当前节点名称public String name;// 记录当前节点所能能到达的节点路程public Map<String,Integer> map = new HashMap<String,Integer>();// 存储所有到达的节点对象public List<Node> nodeList = new ArrayList<Node>();public Node(){}public Node(String name){this.name = name;}public void setValue(String key,Integer value) {map.put(key,value);}public void setNode(Node node) {nodeList.add(node);}}
}

6、结果

finish:37	A->B->C->D->F
finish:48	A->B->C->E->F
finish:51	A->B->D->C->E->F
finish:28	A->B->D->F
finish:43	A->C->B->D->F
finish:30	A->C->D->F
finish:41	A->C->E->F
execute times: 41

7、优化

优化:每次遍历都判断所走路程,(详细记录已走的节点);如果当前路程超过记录中的最大路程,则停止;
选中记录列表中的最小路程重新往下走;重复该过程,直到到达终点后

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

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

相关文章

Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器

Vue 中简易封装网络请求&#xff08;Axios&#xff09;&#xff0c;包含请求拦截器和响应拦截器 axios简介 Axios 是一个基于 promise 的网络请求库&#xff0c;可以用于浏览器和 node.js Axios官方中文文档 特性 从浏览器创建 XMLHttpRequests从 node.js 创建 http 请求支…

OpenStack-train版安装之环境准备

环境准备 环境介绍VMware配置WMware虚拟机最低配置WMware添加网卡WMware添加硬盘 基础环境安装修改各节点的主机名修改各节点的hosts文件修改各节点的内核参数关闭各节点的防火墙和selinux安装NPT&#xff08;时间同步&#xff09;安装OpenStack基础服务包 CentOS升级内核 环境…

手把手设计C语言版循环队列(力扣622:设计循环队列)

文章目录 前言描述分析力扣AC代码 力扣&#xff1a; 622.设计循环队列 前言 队列会出现“假溢出”现象&#xff0c;即队列的空间有限&#xff0c;队列是在头和尾进行操作的&#xff0c;当元素个数已经达到最大个数时&#xff0c;队尾已经在空间的最后面了&#xff0c;但是对头…

深入理解MySQL存储引擎、InnoDB与MyISAM的比较以及事务处理机制

介绍 MySQL是一款强大而灵活的关系型数据库管理系统&#xff0c;它支持多种存储引擎&#xff0c;每个引擎都有其独特的特点和适用场景。在本篇博客中&#xff0c;我们将深入探讨MySQL存储引擎的种类、InnoDB与MyISAM的区别&#xff0c;以及事务的概念及其在MySQL中的实现方式。…

枚举 小蓝的漆房

题目 思路 核心思想是枚举 首先利用set记录每一种颜色 然后依次从set取出一种颜色作为targetColor&#xff0c;遍历房子 如果当前房子的颜色和targetColor不相同&#xff0c;就以当前房子为起点&#xff0c;往后长度为k的区间都涂成targetColor&#xff0c;并且需要的天数递增…

java算法学习索引之链表问题

0 相关类 public class Link {class NewNode {public int value;public NewNode next;public NewNode rand;public NewNode(int value, NewNode next, NewNode rand) {this.value value;this.next next;this.rand rand;}public NewNode(int value) {this.value value;}}cl…

【云原生-Kurbernetes篇】HPA 与 Rancher管理工具

文章目录 一、Pod的自动伸缩1.1 HPA1.1.1 简介1.1.2 HPA的实现原理1.1.3 相关命令 1.2 VPA1.2.1 简介1.2.2 VPA的组件1.2.3 VPA工作原理 1.3 metrics-server简介 二、 HPA的部署与测试2.1 部署metrics-serverStep1 编写metrics-server的配置清单文件Step2 部署Step3 测试kubect…

Flink Operator 使用指南 之 Flink Operator安装

介绍 Flink Kubernetes Operator 充当控制平面来管理 Apache Flink 应用程序的完整部署生命周期。尽管 Flink 的Native Kubernetes 集成已经允许用户在运行的 Kubernetes(k8s) 集群上直接部署 Flink 应用程序,但自定义资源和Operator Pattern 也已成为 Kubernetes 原生部署体…

Mrakdown Nice:格式

标题 缩进 删除线 斜体 加粗

动手学深度学习(三)---Softmax回归

文章目录 一、理论知识 softmax回归 一、理论知识 回归估计一个连续值分类预测一个离散类别 回归单连续数值输出自然区间R跟真实值的区别作为损失 分类通常多个输出输出i是预测为第i类的置信度 一般我们使用交叉熵用来衡量两个概率的区别 将它作为损失 其梯度是真实概率和…

STM32笔记

GPIO GPIOB->BSRR | GPIO_PIN_7 在STM32F103中&#xff0c;GPIOB->BSRR | GPIO_PIN_7 的作用是将GPIOB的第7位引脚设置为高电平&#xff08;将引脚置1&#xff09;&#xff0c;而GPIOB->BRR | GPIO_PIN_7 的作用是将GPIOB的第7位引脚设置为低电平&#xff08;将引脚置…

米贸搜|Tiktok如何认证蓝V

如何开通TikTok认证蓝V&#xff1f;第一步&#xff1a;准备材料 在申请TikTok蓝V之前&#xff0c;需要准备好以下材料&#xff1a; 1.个人身份证明&#xff08;身份证、护照等&#xff09;&#xff1b; 2.公司营业执照等相关证明文件&#xff08;如有&#xff09;&#xff1b; …

同一台电脑访问gitee多个仓库代码

在开发上我们经常遇到&#xff0c;需要跟别人共享代码&#xff0c;特别是跟有些客户联合开发的情况下&#xff0c;有很多个客户。有些git仓库是客户建立的&#xff0c;比如有两个客户A和分布建了gitA和gitB两个代码仓库。我们在支持这两个客户的时候可能是同一个工程师&#xf…

【机器学习】033_反向传播

一、计算图、反向传播原理 1. 回顾前向传播 例&#xff1a;假设现在有一个神经网络&#xff0c;其仅有一个输出层和一个神经单元 定义 定义 &#xff0c;即激活函数对激活值不再做具体处理 定义平方损失函数 &#xff0c;计算a的值与真实值的差距 此时&#xff0c;通过计算…

Python基础学习__测试报告

# 使用pycharm生成报告:只有在单独执行一个TestCase文件时可以生成,使用TestSuite等就不能用了 # 使用第三方的测试报告:例如:HTMLTestRunner第三方类库 #使用HTMLTestRunner这个执行对象# 1.获取第三方的测试运行类Runner模块(一个py文件),将其放在代码目录下 # 2.导包:unitte…

爬虫的http和https基础

HTTP响应状态码响应状态码 下面来看下详细的状态码数值和说明&#xff1a; 200系列&#xff1a; 200 OK&#xff1a;这个是最常见的&#xff0c;也是爬虫工程师最喜欢的&#xff0c;代表你本次的请求顺利拿到了响应&#xff0c;没有任何问题 201 Created&#xff1a;201代表…

psql 模式(SCHEMA)

模式是数据库领域的一个基本概念&#xff0c;有些数据库把模式和用户合二为一了&#xff0c;而postgresql则是有清晰的模式定义。 模式是数据库中的一个概念&#xff0c;可以理解为一个命名空间或目录&#xff0c;不同模式下可以有相同名称的表、函数等对象而不会产生冲突。提出…

2023年亚太杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

LeetCode算法题解(动态规划)|LeetCoed62. 不同路径、LeetCode63. 不同路径 II

一、LeetCoed62. 不同路径 题目链接&#xff1a;62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下…

渗透测试面试中常见的问题收集(部分)

1、xss盲打到内网服务器的利用 钓鱼管理员 信息收集 2、什么是虚拟机逃逸&#xff1f; 利用虚拟机软件或者虚拟机中运行的软件的漏洞进行攻击&#xff0c;以达到攻击或控制虚拟机宿主操作系统的目的 3、了解过websocket吗&#xff1f; WebSocket是一种在单个TCP连接上进行…