拉斯維加斯演算法與N皇后問題

2021-10-06 19:17:45 字數 1970 閱讀 7001

拉斯維加斯演算法

拉斯維加斯演算法不會得到不正確的解。一旦用拉斯維加斯演算法找到乙個解,這個解就一定是正確解。但有時用拉斯維加斯演算法找不到解。與蒙特卡羅演算法類似,拉斯維加斯演算法找到正確解的概率隨著它所用的計算時間的增加而提高。對於所求解問題的任一例項,用同一拉斯維加斯演算法反覆對該例項求解足夠多次,可使求解失敗的概率任意小。

n皇后的求解方法:

消極:lv演算法過於消極,一旦失敗,從頭再來。

樂觀:回溯演算法過於樂觀,一旦放置某個皇后失敗,就進行系統回退一步的策略,而這一步往往不一定有效

折中:一般情況下更好,先用lv方法隨機的放置前若干個結點,然後使用回溯法放置後若干個結點

隨機放置位置策略和回溯法相結合求解n皇后問題

randomnumber.h標頭檔案

#include

//利用線性同餘法產生的偽隨機數

const

unsigned

long maxshort=

65536

;const

unsigned

long multipliter=

1194211693l

;const

unsigned adder=

12345l

;class

randomnumber

;randomnumber::

randomnumber

(unsigned

long s)

unsigned

short randomnumber::

random

(unsigned

long n)

double randomnumber::

frandom

(void

)

主檔案:

#include

#include

#include

#include

"randomnumber.h"

using

namespace std;

class

queen

;bool queen::

place

(int k)

bool queen::

backtrack

(int t)

else

}return

false;}

bool queen::

queenslv

(int stop)

if(count>0)

//這裡利用上面儲存的可以放置的列,然後隨機取其中一列來放置第k行的皇后。這就是las vegas的精髓!

x[k++

]=y[rnd.

random

(count)];

//隨機位置

}return

(count>0)

;//count>0表示放置成功

}bool

nqueen

(int n)

x.y=p;

x.x=q;

// 設定隨機放置皇后的個數

int stop=8;

if(n>15)

stop=n-15;

bool found=

false

;while

(!x.

queenslv

(stop));

// 演算法的回溯搜尋部分

if(x.

backtrack

(stop+1)

) cout

p;delete

q;return found;

}int

main()

拉斯維加斯法解n皇后問題

問題如下 有乙個n n n times n n n的棋盤,要求在上面放置n個皇后,這些皇后之間不能在一條直線或斜線上 45度 求乙個符合要求的放置方案。拉斯維加斯演算法隨機產生乙個解,但是這個解不一定符合題設要求 即拉斯維加斯演算法可能找不到問題的解 例如n皇后問題中,隨機產生的擺放位置可能符合 n...

蒙特卡羅演算法 與 拉斯維加斯演算法

蒙特卡羅演算法並不是一種演算法的名稱,而是對一類隨機演算法的特性的概括。說 蒙特卡羅演算法打敗武宮正樹 這個說法就好比說 我被乙隻脊椎動物咬了 是比較火星的。實際上是zen的演算法具有蒙特卡羅特性,或者說它的演算法屬於一種蒙特卡羅演算法。那麼 蒙特卡羅 是一種什麼特性呢?我們知道,既然是隨機演算法,...

隨機演算法 蒙特卡羅演算法與拉斯維加斯演算法比較

蒙特卡羅 monte carlo 演算法並不是一種特定的演算法,而是對一類隨機演算法的特性的概括。它的名字 於賭城蒙特卡羅,象徵概率。它的基本思想是通過大量隨機樣本,去了解乙個系統,進而得到要計算的值。它非常強大靈活,又相當簡單易懂,很容易實現。隨機演算法分為兩大類 蒙特卡羅演算法和拉斯維加斯演算法...