我正在開發項目歐盟程序爲了'啓蒙',而不僅僅是解決它們。我已經在80x80矩陣上使用動態程序解決了問題81,但是當我嘗試使用統一成本搜索來解決問題時,我的程序從未消失。我只想知道這個問題是否易於使用統一的成本搜索?該問題可在this link獲得。統一成本搜索項目歐勒#81
1
A
回答
3
UCS絕對有效。
from Queue import PriorityQueue
with open('matrix.txt') as f:
data = map(lambda s: map(int, s.strip().split(',')), f.readlines())
seen = set()
pq = PriorityQueue()
pq.put((data[0][0], 0, 0))
while not pq.empty():
(s, i, j) = pq.get()
if (i, j) not in seen:
seen.add((i, j))
if i + 1 < len(data): pq.put((s + data[i + 1][j], i + 1, j))
if j + 1 < len(data[i]): pq.put((s + data[i][j + 1], i, j + 1))
if i + 1 >= len(data) and j + 1 >= len(data): print s
1
這裏(作爲參考)是使用在C Uniform-cost search ++溶液中,用-O2
編譯需要不到一第二上的I7(沒有優化需要3秒):
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
struct Node {
size_t i, j; int cost;
Node(size_t i, size_t j, int cost) : i(i), j(j), cost(cost) {}
};
bool operator<(const Node& a, const Node& b) { return b.cost < a.cost; }
bool operator==(const Node& a, const Node& b) { return a.i == b.i && a.j == b.j; }
int main() {
const size_t SIZE = 80;
ifstream fis("matrix.txt");
int matrix[SIZE][SIZE];
char crap;
for (size_t i = 0; i < SIZE; i++)
for (size_t j = 0; j < SIZE; j++) {
fis >> matrix[i][j];
if (j < SIZE - 1) fis >> crap;
}
vector<Node> open;
set<Node> closed;
open.push_back(Node(0, 0, matrix[0][0]));
make_heap(open.begin(), open.end());
while (!open.empty()) {
Node node = open.front();
pop_heap(open.begin(), open.end()); open.pop_back();
if (node.i == SIZE - 1 && node.j == SIZE - 1) {
cout << "solution " << node.cost << endl;
return 0;
}
closed.insert(node);
Node children[] = { Node(node.i + 1, node.j, node.cost + matrix[node.i + 1][node.j]),
Node(node.i, node.j + 1, node.cost + matrix[node.i][node.j + 1]) };
for (int k = 0; k < 2; k++) {
Node child = children[k];
if (!closed.count(child)) {
vector<Node>::iterator elem = find(open.begin(), open.end(), child);
if (elem == open.end()) {
open.push_back(child); push_heap(open.begin(), open.end());
} else if (child.cost < (*elem).cost) {
(*elem).cost = child.cost;
make_heap(open.begin(), open.end());
}
}
}
}
}
這個解決方案因爲它將make_heap
稱爲make_heap
用於在重建矢量堆中的開放節點列表中進行元素替換,但不應該永久登陸並證明可以使用UCS解決問題。建議使用Project Euler問題陳述中給出的基本案例來調試解決方案。
相關問題
- 1. 統一成本搜索
- 2. 整數溢出項目歐勒8 - C
- 3. Python中的統一成本搜索
- 4. 統一成本搜索實施
- 5. 統一成本搜索與深度優先搜索
- 6. 歐拉項目#1 - 套索
- 7. 在項目歐勒#8上得到錯誤的答案
- 8. 項目歐勒#10得到錯誤的答案
- 9. VB.Net搜索系統目錄
- 10. 統一成本搜索算法僞代碼/ ocaml表示法
- 11. 如何獲得「統一成本搜索」算法中的路徑?
- 12. 帶有統一成本搜索的圖示瀏覽
- 13. CheckedListBox - 通過文本搜索項目
- 14. 本地PHP項目中的Zend搜索集成
- 15. 項目歐拉蟒
- 16. 項目歐拉#402
- 17. 項目歐拉#31
- 18. 項目歐拉 - 67
- 19. 項目歐拉#21
- 20. 歐拉項目#4
- 21. 歐拉項目17
- 22. 歐拉項目#2
- 23. 歐拉項目#10
- 24. 項目歐拉4
- 25. 項目歐拉#388
- 26. 項目歐拉97
- 27. 項目歐拉#179
- 28. 項目歐拉 - 68
- 29. 歐拉項目413
- 30. 歐拉項目#201
我覺得應該可以用UCS解決......當你嘗試它時發生了什麼?它超時了嗎? – Mehrdad
它製作的小問題,但在80×80矩陣,它只是在直到筆記本電腦的風扇開始.. – cobie
我只是做了它與〜15條UCS線的Python,得到它正確的。我想你在算法中忘記了一些東西。 (你是否檢查過以確保你不重複檢查同一個節點兩次?它與DP沒有區別) – Mehrdad