「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ケーススタディ: 加重九尾問題

ケーススタディ: 加重九尾問題

2024 年 11 月 8 日に公開
ブラウズ:759

重み付き九尾問題は、重み付き最短経路問題に還元できます。
セクションでは、九尾問題を提示し、BFS アルゴリズムを使用してそれを解決しました。このセクションでは、問題のバリエーションを示し、最短パス アルゴリズムを使用して解決します。

九尾問題は、すべてのコインが下になる最小の手数を見つけることです。各手は表のコインとその隣のコインを投げます。重み付き 9 尾問題では、フリップの回数が各動きの重みとして割り当てられます。たとえば、最初の行とその隣の 2 つのコインを裏返すことで、下の図 a のコインを下の図 b のコインに変更できます。したがって、この動きの重みは 3 になります。中央のコインとその隣の4枚のコインを裏返すと、下図cのコインを下図dに変えることができます。したがって、この動きの重みは 5.

です。

Case Study: The Weighted Nine Tails Problem

重み付き 9 尾問題は、エッジ重み付きグラフで開始ノードからターゲット ノードまでの最短パスを見つけることに還元できます。グラフには 512 個のノードがあります。ノード u からノード v への移動がある場合、ノード v から u へのエッジを作成します。フリップの数をエッジの重みとして割り当てます。

セクションで、九尾問題をモデル化するクラス NineTailModel を定義したことを思い出してください。以下の図に示すように、NineTailModel を拡張する WeightedNineTailModel という名前の新しいクラスを定義します。

Case Study: The Weighted Nine Tails Problem

NineTailModel クラスは Graph を作成し、ターゲット ノード 511 をルートとする Tree を取得します。 WeightedNineTailModel は、WeightedGraph を作成し、ターゲット ノード 511[ をルートとする ShortestPathTree を取得する点を除いて、NineTailModel と同じです。 &&&]。 WeightedNineTailModelNineTailModel を拡張します。メソッド getEdges() は、グラフ内のすべてのエッジを検索します。 getNumberOfFlips(int u, int v) メソッドは、ノード u からノード v までのフリップ数を返します。 getNumberOfFlips(int u) メソッドは、ノード u からターゲット ノードまでのフリップ数を返します。

以下のコードは

WeightedNineTailModel. を実装します。

パッケージデモ; java.util.* をインポートします。 public class WeightedNineTailModel extends NineTailModel { /** モデルを構築します */ public WeightedNineTailModel() { // エッジを作成します List エッジ = getEdges(); // グラフを作成する WeightedGraph グラフ = new WeightedGraph(edges, NUMBER_OF_NODES); // ターゲットノードをルートとする最短パスツリーを取得します ツリー = グラフ.getShortestPath(511); } /** グラフのすべてのエッジを作成します */ private List getEdges() { // エッジを保存する List エッジ = new ArrayList(); for(int u = 0; u .ShortestPathTree)tree).getCost(u); } }
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 を拡張して、重み付き 9 尾問題をモデル化する WeightedGraph を構築します (行 10 ~ 11)。各ノード u について、getEdges() メソッドは反転したノード v を見つけ、反転の数をエッジの重みとして割り当てます (vu) (30 行目)。 getNumberOfFlips(int u, int v) メソッドは、ノード u からノード v までのフリップ数を返します (行 38 ~ 47)。フリップの数は、 の間にある異なるセルの数です。 2 つのノード (44 行目).

WeightedNineTailModelは、ターゲット ノード 511 をルートとする ShortestPathTree を取得します (14 行目)。 treeNineTailModel で定義された保護されたデータ フィールドであり、ShortestPathTreeTree のサブクラスであることに注意してください。 NineTailModel で定義されたメソッドは、tree プロパティを使用します。

getNumberOfFlips(int u) メソッド (49 ~ 52 行目) は、ノード u からターゲット ノードまでのフリップ数を返します。これは、ノードからのパスのコストです。 u をターゲット ノードに送信します。このコストは、ShortestPathTree クラス (51 行目) で定義されている getCost(u) メソッドを呼び出すことで取得できます。 以下のコードは、ユーザーに初期ノードの入力を促し、ターゲット ノードに到達するまでの最小フリップ回数を表示するプログラムを提供します。


パッケージデモ; java.util.Scannerをインポートします。 パブリック クラス WeightedNineTail { public static void main(String[] args) { // ユーザーに 9 つのコインの H と T を入力するよう求める System.out.print("最初の 9 つのコイン H と T を入力してください: "); スキャナ入力 = 新しいスキャナ(System.in); 文字列 s = input.nextLine(); char[] 初期ノード = s.toCharArray(); WeightedNineTailModel モデル = new WeightedNineTailModel(); java.util.List パス = 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 

コインを投げる手順は

うーん

TT

はあ

うーん

THT

TT

TT

TT

TT

フリップ回数は8回です

プログラムは、ユーザーに、

H

s と Ts を組み合わせた 9 文字の初期ノードを 8 行目の文字列として入力するよう求め、次から文字の配列を取得します。文字列 (9 行目)、モデルを作成 (11 行目)、最初のノードからターゲット ノードまでの最短パスを取得 (12 ~ 13 行目)、パス内のノードを表示します (行目) 16–17)、getNumberOfFlips を呼び出して、ターゲット ノードに到達するために必要なフリップ数を取得します (20 行目)。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/paulike/case-study-the-weighted-nine-tails-problem-3n9i?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3