![](/img/trans.png)
[英]How to solve Linear Programming Problem with more than one optimal solution using pulp
[英]Why my solution is unable to solve 8puzzle problem for boards that require more than 1 move?
我正在嘗試解決此作業中此處給出的python中的8個難題問題-https: //www.cs.princeton.edu/courses/archive/fall12/cos226/assignments/8puzzle.html
我的目標狀態與作業中提到的略有不同-
#GOAL STATE
goal_state = [[0,1,2],[3,4,5],[6,7,8]]
越野車部分似乎是isSolvable函數。 它已正確實施,但是在測試電路板時,它認為目標狀態是保持相對順序的狀態,空白可以在任何地方。 因此,可能情況是一塊木板是可解決的,但可能不會導致當前定義的目標狀態。 因此,我無法想到一種方法,可以在運行求解器功能時測試所有可能的目標狀態*
另外,我的求解器功能被錯誤地實現。 我只考慮具有最低曼哈頓價值的鄰居,而當我陷入僵局時,我沒有考慮其他州。 這可以通過使用優先級隊列來完成。 我不確定如何繼續執行它。 我已經寫了一部分(見下文),這也是一種錯誤,因為我沒有將父項推入堆中。 請為此提供指導。
這是我的完整代碼-https://pastebin.com/q7sAKS6a
更新了具有不完整求解器功能的代碼-https: //pastebin.com/n4CcQaks
我已經使用曼哈頓值來計算啟發式值和漢明值來打破平局。
我的isSolvable函數,曼哈頓函數和求解器函數:
isSolvable函數-
#Conditions for unsolvability -->
#https://www.geeksforgeeks.org/check-instance-8-puzzle-solvable/
def isSolvable(self):
self.one_d_array = []
for i in range(0,len(self.board)):
for j in range(0,len(self.board)):
self.one_d_array.append(self.board[i][j])
inv_count = 0
for i in range(0,len(self.one_d_array)-1):
for j in range(i+1, len(self.one_d_array)):
if (self.one_d_array[i] != 0 and self.one_d_array[j] != 0 and self.one_d_array[i] > self.one_d_array[j]):
inv_count = inv_count + 1
if(inv_count % 2 == 0):
print("board is solvable")
return True
else:
print("board is not solvable")
return False
曼哈頓功能
def manhattan_value(self,data=None):
manhattan_distance = 0
for i in range(0,len(data)):
for j in range(0,len(data)):
if(data[i][j] != self.goal_state[i][j] and data[i][j] != 0):
#correct position of the element
x_goal , y_goal = divmod(data[i][j],3)
manhattan_distance = manhattan_distance + abs(i-x_goal) + abs(j-y_goal)
return manhattan_distance
更新了求解器功能
#implement A* algorithm
def solver(self):
moves = 0
heuristic_value = []
prev_state = []
curr_state = self.board
output = []
heap_array = []
store_manhattan_values = []
if(curr_state == self.goal_state):
print("goal state reached!")
print(curr_state)
print("number of moves required to reach goal state --> {}".format(moves))
else:
while(True):
min_heuristic_value = 99999999999
min_pos = None
moves = moves + 1
output = self.get_neighbours(curr_state)
for i in range(len(output)):
store_manhattan_values.append([self.manhattan_value(output[i]),i])
#print(store_manhattan_values)
for i in range(len(store_manhattan_values)):
heapq.heappush(heap_array,store_manhattan_values[i])
#print(heap_array)
#print(heapq.heappop(heap_array)[1])
#if(moves > 1):
# return
return
請參考PASTEBIN鏈接以獲取完整的代碼和所有參考( https://pastebin.com/r7TngdFc )。
更新了具有不完整求解器功能的代碼-https: //pastebin.com/n4CcQaks
在我的代碼的給定鏈接中(根據到目前為止的測試和調試)-這些功能正常運行-manhatten_value,hamming_value,append_in_list,get_neighbours
這些功能是做什么的-
isSolvable-告訴董事會是否可以解決
manhattan_value-計算傳遞給它的板的曼哈頓值。
hamming_value-計算傳遞給它的電路板的漢明值。
append_in_list-獲取鄰居的幫助函數。 它交換值,然后將結果狀態保存在數組中,然后重新交換它們以返回原始位置以進行進一步交換並獲取其他可能的狀態。
get_neighbours-獲取所有可能的鄰居,這些鄰居可以通過將位置交換為空白element(0 element)來形成。
求解器 -實現A *算法
我找不到我的錯誤。 請引導我解決這個問題。 預先感謝您的幫助!
我提前致歉,因為我無法針對此問題生成最低版本的代碼。 我想不出任何方式來使用所有功能並產生最小版本的代碼。
(請注意,此答案與之前的修訂版本不同,該版本涉及以下許多評論。)
我看不到當前代碼如何實現隊列。 似乎求解器中的while
循環每次都會從可能的動作列表中選擇一個新的棋盤狀態,然后考慮該新棋盤狀態生成的下一個列表。
另一方面,據我了解,優先級隊列會將當前板狀態中的所有 (有效)鄰居插入優先級隊列中,並對其進行優先級排序,以便將要從隊列中移除並檢查的下一個選定板狀態為優先級隊列。優先級最高的一個
(為確保在調試中完全確定,我可能會添加一個備注以檢測代碼是否最終還會重新訪問板狀態-嗯,再三考慮一下,我相信作業描述中的規定是將當前移動次數添加到如果正確觀察到優先級隊列,則優先級分配將排除重新訪問同一板狀態的情況,因此可能不需要備忘錄。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.