2010-03-23 39 views
12

Tôi đang viết một bộ giải sokoban cho vui và thực hành, nó sử dụng một thuật toán đơn giản (một cái gì đó giống như BFS với một chút khác biệt).đếm đường dẫn tuần hoàn riêng biệt từ A [a, b] đến A [c, d]?

bây giờ tôi muốn ước tính thời gian chạy của nó (O và omega). nhưng cần phải biết làm thế nào để tính toán số lượng đường đi tuần hoàn từ đỉnh này sang đỉnh khác trong mạng. thực sự tôi muốn một biểu thức tính toán số đường dẫn hợp lệ, giữa hai đỉnh của ma trận m * n của đỉnh.

một đường dẫn hợp lệ:

  • lần mỗi đỉnh 0 hoặc một lần.
  • không có mạch

ví dụ này là một đường dẫn hợp lệ:

alt text http://megapic.ir/images/f1hgyp5yxcu8887kfvkr.png

nhưng đây không phải là:

alt text http://megapic.ir/images/wnnif13ir5gaqwvnwk9d.png

Điều cần thiết là một phương pháp để tìm số lượng tất cả các đường đi vòng tròn giữa hai đỉnh ab.

nhận xét về phương pháp và thủ thuật giải quyết được hoan nghênh.

+3

Số lượng đường dẫn có thể sẽ lớn hơn rất nhiều so với số đường dẫn được BFS xem xét vì vậy tôi không thấy nó sẽ giúp ích như thế nào. Một BFS liên tục kết hợp các đường dẫn tương tự với nhau làm giảm độ phức tạp. Độ phức tạp của BFS là O (| V | + | E |). – fgb

+0

Bạn có muốn danh sách tất cả các đường dẫn hoặc chỉ số lượng đường dẫn không? Nếu bạn muốn số lượng đường dẫn, bạn sẽ giải quyết cho một xấp xỉ? – user287792

+0

Tôi không muốn danh sách của họ. tôi muốn tính số lượng chúng mà không tính chúng. –

Trả lời

4

Không phải là giải pháp nhưng có thể bạn có thể nghĩ ý tưởng này thêm một chút nữa. Vấn đề là bạn sẽ cần phải tính toán con đường dài nhất có thể để có được tất cả các đường dẫn. longest path problem là NP hoàn chỉnh cho đồ thị chung, do đó, nó sẽ có được một thời gian rất dài ngay cả đối với các đồ thị nhỏ tương đối (8x8 và lớn hơn).

Hãy tưởng tượng đỉnh bắt đầu nằm ở góc trên cùng bên trái và đỉnh cuối ở góc dưới bên phải của ma trận.

  • Đối với một ma trận 1x2 chỉ có 1 con đường có thể
  • 2x2 ma trận => 2 *** 1 ** đường dẫn => 2
  • 3x2 ma trận => 2 *** 2 ** đường dẫn = > 4
  • 3x3 ma trận => 2 *** 4 ** + 2 * 2 đường dẫn => 12
  • 3x4 ma trận => 2 *** 12 ** + 12 + 2 đường dẫn => 38

Mỗi lần tôi kết hợp các kết quả từ phép tính trước đó cho số đường dẫn hiện tại. Nó có thể là có một công thức gần gũi cho một biểu đồ phẳng như vậy, có lẽ thậm chí còn có rất nhiều lý thuyết cho điều đó, nhưng tôi quá ngu ngốc cho điều đó ...

Bạn có thể sử dụng Java sau đây (xin lỗi, tôi không phải là một C++ chuyên gia: - /) đoạn mã để tính toán đường đi có thể cho ma trận lớn hơn:

public static void main(String[] args) { 
    new Main(3, 2).start(); 
} 
int xSize; 
int ySize; 
boolean visited[][]; 

public Main(int maxX, int maxY) { 
    xSize = maxX; 
    ySize = maxY; 
    visited = new boolean[xSize][ySize]; 
} 

public void start() { 
    // path starts in the top left corner 
    int paths = nextCell(0, 0); 
    System.out.println(paths); 
} 

