」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 案例研究:加權九尾問題

案例研究:加權九尾問題

發佈於2024-11-08
瀏覽:983

加權九尾問題可以簡化為加權最短路徑問題。
部分提出了九尾問題並使用 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]刪除
最新教學 更多>
  • 如何在Ajax資料載入過程中顯示進度條?
    如何在Ajax資料載入過程中顯示進度條?
    如何在Ajax 資料載入期間顯示進度條處理使用者觸發的事件(例如從下拉方塊中選擇值)時,通常會使用非同步擷取資料阿賈克斯。在獲取數據時,向用戶提供正在發生某事的視覺指示是有益的。本文探討了一種在 Ajax 請求期間顯示進度條的方法。 使用 Ajax 實作進度條要建立一個準確追蹤 Ajax 呼叫進度的...
    程式設計 發佈於2024-11-08
  • 如何使用 CNTLM 存取工作場所代理程式後面的 pip?
    如何使用 CNTLM 存取工作場所代理程式後面的 pip?
    與CNTLM 的PIP 代理連接要使用CNTLM 訪問工作場所代理後面的pip,用戶可能會遇到--proxy 選項的問題。然而,利用環境變數提供了可靠的解決方案。 CNTLM 設定驗證可以透過執行「cntlm.exe -c cntlm.ini -I -M http://google.com」來實現。...
    程式設計 發佈於2024-11-08
  • 如何使用 MySQL 資料庫中的時間序列資料填入 JFreechart TimeSeriesCollection?
    如何使用 MySQL 資料庫中的時間序列資料填入 JFreechart TimeSeriesCollection?
    從 MySQL DB 填入 JFreechart TimeSeriesCollection此問題旨在使用 JFreechart TimeSeriesCollection 顯示一個月中幾天的溫度變化。然而,最初的實作面臨著從資料庫中準確讀取資料的挑戰。 時序資料的精確讀取要解決資料讀取問題,需要考慮之...
    程式設計 發佈於2024-11-08
  • ValueError:無法將 NumPy 陣列轉換為張量 - 已解決?
    ValueError:無法將 NumPy 陣列轉換為張量 - 已解決?
    ValueError: Failed to Convert NumPy Array to Tensor問題描述嘗試使用TensorFlow 訓練具有LSTM 層的神經網路時,出現下列情況發生錯誤:ValueError: Failed to convert a NumPy array to a Ten...
    程式設計 發佈於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 type...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中強制硬刷新並防止快取問題?
    如何在 JavaScript 中強制硬刷新並防止快取問題?
    解決JavaScript 快取問題:使用JavaScript 清除快取部署新的JavaScript 程式碼時,看不到反映的最新更新是令人沮喪的。此問題通常是由於快取的瀏覽器回應而引起的。為了消除這個問題,我們可以利用 JavaScript 函數 window.location.reload(true...
    程式設計 發佈於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.Fil...
    程式設計 發佈於2024-11-08
  • 變數第 04 部分
    變數第 04 部分
    মনে করুন আপনি চা খাবেন। না, চা না। কফিই খান। প্রোগ্রামার হচ্ছেন কফি তো খেতেন পারেন। কফিকে প্রোগ্রামারদের সঙ্গি বললে ভুল হবে না । যাই হোক। এখন কফি তৈর...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3