Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: dùng thuật toán breadth first search (bfs) giải bài toán 8 puzzle

  1. #1
    Ngày gia nhập
    01 2015
    Bài viết
    5

    Mặc định dùng thuật toán breadth first search (bfs) giải bài toán 8 puzzle

    có anh chị nào đã học qua môn trí tuệ nhân tạo không ạ , mong mọi người hướng dẫn giúp em ứng dụng thuật toán bfs vào giải bài toán 8 puzzle , em không biết cách để đưa thuật toán vào bài này ....cám ơn mọi người nhiều ...

  2. #2
    Ngày gia nhập
    06 2011
    Bài viết
    39

    phần code còn thiếu bạn tự viết nhé
    C++ Code:
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <queue>
    4. #include <set>
    5. using std::queue;
    6. using std::set;
    7.  
    8. class puzzle
    9. {
    10. public:
    11.     char data[9];
    12.     short count;
    13.    
    14.     bool goal()
    15.     {
    16.         //do somethings
    17.     }
    18.  
    19.     bool canMoveLeft()
    20.     {
    21.         //do somethings
    22.     }
    23.  
    24.     bool canMoveRight()
    25.     {
    26.         //do somethings
    27.     }
    28.  
    29.     bool canMoveUp()
    30.     {
    31.         //do somethings
    32.     }
    33.  
    34.     bool canMoveDown()
    35.     {
    36.         //do somethings
    37.     }
    38.  
    39.     puzzle movedUp()
    40.     {
    41.         puzzle res;
    42.         res.count=count+1;
    43.         //
    44.         //do somethings to move
    45.         //
    46.  
    47.         return res;
    48.     }
    49.  
    50.     puzzle movedDown()
    51.     {
    52.         puzzle res;
    53.         res.count=count+1;
    54.         //
    55.         //do somethings to move
    56.         //
    57.         return res;
    58.     }
    59.  
    60.     puzzle movedLeft()
    61.     {
    62.         puzzle res;
    63.         res.count=count+1;
    64.         //
    65.         //do somethings to move
    66.         //
    67.         return res;
    68.     }
    69.  
    70.     puzzle movedRight()
    71.     {
    72.         puzzle res;
    73.         res.count=count+1;
    74.         //
    75.         //do somethings to move
    76.         //
    77.         return res;
    78.     }
    79. };
    80.  
    81. bool operator<(const puzzle&a,const puzzle&b)
    82. {
    83.     return memcmp(&a.data[0],&b.data[0],9)<0;
    84. }
    85.  
    86. int main()
    87. {
    88.     queue<puzzle> Queue;
    89.     set<puzzle> Set;
    90.     puzzle root;
    91.    
    92.     root.count=0;
    93.     //define the root here
    94.     //
    95.     //
    96.  
    97.     Queue.push(root);
    98.     bool found=false;
    99.     while(Queue.empty()==false)
    100.     {
    101.         puzzle t=Queue.front();
    102.         Queue.pop();
    103.         if(Set.insert(t).second==false) continue;
    104.         if(t.goal()==true)
    105.         {
    106.             found=true;
    107.             printf("%d\n",t.count);
    108.             break;
    109.         }
    110.  
    111.         if(t.canMoveUp()==true) Queue.push(t.movedUp());
    112.         if(t.canMoveDown()==true) Queue.push(t.movedDown());       
    113.         if(t.canMoveLeft()==true) Queue.push(t.movedLeft());
    114.         if(t.canMoveRight()==true) Queue.push(t.movedRight());
    115.     }
    116.     if(found==false) printf("9999\n");
    117.     return 0;
    118. }
    Đã được chỉnh sửa lần cuối bởi Here i am : 30-01-2015 lúc 03:47 PM.
    Press any key to continue
    fuck china

  3. #3
    Ngày gia nhập
    01 2015
    Bài viết
    5

    Trích dẫn Nguyên bản được gửi bởi Here i am Xem bài viết
    phần code còn thiếu bạn tự viết nhé
    C++ Code:
    1.  
    2. int main()
    3. {
    4.     queue<puzzle> Queue;
    5.     set<puzzle> Set;
    6.     puzzle root;
    7.    
    8.     root.count=0;
    9.     //define the root here
    10.     //
    11.     //
    12.  
    13.     Queue.push(root);
    14.     Set.insert(root);
    15.     bool found=false;
    16.     while(Queue.empty()==false)
    17.     {
    18.         puzzle t=Queue.front();
    19.         Queue.pop();
    20.         if(Set.insert(t).second==false) continue;
    21.         if(t.goal()==true)
    22.         {
    23.             found=true;
    24.             printf("%d\n",t.count);
    25.             break;
    26.         }
    27.  
    28.         if(t.canMoveUp()==true) Queue.push(t.movedUp());
    29.         if(t.canMoveDown()==true) Queue.push(t.movedDown());       
    30.         if(t.canMoveLeft()==true) Queue.push(t.movedLeft());
    31.         if(t.canMoveRight()==true) Queue.push(t.movedRight());
    32.     }
    33.     if(found==false) printf("9999\n");
    34.     return 0;
    35. }
    bạn ơi bạn có thể giải thích các dòng code bfs cho mình được không vì mình mới hoc môn trí tuệ nhân tạo này nên chưa rõ ý nghĩa và cách hoạt động của các dòng code trong cách làm này ....mong bạn thông cảm ...cám ơn bạn nhiều ....

  4. #4
    Ngày gia nhập
    06 2011
    Bài viết
    39

    sử dụng hàng đợi, ban đầu đưa trạng thái xuất phát vào hàng đợi, với mỗi vòng lặp, lấy trạng thái ở vị trí đầu tiên trong hàng đợi ra(phải là đầu tiên và chỉ lấy 1), kiểm tra xem nó có phải trạng thái đích chưa, nếu đúng rồi thì dừng, nếu không đúng thì kiểm tra xem ta đã xét qua trạng thái này chưa(do việc di chuyển sang phải rồi lại sang trái hoặc tạo ra chu trình) nếu đã xét rồi thì phải bỏ qua nó, bạn có thể không cần bỏ qua mà chương trình chạy vẫn đúng, như sẽ rất ì ạch ,liệt kê tất cả các trạng thái lân cận của trạng thái đang xét và đẩy vào hàng đợi rồi tiếp tục vòng lặp.

    goal(): kiểm tra trạng thái đang xét có phải là đích hay không
    canMoveLeft(): kiểm tra trạng thái đang xét có thể di chuyển sang trái hay không
    movedDown(): tạo ra một trạng thái mơi là trạng thái đang xét di chuyển xuống( chỉ sử dụng khi có thể di chuyển xuống)

    để thuận tiện cho việc kiểm tra một trạng thái đã xét hay chưa, ta sử dụng set, cấu tạo của nó là một cây nhị phân cân bằng, cấu trúc set yêu cầu sử dụng toán tử < để so sánh các phần tử của nó, do đó cần phải định nghĩa thêm operator<(const puzzle&a,const puzzle&b), mỗi khi insert một phần tử vào set thì nó sẽ cho biết có bị trùng hay không

    C++ Code:
    1.  queue<puzzle> Queue;//khai báo hàng đợi
    2.     set<puzzle> Set;//khai báo set
    3.     puzzle root;
    4.    
    5.     root.count=0;//số lần di cuyển ban đâu là 0
    6.     //define the root here
    7.     //trạng thái ban đầu như thế nào ?
    8.     //
    9.  
    10.     Queue.push(root);//đẩy trạng thái ban đầu vào hàng đợi
    11.     bool found=false;
    12.     while(Queue.empty()==false)
    13.     {
    14.         puzzle t=Queue.front();
    15.         Queue.pop();//lấy thằng đầu tiên trong hàng đợi ra và loại nó khoti hàng đợi
    16.         if(Set.insert(t).second==false) continue;//nếu trạng thái này đã xét thì bỏ qua
    17.         if(t.goal()==true)//nếu đây là trạng thái đích
    18.         {
    19.             found=true;
    20.             printf("%d\n",t.count);
    21.             break;
    22.         }
    23.  
    24.         if(t.canMoveUp()==true) Queue.push(t.movedUp());
    25.         if(t.canMoveDown()==true) Queue.push(t.movedDown());      
    26.         if(t.canMoveLeft()==true) Queue.push(t.movedLeft());
    27.         if(t.canMoveRight()==true) Queue.push(t.movedRight());
    28.     }
    29.     if(found==false) printf("9999\n");//nếu xết hết mọi tổ hợp có thể có mà vẫn không tìm được trạng thái đích
    Đã được chỉnh sửa lần cuối bởi Here i am : 30-01-2015 lúc 03:52 PM.
    Press any key to continue
    fuck china

  5. #5
    Ngày gia nhập
    01 2015
    Bài viết
    5

    cảm ơn bạn rất nhiều

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn