”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 案例研究:加权九尾问题

案例研究:加权九尾问题

发布于2024-11-08
浏览:745

加权九尾问题可以简化为加权最短路径问题。
部分提出了九尾问题并使用 BFS 算法解决了它。本节介绍问题的变体并使用最短路径算法解决它。

九尾问题是找到导致所有硬币面朝下的最少移动次数。每一步都会翻转一枚正面硬币及其相邻硬币。加权九尾问题将翻转次数指定为每次移动的权重。例如,您可以通过翻转第一行中的第一个硬币及其相邻的两个硬币,将下图a中的硬币更改为下图b中的硬币。因此,此移动的权重为 3。通过翻转中心硬币及其四个相邻硬币,可以将下图 c 中的硬币变为下图 d。所以这个动作的权重是5.

Case Study: The Weighted Nine Tails Problem

加权九尾问题可以简化为在边加权图中寻找从起始节点到目标节点的最短路径。该图有 512 个节点。如果存在从节点 u 到节点 v 的移动,则创建从节点 vu 的边。将翻转次数指定为边的权重。

回想一下,在第 1 节中,我们定义了一个类 NineTailModel 来建模九尾问题。我们现在定义一个名为WeightedNineTailModel的新类,它扩展了NineTailModel,如下图所示。

Case Study: The Weighted Nine Tails Problem

NineTailModel类创建一个Graph并获得一个以目标节点511为根的TreeWeightedNineTailModelNineTailModel 相同,只不过它创建了一个 WeightedGraph 并获取了一个以目标节点为根的 ShortestPathTree 511WeightedNineTailModel 扩展了 NineTailModel。方法 getEdges() 查找图中的所有边。 getNumberOfFlips(int u, int v) 方法返回从节点 u 到节点 v 的翻转次数。 getNumberOfFlips(int u) 方法返回从节点 u 到目标节点的翻转次数。

下面的代码实现了WeightedNineTailModel.

package demo;
import java.util.*;

public class WeightedNineTailModel extends NineTailModel {
    /** Construct a model */
    public WeightedNineTailModel() {
        // Create edges
        List edges = getEdges();

        // Create a graph
        WeightedGraph graph = new WeightedGraph(edges, NUMBER_OF_NODES);

        // Obtain a shortest path tree rooted at the target node
        tree = graph.getShortestPath(511);
    }

    /** Create all edges for the graph */
    private List getEdges() {
        // Store edges
        List edges = new ArrayList();

        for(int u = 0; u .ShortestPathTree)tree).getCost(u);
    }
}

WeightedNineTailModel 扩展 NineTailModel 来构建 WeightedGraph 来建模加权九尾问题(第 10-11 行)。对于每个节点 ugetEdges() 方法查找翻转节点 v 并将翻转次数指定为边的权重 (v, u)(第 30 行)。 getNumberOfFlips(int u, int v) 方法返回从节点 u 到节点 v 的翻转次数(第 38-47 行)。翻转次数是
之间不同单元格的数量 两个节点(第 44 行)。

WeightedNineTailModel 获得以目标节点 511 为根的 ShortestPathTree(第 14 行)。请注意,treeNineTailModel 中定义的受保护数据字段,ShortestPathTreeTree 的子类。 NineTailModel 中定义的方法使用 tree 属性。

getNumberOfFlips(int u)方法(第49-52行)返回从节点u到目标节点的翻转次数,即从节点开始的路径成本u 到目标节点。该成本可以通过调用 ShortestPathTree 类中定义的 getCost(u) 方法获得(第 51 行)。

下面的代码给出了一个程序,提示用户输入一个初始节点,并显示到达目标节点的最少翻转次数。


