路线规划问题

文章目录

      • 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,一经查实,立即删除!

相关文章

OpenStack-train版安装之环境准备

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

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

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

枚举 小蓝的漆房

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

【云原生-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类的置信度 一般我们使用交叉熵用来衡量两个概率的区别 将它作为损失 其梯度是真实概率和…

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

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

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

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

通明智云宣布完成数千万元A+轮融资, 引领云原生与信创两翼齐飞的应用交付解决方案

近日&#xff0c;通明智云&#xff08;北京&#xff09;科技有限公司&#xff08;简称&#xff1a;通明智云&#xff09;宣布完成数千万元A轮融资&#xff0c;由全聚合与信公投资联合投资&#xff0c;明论资本担任本轮融资独家财务顾问。本轮融资资金将主要用于NJet云原生应用引…

智能时代的智能工具(gpt)国产化助手

目前gpt对代码以及其他领域都是可以支持&#xff0c;在国内有很多&#xff0c;常用的百度的 文心一言 &#xff0c;阿里的 通义千问 &#xff0c;还有&#xff08;“豆包”&#xff0c;“”讯飞星火“”&#xff09;等&#xff0c;除了写代码可以外&#xff0c;也可以很好的支持…

【蓝桥杯省赛真题44】Scratch像素画板 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

scratch像素画板 第十四届青少年蓝桥杯scratch编程省赛真题 一、题目要求 编程实现 1.点击绿旗,角色、背景如图所示(三种颜色调色盘、清除图标及方格角色请自行创建,点击绿旗后立刻呈现下图效果); 2.用鼠标点击红色调色盘,红色调色盘变为选中状态(如下图所示),此时鼠…

docker和docker-compose生产的容器,不在同一个网段,解决方式

在实际项目中&#xff0c;使用docker run xxXx 和docker-compose up -d 不在同一个网段&#xff0c;一个是默认是172.17.x.x, 另一个是172.19.x.x。为解决这个问题需要自定义一个网络&#xff0c;我命名为“my-bridge” 首先熟悉几条命令&#xff1a; docker network ls 或…

vue动态获取目录结构进行配置静态路由

文章目录 前言定义项目页面格式一、vite 配置动态路由新建 /router/utils.ts引入 /router/utils.ts 二、webpack 配置动态路由总结如有启发&#xff0c;可点赞收藏哟~ 前言 项目中动态配置路由可以减少路由配置时间&#xff0c;并可减少配置路由出现的一些奇奇怪怪的问题 路由…

多维时序 | MATLAB实现PSO-GRU-Attention粒子群优化门控循环单元融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-GRU-Attention粒子群优化门控循环单元融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-GRU-Attention粒子群优化门控循环单元融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MAT…

echarts折线图修改特定点的颜色

$.ajax({url:"/plc1672Ctrl/selectPage2.ctrl",dataType:"json",type:"POST",cache:false,data:{"serNo":$("#search").val().trim()},success:function(data){var list data.list;// x坐标var x new Array();// y坐标var…

凸包的学习之路

凸包的学习之路-CSDN博客 5.算法策略5&#xff1a;Graham Scan Algorithm 算法思路&#xff1a; 给定二维点集&#xff0c;求其凸包 1&#xff09;presorting&#xff1a; &#xff08;1&#xff09;先找到 ltl点 &#xff0c;也就是y值最小的点&#xff0c;若是存在y值相…

thinkphp8 DB_PREFIX 属性

设计表的时候使用**_user, **就是前缀&#xff0c;DB_PREFIX就是默认把前缀给去掉 在config/database.php prefix&#xff0c;改成你的前缀&#xff0c;数据库的表重命名‘ltf_user’ 代码调用 $user Db::name("user")->select();return json($user);之前是使用…