public int nextCell(int x, int y) { 
    // path should end in the lower right corner 
    if (x == xSize - 1 && y == ySize - 1) 
     return 1; 

    if (x < 0 || y < 0 || x >= xSize || y >= ySize || visited[x][y]) { 
     return 0; 
    } 

    visited[x][y] = true; 
    int c = 0; 
    c += nextCell(x + 1, y); 
    c += nextCell(x - 1, y); 
    c += nextCell(x, y + 1); 
    c += nextCell(x, y - 1); 
    visited[x][y] = false; 
    return c; 
} 

=>

  • 4x4 => 184
  • 5x5 => 8512
  • 6x6 => 1262 816
  • 7x7 (ngay cả trường hợp đơn giản này mất rất nhiều thời gian!) => 575780564

Điều này có nghĩa bạn có thể (chỉ có trên lý thuyết) tính toán tất cả các con đường có thể từ bất kỳ vị trí của một ma trận MXM để thấp hơn, phải không góc và sau đó sử dụng ma trận này để nhanh chóng tra cứu số lượng đường dẫn. Dynamic programming (sử dụng kết quả tính toán trước đó) có thể tăng tốc độ một chút.

+0

Cảm ơn lời khuyên và giải pháp hữu ích. –

+0

Tôi vui vì nó giúp và tôi hy vọng rằng điều này có ý nghĩa và gần như là vô hại. Cảm ơn câu hỏi thú vị này :-)! – Karussell

+0

xem tham chiếu đầu tiên (blum + hewitt: automata trên băng 2 chiều) tại đây: ftp://ftp.inf.fu-berlin.de/pub/reports/tr-b-97-08.ps.gz - > ở đó họ tính toán số chu kỳ có thể có trong lưới KxK. Có lẽ đây là một vấn đề gần như giống hệt với của bạn -> chỉ cần kết nối đỉnh bên phải thấp hơn với đỉnh trên bên trái? – Karussell

1

Ma trận có hiển thị các cạnh hoạt động không? Hãy xem xét việc xây dựng một Ma trận cho thấy các cạnh, tức là. [a, b] = 1 < => a-> b là một cạnh trong biểu đồ, 0 nếu không. Bây giờ, nâng Ma trận này lên các cường độ khác nhau để cho biết có bao nhiêu cách tồn tại giữa các đỉnh bằng cách sử dụng n bước và sau đó tổng hợp chúng để có được kết quả. Đây chỉ là một ý tưởng về một cách để giải quyết vấn đề, có thể có nhiều cách khác để giải quyết vấn đề.

Tôi tự hỏi nếu điều này thuộc về MathOverflow, như ý tưởng khác


Đúng vậy, một khi bạn có một ma trận bằng không bạn có thể dừng exponentiating như trong trường hợp của bạn, không có nhiều nơi để đi sau 3 , nhưng các đường dẫn từ 1 đến 3 sẽ là đường dẫn trực tiếp và đường đi qua 2, do đó, chỉ có một vài ma trận để cộng lại trước khi tất cả các số không được tìm thấy.


Tôi nghĩ cần có một cách để tính toán một ràng buộc của nói n^(n + 1), trong đó n là số đỉnh của đồ thị, điều đó sẽ chỉ ra một điểm dừng như bởi đó điểm, mỗi đỉnh sẽ được truy cập một lần. Tôi không chắc chắn làm thế nào để có được những con đường cyclic ra khỏi vấn đề mặc dù, hoặc có thể giả định rằng đồ thị là miễn phí của chu kỳ?

+0

Cân nhắc 1 -> 2, 1 -> 3, 2 -> 3. Ma trận adjacency: 0 1 1 | 0 0 1 | 0 0 0. Tất cả các thành phần của ma trận này sẽ bằng 0 bằng cách lặp lại lũy thừa. Nếu bạn xem xét một ma trận kề đại diện (đối với một đồ thị vô hướng), thì làm thế nào bạn thậm chí sẽ biết khi nào nên dừng exponentiating? – IVlad

+0

Điều gì sẽ xảy ra nếu ma trận không bao giờ trở thành 0 mặc dù? Làm thế nào để bạn biết khi nào nên dừng lại? – IVlad

+0

