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

案例研究:加權九尾問題

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

加權九尾問題可以簡化為加權最短路徑問題。
部分提出了九尾問題並使用 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]刪除
最新教學 更多>
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-04-06
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-04-06
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-04-06
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-04-06
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-06
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-04-06
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-04-06
  • 為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    網格超過身體,用100%grid-template-columns 為什麼在grid-template-colms中具有100%的顯示器,當位置設置為設置的位置時,grid-template-colly修復了? 問題: 考慮以下CSS和html: class =“ snippet-code”> ...
    程式設計 發佈於2025-04-06
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-04-06
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-04-06
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-04-06
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    程式設計 發佈於2025-04-06
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php PHP陷入困境。 使用simplexmlelement :: attributes()函數提供了簡單的解決方案。此函數可訪問對XML元素作為關聯數組的屬性: - > attributes()為$ attributeName => $ attributeValue){ echo...
    程式設計 發佈於2025-04-06
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-04-06
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-04-06

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

Copyright© 2022 湘ICP备2022001581号-3