回溯演算法的效率不是很高,就起本質而言,屬於窮舉,不同的是提供了乙個窮舉的思路:回溯。回溯演算法也稱試探法,基本思想是:從一條路往前走,能進則進。
回溯法採用試錯的思想,它嘗試分步的去解決乙個問題。在分步解決問題的過程中,當它通過嘗試發現現有的分步答案不能得到有效的正確的解答的時候,它將取消上一步甚至是上幾步的計算,再通過其它的可能的分步解答再次嘗試尋找問題的答案。回溯法通常用最簡單的遞迴方法來實現,在反覆重複上述的步驟後可能出現兩種情況:
1.找到乙個可能存在的正確的答案
2.在嘗試了所有可能的分步方法後宣告該問題沒有答案
深度搜尋,確定了解空間的組織結構後,回溯法就從開始結點(根結點)出發,以深度優先的方式搜尋整個解空間。這個開始結點就成為乙個活結點,同時也成為當前的擴充套件結點。在當前的擴充套件結點處,搜尋向縱深方向移至乙個新結點。這個新結點就成為乙個新的活結點,並成為當前擴充套件結點。如果在當前的擴充套件結點處不能再向縱深方向移動,則當前擴充套件結點就成為死結點。此時,應往回移動(回溯)至最近的乙個活結點處,並使這個活結點成為當前的擴充套件結點。
剪枝,回溯法是乙個即帶有系統性又帶有跳躍性的搜尋演算法,當節點肯定不包含,則跳過對以該結點為根的子樹的系統搜尋,逐層向其祖先結點回溯,剪枝使得回溯演算法效率提高了。
有去有回,去按照深度遍歷,回體現了回溯的思想。
對於回溯的理解,是在**的基礎上不斷加深的,分享一下自己寫的**,希望大家可以拍磚斧正~
#region 回溯+貪心--劉雅雯--2023年9月26日21:36:29
/// /// 從k節點擴充套件下去,計算得到的最大價值
//////
//////
//////
///最大價值
///揹包使用的容量
///k節點
///float bound(float values, float weight, float vw, int n, float w, float profit_gained, float weight_used, int k)
else
}return profit_gained;
}///
//////
//////
//////
//////
int[,] knapsack(float values, float weight, float vw, int n, float w)
if (index>=n) //@@@物品放完了???回答:物品判斷完了最後乙個
}else
while(bound(values,weight,vw,n,w,current_profit,current_weight,index)<=profit) //@@@何時滿足條件,第一次滿足:遍歷完物品,之後條件不固定
count++;
while (index!=0 && status[index]!=1)//@@@!=1是什麼樣的節點?物品沒有放進去的節點 相當於出口
if (index==0)
status[index] = 0; //1的情況已經考慮,現在要考慮o的情況了
current_weight -= weight[index];
current_profit -= values[index];
}index++; //遍歷}}
#endregion
呼叫方式如下:
private
void backtracking_click(object sender, eventargs e)
;float weight = new
float[8] ;
float vm = new
float[8] ;
int[,] c = new
int[0,0];
c = knapsack(value, weight, vm, 8, 110);
for (int i = 0; i < c.length/8; i++)
labbacktracking.text = labbacktracking.text + "\r\n";}}
演算法我們要從不同的角度去深入和了解,不斷的思考,每次會有不同的體會。
基於貪心演算法的0 1揹包問題
貪心演算法的思想 貪心演算法不是某種特定的演算法,而是一類抽象的演算法,或者說只是一種思想,它的具體表現在,對解空間進行搜尋時,不是機械地搜尋,而是對區域性進行擇優選取,貪心演算法的目的不是為了找到全部解,也當然找不出最優解,而只是找出一種可行解,這樣效率就比較高。因此,貪心演算法也叫啟發式搜尋,這...
揹包問題(貪心演算法)
揹包問題 程式8 4 2.cpp 定義控制台應用程式的入口點。揹包問題 貪心演算法 include stdafx.h define maxnumber 20 typedef struct node object float find object wp,int n,float m i 0 while...
貪心演算法 揹包問題
詳細見原帖 我寫的是自己的感悟 揹包問題 有乙個揹包,揹包容量是m 150。有7個物品,物品可以分割成任意大小。要求盡可能讓裝入揹包中的物品總價值最大,但不能超過總容量。物品 a b c d e f g 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 ...