2013-01-13 45 views
10

我正試圖解決與Python圖形相關的問題。由於它是一個令人眼花繚亂的編程問題,我沒有使用任何其他第三方軟件包。在Python中建模圖形

該問題以5 X 5正方形網格的形式呈現圖形。 假定機器人位於用戶在網格上的位置。網格索引爲左上角的(0,0),右下角爲(4,4)。網格中的每個單元格均由以下3個字符中的任何一個表示。 'b'(ascii值98)指示機器人的當前位置,'d'(ascii值100)指示髒單元並且' - '(ASCII值45)指示網格中的乾淨單元。下面 例如是一個樣品網格,其中機器人爲0 0

b---d 
-d--d 
--dd- 
--d-- 
----d 

的目標是清洗所有的細胞在網格中的步驟最小數目。 甲步驟被定義爲一個任務,其中任 ⅰ)機器人的位置改變 ⅱ)機器人改變細胞(的狀態從d到 - )

假定最​​初的位置標記爲b不必清洗。機器人允許向上,向下,向左和向右移動。

我的方法

我讀過了幾個關於圖教程,並決定用0表示沒有路徑的曲線圖的25×25的鄰接矩陣進行建模,並在基質中1條表示路徑(因爲我們只能在4個方向上移動)。接下來,我決定將Floyd Warshell的所有對最短路徑算法應用到它,然後總結路徑的值。 但我有一種感覺,它不會工作。 我在delimma,問題是下列之一:

i)最小生成樹(我無法做到,因爲我無法建模和存儲網格作爲圖形)。 ii)搜索(再一次瘋狂的猜測,但是同樣的問題在這裏,我不能將網格模型化爲圖形)。

如果你能提出一個好的方法解決這些問題,我會很感激。此外,關於各種形式的基於圖形的問題(或指向這些問題的鏈接)的一些提示和僞代碼將會有所幫助。感謝

+1

那麼,它不是一個競賽,它是一個名爲HackerRank的論壇,而且我已經明確了我對這個問題的處理方式,而且它並沒有引導我到任何地方。 – kaalobaadar

+1

問題是否指定了有多少個正方形會變髒的限制? –

+0

矩陣是否固定爲5 * 5? – Skyler

回答

4

我想你在這裏問兩個問題。

1.如何表現這個問題,因爲Python中的圖形?

由於機器人來回移動時,他會從一個骯髒的廣場被移動到另一個,有時經過沿途的一些乾淨的空間。你的工作是弄清楚訪問髒方塊的順序。

# Code is untested and may contain typos. :-) 

# A list of the (x, y) coordinates of all of the dirty squares. 
dirty_squares = [(0, 4), (1, 1), etc.] 
n = len(dirty_squares)  

# Everywhere after here, refer to dirty squares by their index 
# into dirty_squares. 

def compute_distance(i, j): 
    return (abs(dirty_squares[i][0] - dirty_squares[j][0]) 
      + abs(dirty_squares[i][1] - dirty_squares[j][1])) 

# distances[i][j] is the cost to move from dirty square i to 
# dirty square j. 
distances = [] 
for i in range(n): 
    distances.append([compute_distance(i, j) for j in range(n)]) 

# The x, y coordinates of where the robot starts. 
start_node = (0, 0) 

# first_move_distances[i] is the cost to move from the robot's 
# start location to dirty square i. 
first_move_distances = [ 
    abs(start_node[0] - dirty_squares[i][0]) 
     + abs(start_node[1] - dirty_squares[i][1])) 
    for i in range(n)] 

# order is a list of the dirty squares. 
def cost(order): 
    if not order: 
    return 0 # Cleaning 0 dirty squares is free. 
    return (first_move_distances[order[0]] 
      + sum(distances[order[i]][order[i+1]] 
       for i in range(len(order)-1))) 

您的目標是找到一種方法來重新排列列表(範圍(n)),以最小化成本。

2.我如何找到移動的最小數目來解決這個問題?

正如其他人所指出的那樣,這個問題的一般形式是頑固性(NP-硬)。您有兩條信息可幫助限制問題使其易於處理:

  1. 該圖形是網格。
  2. 最多有24個髒方格。

我喜歡你的本能,在這裏使用A *。解決找到最小移動數問題通常是很好的。但是,A *需要相當數量的代碼。我認爲你最好採用分支定界方法(有時稱爲分支和剪枝(Branch-and-Prune)),它應該幾乎同樣高效,但實施起來要容易得多。

的想法是開始使用深度優先搜索枚舉所有可能的解決方案,例如:

# Each list represents a sequence of dirty nodes. 
    [] 
    [1] 
    [1, 2] 
    [1, 2, 3] 
    [1, 3] 
    [1, 3, 2] 
    [2] 
    [2, 1] 
    [2, 1, 3] 

每次你即將遞歸到一個分支,檢查,看看是否分支比迄今爲止找到的最便宜的解決方案更昂貴。如果是這樣,你可以跳過整個分支。

如果這還不夠高效,添加一個函數來計算剩餘成本的下限。然後,如果成本([2])+ lower_bound(set([1,3]))比迄今爲止找到的最便宜的解決方案昂貴,則可以跳過整個分支。越緊的lower_bound()越多,可跳過的分支越多。

1

該問題當然可以存儲爲圖形。節點之間的成本(髒單元)是它們的Manhattan distance。忽略清潔電池的成本,因爲無論採取什麼樣的路徑,總成本都是一樣的。

3

比方說V={v|v=b or v=d},並得到一個完整的連接圖G(V,E)。您可以計算E中每條邊的成本,時間複雜度爲O(n^2)。之後問題變得完全相同:從指定頂點開始,找到G的最短路徑,其中包含V

我們稱之爲Traveling Salesman Problem(TSP)自1832年

1

這個問題在我看來像Minimum Rectilinear Steiner Tree問題。不幸的是,這個問題很難,所以你需要提出一個近似值(基於曼哈頓距離的最小生成樹),如果我是正確的。