打包演示; 导入java.util.Scanner; 公共类WeightedNineTail { 公共静态无效主(字符串[] args){ // 提示用户输入九个币的Hs和Ts System.out.print("请输入最初的九个硬币Hs和Ts:"); 扫描仪输入 = new Scanner(System.in); String s = input.nextLine(); char[] 初始节点 = s.toCharArray(); WeightedNineTailModel 模型 = new WeightedNineTailModel(); java.util.List path = model.getShortestPath(NineTailModel.getIndex(initialNode)); System.out.println("抛硬币的步骤是"); for (int i = 0; i package demo; import java.util.Scanner; public class WeightedNineTail { public static void main(String[] args) { // Prompt the user to enter nine coins' Hs and Ts System.out.print("Enter the initial nine coins Hs and Ts: "); Scanner input = new Scanner(System.in); String s = input.nextLine(); char[] initialNode = s.toCharArray(); WeightedNineTailModel model = new WeightedNineTailModel(); java.util.List path = model.getShortestPath(NineTailModel.getIndex(initialNode)); System.out.println("The steps to flip the coins are "); for (int i = 0; i 输入最初的九个硬币 Hs 和 Ts:HHHTTTHHH

抛硬币的步骤是

哈哈哈

TT
呵呵

哈哈哈

THT
TT

TTT

TT
TT

翻转次数为8

程序在第8行提示用户输入由

HT组成的9个字母组成的初始节点作为字符串,从字符串(第 9 行),创建模型(第 11 行),获取从初始节点到目标节点的最短路径(第 12-13 行),显示路径中的节点(第16–17),并调用 getNumberOfFlips 获取到达目标节点所需的翻转次数(第 20 行)。

版本声明 本文转载于:https://dev.to/paulike/case-study-the-weighted-nine-tails-problem-3n9i?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • ValueError:无法将 NumPy 数组转换为张量 - 已解决?
    ValueError:无法将 NumPy 数组转换为张量 - 已解决?
    ValueError: Failed to Convert NumPy Array to Tensor问题描述尝试使用 TensorFlow 训练具有 LSTM 层的神经网络时,出现以下情况发生错误:ValueError: Failed to convert a NumPy array to a T...
    编程 发布于2024-11-08
  • 为什么Java重载不能基于返回类型?
    为什么Java重载不能基于返回类型?
    Java 中的返回类型重载:不兼容尽管 Java 具有多方面的功能,但该语言在重载函数时还是存在限制仅通过更改返回类型。这就提出了一个常见的问题:为什么 Java 禁止这样的重载?答案在于重载的基本性质。重载允许多个具有相同名称的函数共存于一个类中,并通过它们的参数签名进行区分。然而,当返回类型也用...
    编程 发布于2024-11-08
  • 强密码生成器
    强密码生成器
    看看我做的这支笔!
    编程 发布于2024-11-08
  • Angular 和 15 的改进
    Angular 和 15 的改进
    1) 在没有构造函数的情况下在 Angular 14 中使用注入注入服务。 以前,注入任何服务总是需要具有构造函数的类: class MyClass { constructor(private myService: MyService) {} } 现在,我们可以在函数和类中注入服务。我们只需要声...
    编程 发布于2024-11-08
  • 面向对象编程:掌握 DSA 的第一步
    面向对象编程:掌握 DSA 的第一步
    Imagine you're walking through a bustling factory. You see different machines, each designed for a specific purpose, working together to create a fina...
    编程 发布于2024-11-08
  • 如何修复 Android 中的“java.lang.String 类型的值无法转换为 JSONObject”错误?
    如何修复 Android 中的“java.lang.String 类型的值无法转换为 JSONObject”错误?
    排除“java.lang.String 类型的值\u003cbr\u003e 无法转换为 JSONObject”错误在您的 Android 应用程序中,您遇到与 JSON 解析相关的错误。具体来说,您会看到以下异常:org.json.JSONException: Value <br of t...
    编程 发布于2024-11-08
  • 如何在 JavaScript 中强制硬刷新并防止缓存问题?
    如何在 JavaScript 中强制硬刷新并防止缓存问题?
    解决 JavaScript 缓存问题:使用 JavaScript 清除缓存部署新的 JavaScript 代码时,看不到反映的最新更新是令人沮丧的。此问题通常是由于缓存的浏览器响应而引起的。为了消除这个问题,我们可以利用 JavaScript 函数 window.location.reload(tr...
    编程 发布于2024-11-08
  • 如何在 Python 中使用 Inflect 将整数转换为单词?
    如何在 Python 中使用 Inflect 将整数转换为单词?
    在 Python 中将整数转换为单词在 Python 中将数值转换为相应的单词表示形式可能是一项令人费解的任务。本文探讨了使用 inflect 包的简单解决方案。困境:该示例尝试将歌曲“99 Bottles of Beer”打印在Wall”,用文字替换数值。然而,代码目前显示的是数字而不是它们的口头...
    编程 发布于2024-11-08
  • 关闭响应正文真的可以在 Go HTTP 客户端中实现连接重用吗?
    关闭响应正文真的可以在 Go HTTP 客户端中实现连接重用吗?
    Go HTTP 客户端连接重用:常见误解Go HTTP 客户端默认设计为重用连接,提供高效的网络利用率。然而,某些场景可能会导致对连接重用的误解。原始查询:无限连接创建在给定的代码中,最初看起来无限数量的连接正在被创建。不过,这个问题可以通过在收到响应后关闭请求正文来解决。这使得传输能够识别该连接可...
    编程 发布于2024-11-08
  • 如何动态重定向Python函数中的标准输出和错误流?
    如何动态重定向Python函数中的标准输出和错误流?
    Python 中的上下文流重定向标准输出和错误流(stdout 和 stderr)的重定向在许多场景中证明是有用的。然而,当函数持有对这些流的内部引用时,传统方法通常会出现不足。需要动态解决方案传统的重定向技术,如 sys.stdout,永久重定向流。当方法本质上在内部复制这些变量之一时,就会出现此...
    编程 发布于2024-11-08
  • 如何在 Java 中有效地计算文件或文件夹的大小?
    如何在 Java 中有效地计算文件或文件夹的大小?
    在 Java 中获取文件或文件夹的大小检索文件或文件夹的大小是处理文件时的常见任务在爪哇。下面是如何有效地做到这一点:获取文件大小要获取文件的大小,您可以使用 java.io 上的 length() 方法.文件对象。这将返回文件的长度(以字节为单位),如果文件不存在,则返回 0。java.io.Fi...
    编程 发布于2024-11-08
  • 变量第 04 部分
    变量第 04 部分
    মনে করুন আপনি চা খাবেন। না, চা না। কফিই খান। প্রোগ্রামার হচ্ছেন কফি তো খেতেন পারেন। কফিকে প্রোগ্রামারদের সঙ্গি বললে ভুল হবে না । যাই হোক। এখন কফি তৈর...
    编程 发布于2024-11-08
  • 当我开始使用 React 时我希望知道的事情
    当我开始使用 React 时我希望知道的事情
    3年React开发经验教训 当我第一次投入 React 时,感觉就像打开了潘多拉魔盒。有很多东西要学,一路上,我遇到了很多“啊哈!”的情况。时刻。以下是我希望在开始时就知道的 10 件事,以帮助您在 React 之旅中跳过一些减速带。 1. 组件只是函数 最重要的认识? React ...
    编程 发布于2024-11-08
  • 使用 Golang 编写打字速度测试 CLI 应用程序
    使用 Golang 编写打字速度测试 CLI 应用程序
    必须认真考虑这个标题吗?...现在我们已经解决了这个问题,让我们编写一些该死的代码:) 泵制动?尖叫……让我们对今天要尝试构建的内容做一些介绍。如果标题不明显,我们将构建一个 CLI 应用程序来计算您在 golang 中的打字速度 - 尽管您可以使用您选择的任何编程语言遵循相同的技术来构建相同的应用...
    编程 发布于2024-11-08
  • 为什么我的 Bootstrap 模态不工作? ($(...).modal 不是函数)
    为什么我的 Bootstrap 模态不工作? ($(...).modal 不是函数)
    TypeError: $(...).modal is not a function with Bootstrap Modal您在尝试执行以下操作时遇到此错误动态地将 Bootstrap 模式插入 HTML 并使用 jQuery 触发它。让我们深入研究一下问题:错误表明“$().modal”函数不被j...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3