路线规划问题

文章目录

      • 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.mfbz.cn/a/171723.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习动物识别 - 卷积神经网络 机器视觉 图像识别 计算机竞赛

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

最新最全系列之Selenium:传入webdriver驱动的新方法 Service()函数;以前的executable_path报警告,即将弃用

传入webdriver驱动的新方法 Service()函数&#xff1b;以前的executable_path报警告&#xff0c;即将弃用 以前的方法 举例&#xff1a;webdriver.Chrome(executable_pathdriver_path)&#xff1b;看提示警告&#xff0c;提示该方法即将被弃用&#xff1b;如下图&#xff1a; …

碳中和领域研究,细谈新能源“爆发”的原因之一

碳中和时代&#xff0c;能源结构、能源生产方式将发生根本变化&#xff0c;依靠绿色科技的进步&#xff0c;驱动颠覆性技术的创新。 碳中和的概念及主要方式 碳中和可以理解为一种类似“数字化”、“信息化”的方式或概念。覆盖我们生活中的各个领域。 实现碳中和的目的不仅…

力控软件与2台200Smart之间无线以太网通信

在实际系统中&#xff0c;车间里分布多台PLC&#xff0c;需要用上位机软件集中控制。通常所有设备距离在几十米到上百米不等。用户会选择以太网方式是因为传输速度有保障&#xff0c;而选择无线以太网方案是因为不想开挖电缆沟&#xff0c;或者布线不方便&#xff0c;不但施工麻…

HCIP-二、MSTP+Eth-trunk

二、MSTPEth-trunk 实验拓扑实验需求及解法 实验拓扑 实验需求及解法 //1.如图所示&#xff0c;配置设备名称和 IP 地址。 //2.在 SW1 与 SW2 之间配置链路聚合协议 LACP&#xff0c;完成以下需求&#xff1a; //2.1 SW1 作为主动端&#xff0c;设置系统优先级为最高。 [SW1]l…

软件测试最全的面试八股文(2023最新版)

1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&#xff0c;不…

【微信小程序】2023年11月版本 关于小程序隐私保护指引设置的公告 | 修改微信小程序隐私保护 |小程序无法获取用户昵称 头像 性别 等问题

一、登录小程序后台 《关于小程序隐私保护指引设置的公告》 https://mp.weixin.qq.com/cgi-bin/announce?actiongetannouncement&announce_id11691660367cfUvX&version&langzh_CN&token 上面是官方的文档&#xff0c;但是由于比较陈旧&#xff0c;和现在的页面…

“三面一体”的业务调度方案在运营商订单运营的实践

在当前信息化时代&#xff0c;运营商的业务流程复杂度和多样性持续增长&#xff0c;多个系统、部门以及相关事务需要进行高效准确的调度。如何在这样的背景下&#xff0c;保证业务流程的顺畅&#xff0c;业务信息的实时传递以及业务决策的准确性&#xff0c;是业务运营面临的重…

开源之夏2023 MatrixOne 项目结业啦

开源之夏是由中国科学院软件研究所与 OpenEuler 社区共同主办的一项面向高校学生的暑期在线活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;促进优秀开源软件社区的蓬勃发展。 在开源之夏 2023 年中&#xff0c;MatrixOne 一共有 2 个任务项目&#…

万界星空科技QMS质量管理系统功能

QMS质量管理系统结合质量决策、综合质量管理、过程质量控制三个层次要素&#xff0c;帮助企业实现产品全寿命周期质量数据的及时、灵活、准确和全面采集。 通过质量管理软件能够实现质量数据科学处理和应用&#xff0c;包括数据的系统化组织、结构化存贮、便捷式查询、定制化统…

rabbit MQ的延迟队列处理模型示例(基于SpringBoot)

说明&#xff1a; 生产者P 往交换机X&#xff08;typedirect&#xff09;会发送两种消息&#xff1a;一、routingKeyXA的消息&#xff08;消息存活周期10s&#xff09;&#xff0c;被队列QA队列绑定入列&#xff1b;一、routingKeyXB的消息&#xff08;消息存活周期40s&#xf…

如何给shopify motion主题的产品系列添加description

一、Description是什么 Description是一种HTML标签类型&#xff0c;通过指定Description的内容&#xff0c;可以帮助搜索引擎以及用户更好的理解当前网页包含的主要了内容。 二、Description有什么作用 1、基本作用&#xff0c;对于网站和网页做一个简单的说明。 2、吸引点击&…

开启AI高效办公时代,成为AI时代的先行者

文章目录 AI智能化办公&#xff1a;未来办公的新模式一、AI智能化办公的优势1. 提高工作效率2. 降低成本3. 提高决策质量4. 促进团队协作 二、AI智能化办公的应用场景1. 智能助手2. 智能会议3. 智能文档处理4. 智能数据分析 三、AI智能化办公的挑战与前景1. 数据安全与隐私保护…

2015-2020年全国地区生产总值及一二三产构成数据总览,shp/excel格式

今天我们来整理了2015-2020全国地区生产总值及一二三产构成数据&#xff0c;数据格式为shpexcel格式&#xff0c;数据精度可达各区县。 另外&#xff0c;需要说明的是&#xff1a;由于统计年鉴指标调整&#xff0c;每一年的数据并非字段相同&#xff0c;字段详情请参考已下载数…

1688开放平台API接口获取商品详情信息

一、API接口简介 1688开放平台提供了丰富的API接口&#xff0c;帮助开发者快速实现各种业务需求。其中&#xff0c;商品详情信息的获取是很多业务场景中的基础功能。通过调用相应的API接口&#xff0c;您可以获取到商品的基本信息、价格、库存等数据&#xff0c;为您的业务提供…

SQL注入漏洞

在页面参数增加 and -1-1&#xff0c;页面回显正常 这里如果 and 11 会被拦截 然后尝试-1-2 页面报错&#xff0c;此处存在数字型sql注入漏洞 接下来就是查字段数 order by 1 页面依旧报错 如果大家在渗透的时候遇到这种情况 要考虑是不是某些参数被拦截等 换一种思路&#xf…

【Java】乡镇卫生院、社区卫生服务中心云HIS源码

云HIS采用云端SaaS服务的方式提供&#xff0c;用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、智能化、扩展化等设计方法&#xff0c;覆盖了基层医院机构的主要工作流程&#xff0c;能够与监管系统有序对接…

怎么实现在微信公众号点外卖的功能

在当今快节奏的生活中&#xff0c;外卖已经成为了我们生活中不可或缺的一部分。而微信公众号作为人们获取信息、交流互动的重要平台&#xff0c;实现外卖功能也成为了用户的一大需求。本文将介绍如何在微信公众号上实现点外卖的功能&#xff0c;帮助大家更加便捷地享受美食。 一…

vue el-form表单嵌套组件时正则校验不生效

vue el-form表单嵌套组件时正则校验不生效 上图 组件选中数据&#xff0c;但是正则校验未检测到并且红字提示不会消失。直接上代码 <template><div class"created_report"><el-form :model"formData" :rules"isRules" ref"…

什么是多域名证书?

多域名证书是指同一个证书中包含多个域名&#xff0c;能够在多个站点之间共享一份证书&#xff0c;实现一个站点对应多个域名的情况。多域名证书非常适合需要跨多个站点部署的应用&#xff0c;例如企业的子站点、博客等。 特点 多域名证书的优点包括以下几个方面&#xff1a;…