試探算法思想
試探算法也稱為回溯法,它是一種系統地搜索問題解的方法。例如在棋手思考下一步該走哪里時,就是采用試探算法:首先試想下一步所在的位置,計算對手的應對,在計算自己的對應,若對手應對與我不利,則取消該下一步設想,然后重新計算另一個下一步的位置。從一條路往前走,能進則進,不能進則退回來,換一條路再試。
1算法思路
1、定義一個解空間,它包含問題的解。
2、利用適於搜索的方法組織解空間。
3、利用深度優先法搜索解空間。
4、利用限界函數避免移動到不可能產生解的子空間。
問題的解空間通常是在搜索問題的解的過程中動態產生的,這是回溯算法的一個重要特性。
對解集合中的各個解進行試探
{
if(滿足條件)
{
保存結果
if(完成集合中所有解的試探)
輸出解
else
重復本過程進行下一步的試探(遞歸調用本函數)
}else{
恢復至上一部保存結果之前的狀態,進行另一步試探(遞歸調用本函數)
}
}
2.實例:生成彩票號碼組合
常見的彩票號碼都是由一些數字組成的,生成彩票號碼其實就是將所有數字進行不同的組合。例如,假設有一種彩票,每注由7個1-29的數字組成,且這七個數字不能重復。
package 練習; public class 試探法生成彩票 {;//控制台輸出時候顯示會有一定緩存,所有結果不一定對,但是算法一定對的 public static int MAX_=7; public static int NUM_=29; public static int num[]=new int[NUM_]; public static int lottey[]=new int [MAX_]; public static void main(String[] args) { for(int i=0;i<NUM_;i++){ num[i]=i+1; } for(int i=0;i<MAX_;i++){ lottey[i]=0; } conbine(NUM_,MAX_); } public static void conbine(int nUM_2, int mAX_2) { // TODO Auto-generated method stub for(int i=nUM_2;i>=mAX_2;i--){ lottey[mAX_2-1]=num[i-1]; if(mAX_2>1){ conbine(i-1,mAX_2-1); }else{ for(int c=MAX_-1;c>=0;c--) System.out.print(lottey[c]+" "); System.out.println(); } } } }
結果:
...
29 28 18 15 14 6 5
29 28 18 15 14 6 4
29 28 18 15 14 6 3
29 28 18 15 14 6 2
29 28 18 15 14 6 1
29 28 18 15 14 5 4
29 28 18 15 14 5 3
29 28 18 15 14 5 2
29 28 18 15 14 5 1
...