Phương pháp được mô tả cũng sẽ đếm đường dẫn nơi một số nút được truy cập nhiều lần, do đó, tốt nhất điều này sẽ là giới hạn trên về số lượng đường dẫn. Ma trận giữ không có thông tin về các nút đã truy cập, chỉ số lượng các cách đi từ a đến b. –

3

Có một vấn đề tương tự nhưng ít chung về dự án Euler: http://projecteuler.net/index.php?section=problems&id=237

Tôi nghĩ rằng một số các giải pháp được mô tả trong diễn đàn này có thể được mở rộng để giải quyết trường hợp tổng quát của bạn. Đó là một vấn đề khá khó khăn, đặc biệt là cho trường hợp chung của bạn.

Để truy cập diễn đàn của họ, trước tiên bạn cần giải quyết vấn đề. Tôi sẽ không đăng câu trả lời ở đây, cũng không liên kết đến một trang web nào đó liệt kê câu trả lời, một trang web mà bạn có thể dễ dàng tìm thấy trên google bằng cách tìm kiếm điều gì đó thực sự rõ ràng.

+0

Kính gửi IVlad, tôi nghĩ nó tổng quát hơn là vấn đề bạn muốn nói. vì quy tắc thứ ba của vấn đề 237 nói: Chuyến tham quan sẽ ghé thăm từng ô vuông chính xác một lần. nhưng tại đây Tour tham quan mỗi ô vuông ít hơn hai lần. (1 hoặc 0 lần) và chuyến tham quan bắt đầu và kết thúc giữa 2 đỉnh tùy ý và khác biệt. –

4

Vấn đề chung về đếm số lượng đường dẫn đơn giản trong biểu đồ là #P hoàn thành. Một số vấn đề # P-complete có các lược đồ xấp xỉ đa thức ngẫu nhiên đa thức, và một số thì không, nhưng bạn khẳng định không quan tâm đến một xấp xỉ. Có lẽ có một cách để tận dụng lợi thế của cấu trúc lưới, vì có để tính toán đa thức Tutte, nhưng tôi không có bất kỳ ý tưởng nào về cách thực hiện điều này.

+0

Tôi khá chắc chắn rằng số lượng đường dẫn là hữu hạn. Tôi không chắc chắn nhưng tôi nghĩ rằng phải có một chuỗi đệ quy của số lượng, cũng sẽ rất khó để ước tính nó mà không thực sự đánh giá. –

+0

Thực ra nó có thể dễ dàng hơn nhiều so với tính toán chính xác. Chỉnh sửa câu hỏi nếu bạn thay đổi ý định ... – user287792

+1

"sẽ rất khó để ước tính nó mà không thực sự đánh giá" -> có, chính xác những gì tôi nghĩ. bạn có thể tra cứu lý thuyết cho đồ thị phẳng để có được hình dạng xấp xỉ: http://www.cs.brown.edu/sites/jgaa/accepted/2007/RobertsKroese2007.11.1.pdf – Karussell

2

Đây là câu hỏi mở trong Toán học với ứng dụng trực tiếp hóa học và vật lý trong việc sử dụng nó để tạo mô hình liên kết polymer. Một số công việc sớm nhất được thực hiện về điều này đã được thực hiện trong dự án Manhattan (bom hạt nhân Thế chiến thứ hai.)

Nó được biết đến nhiều hơn là vấn đề Tự Tránh Đi.

Tôi đã dành một mùa hè tại khoa toán học đại học của mình để nghiên cứu thuật toán monte-carlo được gọi là thuật toán pivot để ước tính các tham số của số lần đi bộ tự tránh của một độ dài nhất định n.

Vui lòng tham khảo sách tuyệt vời của Gordon Slade có tiêu đề "The Self Avoiding Walk" để có phạm vi phủ sóng rộng rãi về các loại kỹ thuật được sử dụng để tiếp cận vấn đề này cho đến nay.

Đây là một vấn đề rất phức tạp và tôi tự hỏi động lực của bạn có thể là gì để xem xét nó. Có lẽ bạn có thể tìm thấy một mô hình đơn giản hơn cho những gì bạn muốn, bởi vì Self Avoiding Walks không đơn giản chút nào.

+0

http://mathworld.wolfram.com/Self-AvoidingWalk.html có tài liệu tham khảo bổ sung. –

Các vấn đề liên quan