㈠ 混沌優化演算法可以求解全局最優解嗎
非線性最優化問題的一種混合解法
摘 要:把BFGS方法與混沌優化方法相結合,基於混沌變數提出一種求解具有變數邊界約束非線性最優化問題的混合優化方法。混合演算法兼顧了混沌優化全局搜索能力強和BFGS方法收斂速度快的優點,成為一種求解非凸優化問題全局最優的有效方法。算例表明,當混沌搜索的次數達到一定數量時,混合優化方法可以保證演算法收斂到全局最優解,且計算效率比混沌優化方法有很大提高。
關鍵詞:混合法;BFGS方法;混沌優化方法;全局最優
1 引言
在系統工程、控制工程、統計學、反問題優化求解等領域中,很多問題是具有非凸性的。對此普通的優化技術只能求出局部最優解,因為這些確定性演算法總是解得最近的一個極值點[1],只有能夠給出很好的初始點才有可能得出所需要的全局最優解。為此,實際應用中通過在多個初始點上使用傳統數值優化方法來求取全局解的方法仍然被人們所採用,但是這種處理方法求得全局解的概率不高,可靠性低,建立盡可能大概率的求解全局解演算法仍然是一個重要問題。近年來基於梯度法的全局最優化方法已經有所研究[2],基於隨機搜索技術的遺傳演算法和模擬退火演算法等在全局優化問題中的應用也得到越來越大的重視[3-4]。本文則基於混沌優化和BFGS方法,提出一種求解具有簡單界約束最優化問題(1)的混合演算法。
混沌是存在於非線性系統中的一種較為普遍的現象。混沌運動宏觀上無序無律,具有內隨機性、非周期性和局部不穩定性,微觀上有序有律,並不是完全的隨機運動,具有無窮嵌套的自相似幾何結構、存在普適性規律,並不是雜亂無章的。利用混沌變數的隨機性、遍歷性和規律性特點可以進行優化搜索[5],且混沌優化方法容易跳出局部最優點。但是某些狀態需要很長時間才能達到,如果最優值在這些狀態時,計算時間勢必很長[5]。可以說混沌優化具有全局搜索能力,其局部搜索能力稍顯不足,文[5]採用二次載波技術,文[6]考慮逐漸縮小尋優變數的搜索空間都是為了彌補這一弱點。而本文則採用混沌搜索與BFGS方法進行優化求解,一方面採用混沌搜索幫助BFGS方法跳出局部最優,另一方面利用BFGS增強解附近的超線性收斂速度和搜索能力,以提高搜索最優的效率。
2 混沌-BFGS混合優化方法
2.1 BFGS方法
作為求解無約束最優化問題的擬牛頓方法類最有代表性的演算法之一,BFGS方法處理凸非線性規劃問題,以其完善的數學理論基礎、採用不精確線性搜索時的超線性收斂性和處理實際問題有效性,受到人們的重視[7-9]。擬牛頓方法使用了二階導數信息,但是並不直接計算函數的Hesse矩陣,而是採用一階梯度信息來構造一系列的正定矩陣來逼近Hesse矩陣。BFGS方法求解無約束優化問題min()的主要步驟如下:
(1) 給變數賦初值x0,變數維數n和BFGS方法收斂精度ε,令B0=I(單位陣),k=0,計算在點x0的梯度g0。
(2) 取sk=-Bk-1gk,沿sk作一維搜索,確定最優步長αk,,得新點xk+1=xk+αksk,計算xk+1點的梯度gk+1。
(3) 若||gk+1||≤ε,則令,,BFGS搜索結束,轉步驟3;否則執行(4)。
(4) 計算Bk+1:
(2)
(3)
(5) k=k+1,轉(2)。
2.2 混沌優化方法
利用混沌搜索求解問題(1)時,先建立待求變數與混沌變數的一一對應關系,本文採用。然後,由Logistic映射式(4)產生個軌跡不同的混沌變數()進行優化搜索,式(4)中=4。已經證明,=4是「單片」混沌,在[0,1]之間歷遍。
(4)
(1)給定最大混沌變數運動次數M;給賦初值,計算和;置,。
(2) 。
(3) 。
(4) 若k<M,
若,令,;
若,和保持不變;
然後令k=k+1,,轉(2)。
若k>M,則,,混沌搜索結束。
2.3 混合優化方法
混沌方法和BFGS方法混合求解連續對象的全局極小值優化問題(1)的步驟如下:
step1 設置混沌搜索的最大次數M,迭代步數iter=0,變數賦初值x0,。
step2 以為始點BFGS搜索,得當前BFGS方法最優解及=。
step3 若,取=;若,取;若,取,是相對於,較小的數。
step 4 以為始點進行混沌搜索M次,得混沌搜索後的最優解及=。
step5 若<,iter=iter+1,,轉step2;否則執行step6。
step6 改變混沌搜索軌跡,再次進行混沌搜索,即給加微小擾動,執行step 4,得搜索結果和。若<,iter=iter+1,,轉step2;否則計算結束,輸出、。
對全局極大值問題,max ,可以轉化為求解全局極小問題min 。
混合演算法中混沌搜索的作用是大范圍宏觀搜索,使得演算法具有全局尋優性能。而BFGS搜索的作用是局部地、細致地進行優化搜索,處理的是小范圍搜索問題和搜索加速問題。
3 算例
圖 1 函數-特性示意圖 圖 2 函數特性示意圖
採用如下兩個非常復雜的、常用於測試遺傳演算法性能的函數測試本文演算法:
函數稱為Camel 函數,該函數有6個局部極小點(1.607105, 0.568651)、(-1.607105, -0.568651)、(1.703607, -0.796084)、(-1.703607, 0.796084)、(-0.0898,0.7126)和(0.0898,-0.7126),其中(-0.0898,0.7126)和(0.0898,-0.7126)為兩個全局最小點,最小值為-1.031628。函數稱為 Schaffer's函數,該函數有無數個極大值,其中只有(0,0)為全局最大點,最大值為1。此函數的最大峰值周圍有一圈脊,它們的取值均為0.990283,因此很容易停留在此局部極大點。文獻[10]採用該函數對該文提出的基於移動和人工選擇的改進遺傳演算法(GAMAS)其性能進行了考察,運行50次,40%的情況下該函數的唯一全局最優點能夠找到。而採用本文混合演算法,由計算機內部隨機函數自動隨機生產100個不同的初始點,由這些初始點出發,一般混合演算法迭代2-4次即能夠收斂。M取不同數值時對函數、的計算結果分別如表1和表2所示,表中計算時間是指在奔騰133微機上計算時間。
由表2可見,當M=1500時,本文方法搜索到最優解的概率即達到40%,而此時計算量比文獻[10]小。同樣由混合演算法的100個起始點,採用文獻[5]的演算法對函數優化計算100次,以作為收斂標准,混沌搜索50000次,計算結果為67次搜索到最優解,概率為67%,平均計算時間為1.2369s。而即使保證混合演算法100次全收斂到最優解所花費的平均計算時間也只為0.2142s(表1),可見混合演算法優於文獻[5]的方法。
表1 M取不同數值時函數的計算結果
_____________________________________________________________________
M 搜索到全局最優點的次數 搜索到最優的概率 平均計算時間
(-0.0898,0.7126) (0.0898,-0.7126)
_____________________________________________________________________________________________
1000 44 39 83% 0.1214s
3000 53 45 98% 0.1955s
5000 53 47 100% 0.2142s
________________________________________________________________________________________________
表2 M取不同數值時函數的計算結果
___________________________________________________________
M 搜索到全局最優點的次數 搜索到最優的概率 平均計算時間
____________________________________________________________________________________
1500 40 40% 0.1406s
5000 73 73% 0.2505s
10000 88 88% 0.4197s
50000 100 100% 1.6856s
____________________________________________________________________________________
4 計算結果分析
由表1和表2可見,混合演算法全局尋優能力隨M的增加而增大,當M達到某一足夠大的數值Mu後,搜索到全局最優的概率可以達到100%。
從理論上說,Mu趨向無窮大時,才能使混沌變數遍歷所有狀態,才能真正以概率1搜索到最優點。但是,本文混沌運動M次的作用是幫助BFGS方法跳出局部最優點,達到比當前局部最優函數值更小的另一局部最優附近的某一點處,並不是要混沌變數遍歷所有狀態。由混沌運動遍歷特性可知,對於某一具體問題,Mu達到某一具體有限數值時,混沌變數的遍歷性可以得到較好模擬,這一點是可以滿足的,實際算例也證實了這一點。
由於函數性態、復雜性不同,對於不同函數,如這里的測試函數、,數值Mu的大小是有差別的。對於同一函數,搜索區間增大,在相同混沌運動次數下,即使始點相同,總體而言會降低其搜索到全局最優的概率,要保證演算法仍然以概率1收斂到全局最優,必然引起Mu 增大。跟蹤計算中間結果證實,當M足夠大時,混合演算法的確具有跳出局部最優點,繼續向全局最優進行搜索的能力;並且混合演算法的計算時間主要花費在為使混合演算法具有全局搜索能力而進行混沌搜索上。
5 結語
利用混沌變數的運動特點進行優化,具有非常強的跳出局部最優解的能力,該方法與BFGS方法結合使用,在可以接受的計算量下能夠計算得到問題的最優解。實際上,混沌優化可以和一般的下降類演算法結合使用,並非局限於本文採用的BFGS方法。採用的Logistic映射產生混沌變數序列,只是產生混沌變數的有效方式之一。
混沌運動與隨機運動是不同的。混沌是確定性系統中由於內稟隨機性而產生的一種復雜的、貌似無規的運動。混沌並不是無序和紊亂,更像是沒有周期的秩序。與隨機運動相比較,混沌運動可以在各態歷經的假設下,應用統計的數字特徵來描述。並且,混沌運動不重復地經過同一狀態,採用混沌變數進行優化比採用隨機變數進行優化具有優勢。
混沌優化與下降類方法結合使用是有潛力的一種全局優化途徑,是求解具有變數界約束優化問題的可靠方法。如何進一步提高搜索效率,以及如何把混沌優化有效應用於復雜約束優化問題是值得進一步研究的課題。
本文演算法全局收斂性的嚴格數學證明正在進行之中。
參考文獻
[1]胡山鷹,陳丙珍,何小榮,沈靜珠.非線性規劃問題全局優化的模擬退火法[J].清華大學學報,37(6),1997,5-9.
[2]C A Floudas, A Aggarwal, A R Ciric. Global optimum search for nonconvex NLP and MINLP problems[J]. Comput Chem Engng. 1989, 13(10), 1117~1132.
[3]康立山,謝雲,尤矢勇等.非數值並行演算法(第一冊)――模擬退火演算法[M].北京:科學出版社,1998.
[4]劉勇,康立山,陳琉屏.非數值並行演算法(第二冊)――遺傳演算法[M].北京:科學出版社,1998.
[5]李兵,蔣慰孫.混沌優化方法及其應用[J].控制理論與應用,14(4),1997,613-615.
[6]張彤,王宏偉,王子才.變尺度混沌優化方法及其應用[J].控制與決策,14(3),1999,285-287.
[7]席少霖.非線性最優化方法[M].北京:高等教育出版社,1992.
[8]席少霖,趙鳳志.最優化計算方法[M].上海:上海科學技術出版社,1983.
[9]Press W H, Tenkolsky S A, Vetterling W T, Flannery B P.Numerical Recipes in C, The Art of Scientific Computing[M]. Second edition, Cambridge University Press, 1992.
[10]J C Ports.The development and evaluation of an improved genetic algorithm based on migration and artificial selection[J].IEEE Trans. Syst. Man and Cybern..1994, 24(1),73-85.
A Hybrid Approach for Nonlinear Optimization
Abstract:Combined BFGS method with chaos optimization method, a hybrid approach was proposed to solve nonlinear optimization problems with boundary restraints of variables. The hybrid method is an effective approach to solve nonconvex optimization problems, as it given both attentions to the inherent virtue to locate global optimum of chaos optimization method and the advantage of high convergence speed of BFGS method. Numerical examples illustrate that the present method possesses both good capability to search global optima and far higher convergence speed than that of chaos optimization method.
㈡ 多目標優化演算法中用到的測試函數DTLZ2,具體數學表達式是什麼!!!3ks
如圖。………。…………....
㈢ 做網站優化你知道百度的演算法都有什麼嗎
網路綠蘿演算法:我一直不相信網路綠蘿演算法竟然可以算出來你的鏈接是否購買的,但是實際網路卻做到了,其中主要原理還是根據一個網站對另一個網站的鏈接判斷,是否有反向鏈接、鏈接個數來進行判斷。
網路石榴演算法:石榴演算法主要打擊的對象為低質量頁面,其中網路蜘蛛主要是根據網站html代碼來抓取的,並且搜索引擎根據文章的標簽(包含排版)、重復讀來進行判斷網站的質量。
網路星火計劃:星火計劃的原計劃是為了打擊抄襲者,其星火計劃的原理非常簡單了,也就是判斷重復讀來決定網站是否抄襲,同時網路蜘蛛也肯定了自己的抓取程序,目前正在往每一個網站時刻爬取靠攏。
網路驚雷演算法:網路驚雷演算法嚴厲打擊通過刷點擊,提升網站搜索排序的作弊行為;以此保證搜索用戶體驗,促進搜索內容生態良性發展。
網路冰桶演算法:網路移動搜索將針對低質站點及頁面進行一系列調整,我們稱之為冰桶演算法。影響范圍:強行彈窗app下載、用戶登錄、大面積廣告等影響用戶正常瀏覽體驗的頁面,尤其以必須下載app才能正常使用的站點為代表。從整個移動互聯網生態環境看,越來越多的網站進行此類強推,這已經嚴重影響了正常用戶的瀏覽體驗。
網路藍天演算法:藍天演算法,是網路搜索引擎針對新聞源站點售賣軟文、目錄等嚴重違反新聞源規則,並影響用戶搜索體驗行為,於2016年11月正式啟用的一種搜索引擎演算法規則,其目的是嚴厲打擊新聞源售賣軟文、目錄行為,還用戶一片搜索藍天。
網路天網演算法:天網演算法主要是針對網頁搜索發現部分站點存在盜取用戶隱私的行為進行打擊。主要表現為網頁嵌惡意代碼(多為JS代碼),用於盜取網民的QQ號、手機號。
網路颶風演算法:網路搜索於近日推出颶風演算法,旨在嚴厲打擊以惡劣採集為內容主要來源的網站,同時網路搜索將從索引庫中徹底清除惡劣採集鏈接,給優質原創內容提供更多展示機會,促進搜索生態良性發展。
颶風演算法會例行產出懲罰數據,同時會根據情況隨時調整迭代,體現了網路搜索對惡劣採集的零容忍。優質原創站點如發現站點索引量大幅減少且流量大幅下滑現象,可在反饋中心進行反饋。
網路清風演算法:網路搜索將於9月底推出清風演算法,旨在嚴懲網站通過網頁標題作弊,欺騙用戶並獲得點擊的行為;從而保證搜索用戶體驗,促進搜索生態良性發展。
㈣ 高層建築結構優化演算法有哪幾種
高層建築結構優化演算法:
①優化准則法一從直觀的力學原理出發,選定使結構達到最優的准則,然後根據這些准則選取適當的迭代格式,尋求結構的最優解。
②數學規劃法一從解極值問題的數學原理出發,運用數學規劃方法求得一系列設計參數的最優解。
結構優化設計:
在給定約束條件下,按某種目標(如重量最輕、成本最低、剛度最大等)求出最好的設計方案,曾稱為結構最佳設計或結構最優設計,相對於「結構分析」而言,又稱「結構綜合」;如以結構的重量最小為目標,則稱為最小重量設計。
㈤ 求解原始問題和對偶問題常用的優化演算法有哪些
1. 支持向量機的目的是什麼?
對於用於分類的支持向量機來說,給定一個包含正例和反例(正樣本點和負樣本點)的樣本集合,支持向量機的目的是尋找一個超平面來對樣本進行分割,把樣本中的正例和反例用超平面分開,但是不是簡單地分看,其原則是使正例和反例之間的間隔最大。
超平面是什麼呢?簡單地說,超平面就是平面中的直線在高維空間中的推廣。那麼,對於三維空間,超平面就是平面了。對於更高維的空間,我們只能用公式來表達,而缺少直觀的圖形了。總之,在n維空間中的超平面是n-1維的。
超平面的公式為。公式中的w為可以調整的系數向量,b為bias。注意我們的表達習慣,所有的向量都是列向量,所以在第一項的內積中向量w需要進行轉置。
現在考慮樣本集合{xi,di},xi是輸入的特徵,di是樣本對應的分類。現在規定當樣本xi屬於第一類時,di為1,當xi屬於第二類時,di為-1。
那麼,線性可分的意思就是一個超平面可以把兩類樣本完全地分割開來。用公式表達就是:
你現在可能會問,那麼如果不是線性可分的情況應該怎麼辦呢?事實是這些會在後面處理到。在這里我們首先討論線性可分的情況,然後將其拓展到線性不可分的情況.
現在假設對於線性可分的樣本集,我們有了一個分割超平面,現在我們想通過調整w0和b0讓它分割的正樣本和負樣本保持最大的間隔,這樣我們就獲得了最優的超平面。實際上在操作過程中,我們最大化的是離超平面最近的點到超平面的距離。也就是說,我們要讓超平面盡量遠離最近的點。從圖中可見超平面到正樣本最近點的距離和超平面到負樣本最近點的距離是相等的。這是個巧合么?
假設我們已經找到了一個超平面,它離正樣本最近點的距離大於離負樣本最近點的距離,那麼這個離超平面最近的點就是負樣本中的最近點。而考慮到我們的目標,我們還會調整超平面的位置使它還可以增大一些,即使這樣會犧牲離正樣本最近點的距離。所以調整到最後的結果肯定是超平面離兩側最近點的距離是等距的。
為了更形象地表現正負樣本的間隔,我們可以在分割超平面的兩側再定義兩個超平面H1和H2(如圖中虛線所示),這兩個超平面分別通過正樣本和負樣本中離分割超平面最近的樣本點(圖中加了外圈)。從以上分析可以知道,超平面H1和H2離分割超平面是等距的。
我們定義超平面H1和H2上面的點叫做支持向量。正負樣本的間隔可以定義為超平面H1和H2之間的間隔,它是分割超平面距最近正樣本點距離和最近負樣本點距離之和。
從圖中可以看出,支持向量對於分割超平面的位置是起到關鍵作用的。在優化分割超平面位置之後,支持向量也顯露出來,而支持向量之後的樣本點則對分類並不關鍵。為什麼這樣說呢?因為即使把支持向量以外的樣本點全部刪除,再找到最優的分割超平面,這個超平面的位置跟原先的分割超平面的位置也是一樣的。總結起來就是:
支持向量包含著重構分割超平面所需要的全部信息!
2. 樣本點到超平面距離的表示
如何求一點到超平面的距離呢?
現在我們來看看系數向量w0是什麼含義?回憶一下,w0實際上是超平面的法向量!
那麼,對於任意一個樣本點x,它可以表示為:
其中xp是x在超平面上的投影,r是x到超平面的幾何距離(幾何間隔)。
設 ,
現在由定義有g(xp)為0,則有。
現在我們開看,g(x)實際上度量了樣本點x到超平面的距離,在||w0||恆定的情況下,g(x)絕對值的大小反映了幾何間隔r的大小。我們給g(x)起個名字叫做函數間隔。注意幾何間隔r和函數間隔g(x)都是有正負號的,代表著處於超平面的不同側。
3. 最大化間隔
我們已經知道了函數間隔和幾何間隔的表示,現在回到正題,我們需要最大化支持向量到分割超平面的距離,當然在最開始我們不知道哪些向量是支持向量。
我們的目的是最大化支持向量到分割超平面的幾何間隔r,而不是最大化函數間隔g(x),為什麼呢?因為超平面方程的系數可以同比例增大或者減小,而不改變超平面本身。所以||w0||是不固定的,這就會影響函數間隔g(x)的大小。
所以我們需要最大化的是幾何間隔r,這等價於我們固定||w0||,然後最大化函數間隔g(x)。但是實際上我們不會這么做,通常的處理方法是固定函數間隔g(x)的絕對值為1,然後最小化||w0||。也就是說我們把支持向量到分割超平面的函數間隔g(x)的絕對值設定為1,然後最小化||w0||。
4. 正式的表述
現在我們可以正式地表述這個問題了。我們需要最小化||w0||,也就是最小化超平面權重向量w0的歐幾里得范數。但是有沒有限定條件呢?還記得上一節最後一句話么?
「也就是說我們把支持向量到分割超平面的函數間隔g(x)設定為1,然後最小化||w0||」
所以最小化||w0||是有限定條件的,如何表述限制條件呢?我們把支持向量對應的g(x)定為+1或者-1(取決於支持向量處於分割超平面的哪一側,也就是說是正樣本還是負樣本),也就表明了對於所有的正樣本點來說,g(x)是>=+1的,而對於負樣本來說,g(x)是<=-1的。
回想g(x)的定義:
,
我們可以把限制條件寫下來:
現在我們可以把上面的問題寫的更簡練:
目標函數:
限制:
1/2是為了以後計算方便所加的,N是樣本點的個數。
現在我們的第一個任務結束了,我們把要尋找最優的分割超平面的問題轉化為帶有一系列不等式約束的優化問題。這個最優化問題被稱作原問題。我們不會直接解它,而是把它轉化為對偶問題進行解決。至於如何將其轉化為對偶問題,這是以後幾節的內容。
等式約束極小的最優性條件
對支持向量機的求解都是將上節說的原問題轉化為對偶問題進行求解的,這些內容都是最優化課程中的內容。
回憶上節的內容,我們的目標是尋找函數在若干約束條件下的最小值。在上節的原問題中,約束條件是包含不等式的,本節先考慮簡單的問題,即考慮只包含等式約束的最優化問題:
(1)
其中f(x)被稱作目標函數,而下面是一系列的等式約束。回想一下,當沒有任何約束存在的時候,應該怎樣尋找最優點呢?事實上x*是最優點的必要條件是:
而如果函數f(x)是凸函數的話,這個條件也是充分條件。
插入一個說明,如果函數f(x)是一個實值函數,x是一個n維向量,那麼f(x)對向量x的導數被定義為:
回到目前的問題,當我們尋找約束存在時的最優點的時候,約束的存在雖然減小了需要搜尋的范圍,但是卻使問題變得更加復雜。為了使問題變得易於處理,我們的方法是把目標函數和約束全部融入一個新的函數,即拉格朗日函數,再通過這個函數來尋找最優點。
為了形象化地分析這個問題,我們考慮目標函數是三變數的函數並且只有一個約束的情況:
(2)
從幾何上來看,上面的問題(2)就是從曲面上來尋找函數的最小值。假設問題(2)的最優解是。我們現在做曲面Ω上任一條通過點x的光滑曲線l:(由於曲線l是在曲面Ω上的,所以自然有)。
令最優點對應的t為t*。因為x*是曲面Ω上的最優點,所以x*也是曲線l上的最優點,所以t*是一元函數的最優點,所以在這一點它的導數是0。通過鏈式法則我們得到:
這個式子說明了在x*這一點,函數的梯度向量 和曲線l在x*處的切線是垂直的。由於曲線l是任意的,所以梯度向量和曲面Ω是垂直的。
回憶高等數學的結論,的方向就是曲面Ω的法線方向,所以和必然在同一直線的方向上,所以必定存在一個常數μ*,有。
我們可以把它寫成更加精煉的形式。如果我們構造二元函數,上面的結論就可以表達為必定存在著常數μ*,使。
我們把構造的函數稱作拉格朗日函數,而其中的μ稱作拉格朗日乘子。
關於只有等式約束的拉格朗日函數的引入,也可以參考維基網路中的兩個變數函數的例子。
以上是一個特殊情形的分析,並且只包含了一個約束。那麼包含等式約束的一般情況,也就是問題(1)來說,我們同樣可以構造拉格朗日函數,不過由於包括多個等式約束,表達稍微不同:
。
也就是說,每一個等式約束都對應著一個拉格朗日乘子。那麼x*是最優點的必要條件就是,存在相應的拉格朗日乘子μ*,使得以下兩個式子成立:
(實際上就是原問題(1)的約束條件換了種寫法)
這兩個式子就是最優點的必要條件,當然如果函數是凸函數的話,這兩個式子也是充分條件。
現在我們的目標達到了,也就是把目標函數和一系列的等值約束融合到了一個函數(拉格朗日函數)裡面,這樣只需要解(3)和(4)這兩個式子就可以找到最優點,其優點是不言而喻的。而在下一節中我們將會討論包含不等式約束的最優化問題。
尋找最優值的下界
我們首先要引入包含不等式約束的優化問題,標准形式如下:
(1)
f(x)是目標函數,而後面分別是一系列的不等式約束和等式約束。
我們首先明確幾個概念:
可行點(可行解):所有滿足約束的點x。
可行域:所有可行點組成的點集,記為R。正式寫出來就是:
最優點(最優解):滿足約束(也就是處於可行域之內)並且使目標函數達到最小的點,記為x*。
最優值:如果找到了x*,p* = f(x*) 就是最優值。
明確了這些概念以後我們就接著說下面的內容了。
與上節所說的只包含等式約束的情況類似,我們定義拉格朗日函數如下:
我們來看看,這與上節的拉格朗日函數有什麼不同?多了一系列的不等式約束對應的項,所以也多了一系列的拉格朗日乘子。在這里需要強調的是,所有的λi必須是大於等於0的(也即是不等式約束對應的乘子要求大於等於0,我們記為λ≥0,意思是每個都λi≥0)。至於為什麼要這樣要求,後面自然可以看出來。
接下來我們定義一個重要的函數,我們定義拉格郎日對偶函數(the Lagrange al function)如下:
(2)
所以拉格朗日對偶函數就是把看成x的函數所找到的最小值。找到這個最小值有什麼意義呢?
我們先把結論寫下來,這個結論十分重要,是本節論述的目的:
對偶函數產生了原問題(1)最優值p*的一個下界,也就是說,對於任意的λ≥0和任意的μ來說,有:
(3)
那麼如何證明(3)呢?
這個證明步驟十分簡潔。假設x*是原問題(1)中的最優解,也就是f(x*) = p*。
最後兩行的推導是考慮到x*是在可行域R內的,所以肯定有,當然前提是λ≥0,這也就是為什麼在一開始要做這個規定的原因了。
我們如何理解這個不等式(3)呢?下面給出兩個直觀的解釋:
解釋一:線性逼近的解釋
我們首先重寫問題(1),就是把問題(1)換個更加緊湊的方式來表達,首先我們定義示性函數:
同樣我們也可以定義另外一個示性函數:
有了這兩個示性函數的幫助,現在我們可以把問題(1)重新寫成一個沒有約束的形式:
(4)
我們來看看這個優化問題(4)和問題(1)是等價的么?我們可以把(4)的後面兩大項看做是對違反約束條件的x的懲罰函數。起的作用是對違反不等式約束的x進行「無限的」懲罰,也就一旦,懲罰就等於無窮大。而起的作用是對違反等式約束的x進行懲罰,一旦,懲罰就為無窮大。這樣對(4)中目標函數的優化跟對(1)中目標函數在約束條件下的優化就是同一回事,是不是?也就是說,(1)和(4)這兩個問題是等價的問題,但是在(4)中約束被融合到目標函數中來了。
現在我們再回頭看看(2),也就是拉格朗日對偶函數,它也是個優化問題,我們對比它所優化的函數和(4)中所優化的函數,把它們重寫在一起:
(2)中的目標函數
(4)中的目標函數
可見在問題(2)和問題(4)中,我們優化的目標函數區別在於懲罰項不同,(4)中的懲罰項是無限的,就是說一旦違反約束,就施加無窮大的懲罰;而在(2)中我們的懲罰項是線性的,就是說隨著gi(x)和hi(x)的不同,懲罰項是線性變化的。所以(2)和(4)中需要優化的目標函數有很大的不同,用(2)來逼近(4)是很不準確的。但是我們可以看出,對於任意的u,任意的λ≥0和任意的μ來說都有:
(我們把λ限制為大於等於0了)
所以在任意點,(2)中的目標函數的值都是小於(4)中的目標函數的值,所以(2)中找到的最優值肯定是小於(4)中找到的最優值的。再結合前面說的(1)和(4)是等價的問題,所以不等式(3)是成立的。
解釋二:交換max和min的次序
我們首先可以看出:
為什麼會有這個結果呢?當x滿足約束的時候,也就是對所有的i來說有並且,如果我們想通過調整λ和μ讓變大怎麼辦呢?只有讓λ全部為0(注意λ只能大於等於0),這樣就消去了小於0的項,至於,無論μ怎麼變都是沒有影響的。所以當x屬於可行域的時候上式的結果是f(x)。如果x違反了約束呢?在做sup運算的時候只需要對滿足和的項對應的乘子定為+∞,而把其他的項對應的乘子設為0,就可以讓整個式子的結果變為無窮大。
所以我們可以看出來,在問題(1)中的帶約束的優化問題和直接優化是一回事,也就是說:
現在我們把inf和sup兩個運算符調換次序,顯然有:
我們重寫(2)式:
(2)
可以看出結論了,也就是λ≥0時(3)式成立:
(3)
好了,費了半天的勁我們說明了一個問題,就是不等式(3)是怎麼來的。
總結一下,不等式(3)用文字敘述就是:
如果我們把拉格朗日函數看做是x的函數,然後取下確界(注意:是在整個定義域里取下確界,而不是僅僅在可行域里取值,也就是說取下確界時對x是沒有約束的),那麼得到的結果就是原優化問題(1)的最優值的一個下界。
至於我們得到這個結果有什麼用,下節再說。
對偶問題
回憶上一節,對如下的原問題:
(1)
我們定義了拉格朗日對偶函數:
然後我們證明了:,其中p*是原問題的最優值。
也就是說我們找到了原問題最優值的一個下界。既然我們找到了一個下界,顯然我們要找到它最好的下界。什麼是最好的下界的?顯然就是所有下界當中最大的那一個。所以我們要把最大化,當然我們還要記得我們需要限制。我們把要優化的函數和約束條件正式寫下來就是:
(2)
與原問題(1)相對應,我們把上面的問題(2)稱作拉格朗日對偶問題(Lagrange al problem)。顯然,對偶問題的最優值d*就是我們可以獲得的p*的最優下界,也就是所有下界中離p*最近的一個,它們的關系是:
(3)
我們把這個不等式叫做弱對偶性質(Weak Duality)。
順其自然,我們可以引出一個重要的概念,對偶間隙,其定義為,用文字敘述就是原問題的最優值與通過拉個郎日對偶函數獲得的其最好(最大)的下界之差。由不等式(3)可以看出,對偶間隙肯定是大於等於0的。
那麼有沒有可能在某種情況下,對偶間隙消失了呢?也就是說對偶問題的最優值與原問題的最優值相等了呢?
我們將要敘述一下Slater條件:
Slater條件:
存在x滿足:
Slater條件即是說存在x,使不等式約束中的「小於等於號」要嚴格取到「小於號」。
可以證明,對於凸優化問題(關於凸優化問題,請參考維基網路),如果Slater條件滿足了,則:
這種情況稱為強對偶性質(Strong Duality)。
下面的問題是,如果對偶間隙消失了,會發生什麼有趣的現象呢?
如果對偶間隙消失了,也就是說,如果對偶問題存在著最優點λ*,μ*並且使其對應的最優值等於p*,這時會發生什麼情況呢?還記得上一節我們證明的過程么:
(4)
在對偶間隙消失的情況下,中間所有的不等號都要變成等號:
(5)
注意,(5)中的λ和μ都加了星號,表示它們是對偶問題的最優點。(5)中有兩個重要的等號,已經加了標記。
我們能得出什麼結論?
1 .我們先來看等號1:
它說明了原問題的最優點x*是使取得最小值的點。
2. 我們再來看等號2:
它說明了:
由於我們限制了每一個λi≥0,所以上式中每一項都是非正的。這樣我們又可以得出結論:
(6)
等式(6)被稱作是互補性條件,我們可以把它換種寫法:
或者寫成它的等價形式(逆否命題):
也就是說,只要一個不為0,另一個就必為0!
互補性條件有著重要的意義。它說明了當時,x*是處於可行域的內部的,這時不等式約束並不起作用,此時;而的點肯定是可行域邊界的點()。也就是說只有積極約束才有不為0的對偶變數。而這在支持向量機中有著重要的意義。回想在第一節我們最後的結論,支持向量機尋找最大間隔超平面可以歸結為一個優化問題:
目標函數:
限制:
那麼哪些不等式約束對應著不為0的對偶變數呢?顯然,只有當時,這個約束對應的對偶變數才可能不為0,而意味著什麼?意味著這個約束對應的樣本點xi是支持向量!也就是說:
只有支持向量才對應不為0的拉格朗日乘子!
㈥ 為什麼說Transformer的注意力機制是相對廉價的注意力機制相對更對於RNN系列及CNN系列演算法有何優勢
QA形式對自然語言處理中注意力機制(Attention)進行總結,並對Transformer進行深入解析。
二、Transformer(Attention Is All You Need)詳解
1、Transformer的整體架構是怎樣的?由哪些部分組成?
2、Transformer Encoder 與 Transformer Decoder 有哪些不同?
3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?
4、multi-head self-attention mechanism具體的計算過程是怎樣的?
5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?
一、Attention機制剖析
1、為什麼要引入Attention機制?
根據通用近似定理,前饋網路和循環網路都有很強的能力。但為什麼還要引入注意力機制呢?
計算能力的限制:當要記住很多「信息「,模型就要變得更復雜,然而目前計算能力依然是限制神經網路發展的瓶頸。
優化演算法的限制:雖然局部連接、權重共享以及pooling等優化操作可以讓神經網路變得簡單一些,有效緩解模型復雜度和表達能力之間的矛盾;但是,如循環神經網路中的長距離以來問題,信息「記憶」能力並不高。
可以藉助人腦處理信息過載的方式,例如Attention機制可以提高神經網路處理信息的能力。
2、Attention機制有哪些?(怎麼分類?)
當用神經網路來處理大量的輸入信息時,也可以借鑒人腦的注意力機制,只 選擇一些關鍵的信息輸入進行處理,來提高神經網路的效率。按照認知神經學中的注意力,可以總體上分為兩類:
聚焦式(focus)注意力:自上而下的有意識的注意力,主動注意——是指有預定目的、依賴任務的、主動有意識地聚焦於某一對象的注意力;
顯著性(saliency-based)注意力:自下而上的有意識的注意力,被動注意——基於顯著性的注意力是由外界刺激驅動的注意,不需要主動干預,也和任務無關;可以將max-pooling和門控(gating)機制來近似地看作是自下而上的基於顯著性的注意力機制。
在人工神經網路中,注意力機制一般就特指聚焦式注意力。
3、Attention機制的計算流程是怎樣的?
Attention機制的實質其實就是一個定址(addressing)的過程,如上圖所示:給定一個和任務相關的查詢Query向量q,通過計算與Key的注意力分布並附加在Value上,從而計算Attention Value,這個過程實際上是Attention機制緩解神經網路模型復雜度的體現:不需要將所有的N個輸入信息都輸入到神經網路進行計算,只需要從X中選擇一些和任務相關的信息輸入給神經網路。
step1-信息輸入:用X= [x1, · · · , xN ]表示N 個輸入信息;
step2-注意力分布計算:令Key=Value=X,則可以給出注意力分布
我們將稱之為注意力分布(概率分布),為注意力打分機制,有幾種打分機制:
step3-信息加權平均:注意力分布可以解釋為在上下文查詢q時,第i個信息受關注的程度,採用一種「軟性」的信息選擇機制對輸入信息X進行編碼為:
這種編碼方式為軟性注意力機制(soft Attention),軟性注意力機制有兩種:普通模式(Key=Value=X)和鍵值對模式(Key!=Value)。
4、Attention機制的變種有哪些?
與普通的Attention機制(上圖左)相比,Attention機制有哪些變種呢?
變種1-硬性注意力:之前提到的注意力是軟性注意力,其選擇的信息是所有輸入信息在注意力 分布下的期望。還有一種注意力是只關注到某一個位置上的信息,叫做硬性注意力(hard attention)。硬性注意力有兩種實現方式:(1)一種是選取最高概率的輸入信息;(2)另一種硬性注意力可以通過在注意力分布式上隨機采樣的方式實現。硬性注意力模型的缺點:
變種2-鍵值對注意力:即上圖右邊的鍵值對模式,此時Key!=Value,注意力函數變為:
變種3-多頭注意力:多頭注意力(multi-head attention)是利用多個查詢Q = [q1, · · · , qM],來平行地計算從輸入信息中選取多個信息。每個注意力關注輸入信息的不同部分,然後再進行拼接:
5、一種強大的Attention機制:為什麼自注意力模型(self-Attention model)在長距離序列中如此強大?
(1)卷積或循環神經網路難道不能處理長距離序列嗎?
當使用神經網路來處理一個變長的向量序列時,我們通常可以使用卷積網路或循環網路進行編碼來得到一個相同長度的輸出向量序列,如圖所示:
從上圖可以看出,無論卷積還是循環神經網路其實都是對變長序列的一種「局部編碼」:卷積神經網路顯然是基於N-gram的局部編碼;而對於循環神經網路,由於梯度消失等問題也只能建立短距離依賴。
(2)要解決這種短距離依賴的「局部編碼」問題,從而對輸入序列建立長距離依賴關系,有哪些辦法呢?
由上圖可以看出,全連接網路雖然是一種非常直接的建模遠距離依賴的模型, 但是無法處理變長的輸入序列。不同的輸入長度,其連接權重的大小也是不同的。
這時我們就可以利用注意力機制來「動態」地生成不同連接的權重,這就是自注意力模型(self-attention model)。由於自注意力模型的權重是動態生成的,因此可以處理變長的信息序列。
總體來說,為什麼自注意力模型(self-Attention model)如此強大:利用注意力機制來「動態」地生成不同連接的權重,從而處理變長的信息序列。
(3)自注意力模型(self-Attention model)具體的計算流程是怎樣的呢?
同樣,給出信息輸入:用X = [x1, · · · , xN ]表示N 個輸入信息;通過線性變換得到為查詢向量序列,鍵向量序列和值向量序列:
上面的公式可以看出,self-Attention中的Q是對自身(self)輸入的變換,而在傳統的Attention中,Q來自於外部。
注意力計算公式為:
自注意力模型(self-Attention model)中,通常使用縮放點積來作為注意力打分函數,輸出向量序列可以寫為:
二、Transformer(Attention Is All You Need)詳解
從Transformer這篇論文的題目可以看出,Transformer的核心就是Attention,這也就是為什麼本文會在剖析玩Attention機制之後會引出Transformer,如果對上面的Attention機制特別是自注意力模型(self-Attention model)理解後,Transformer就很容易理解了。
1、Transformer的整體架構是怎樣的?由哪些部分組成?
Transformer其實這就是一個Seq2Seq模型,左邊一個encoder把輸入讀進去,右邊一個decoder得到輸出:
Transformer=Transformer Encoder+Transformer Decoder
(1)Transformer Encoder(N=6層,每層包括2個sub-layers):
sub-layer-1:multi-head self-attention mechanism,用來進行self-attention。
sub-layer-2:Position-wise Feed-forward Networks,簡單的全連接網路,對每個position的向量分別進行相同的操作,包括兩個線性變換和一個ReLU激活輸出(輸入輸出層的維度都為512,中間層為2048):
每個sub-layer都使用了殘差網路:
(2)Transformer Decoder(N=6層,每層包括3個sub-layers):
sub-layer-1:Masked multi-head self-attention mechanism,用來進行self-attention,與Encoder不同:由於是序列生成過程,所以在時刻 i 的時候,大於 i 的時刻都沒有結果,只有小於 i 的時刻有結果,因此需要做Mask。
sub-layer-2:Position-wise Feed-forward Networks,同Encoder。
sub-layer-3:Encoder-Decoder attention計算。
2、Transformer Encoder 與 Transformer Decoder 有哪些不同?
(1)multi-head self-attention mechanism不同,Encoder中不需要使用Masked,而Decoder中需要使用Masked;
(2)Decoder中多了一層Encoder-Decoder attention,這與 self-attention mechanism不同。
3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?
它們都是用了 multi-head計算,不過Encoder-Decoder attention採用傳統的attention機制,其中的Query是self-attention mechanism已經計算出的上一時間i處的編碼值,Key和Value都是Encoder的輸出,這與self-attention mechanism不同。代碼中具體體現:
4、multi-head self-attention mechanism具體的計算過程是怎樣的?
Transformer中的Attention機制由Scaled Dot-Proct Attention和Multi-Head Attention組成,上圖給出了整體流程。下面具體介紹各個環節:
Expand:實際上是經過線性變換,生成Q、K、V三個向量;
Split heads: 進行分頭操作,在原文中將原來每個位置512維度分成8個head,每個head維度變為64;
Self Attention:對每個head進行Self Attention,具體過程和第一部分介紹的一致;
Concat heads:對進行完Self Attention每個head進行拼接;
上述過程公式為:
5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?
GPT中訓練的是單向語言模型,其實就是直接應用Transformer Decoder;
Bert中訓練的是雙向語言模型,應用了Transformer Encoder部分,不過在Encoder基礎上還做了Masked操作;
BERT Transformer 使用雙向self-attention,而GPT Transformer 使用受限制的self-attention,其中每個token只能處理其左側的上下文。雙向 Transformer 通常被稱為「Transformer encoder」,而左側上下文被稱為「Transformer decoder」,decoder是不能獲要預測的信息的。
㈦ pso的優化求解
PSO演算法被廣泛應用於各種優化問題,並且已經成為優化領域中的一個有效演算法。除了普通函數優化之外,還包括如下方面。
混合整數非線性規劃
很多求解整數規劃的演算法是在採用實數域的演算法進行優化後,再將結果取整作為整數規劃的近似解。這種做法常常導致不滿足約束或遠離最優解。譚瑛提出一種在整數空間中直接進行進化計算的PSO演算法。劉釗針對混合整數非線性規劃中可行解產生代價較高的問題,建立了保證都是合法解的備用微粒庫,並提出微粒遷移策略,幫助微粒跳出局部最優。
雜訊和動態環境
動態系統的狀態會經常改變,甚至可能會連續變化。許多實際系統都會涉及到動態環境。例如,由於顧客的優先順序、意外的設備維護等導致的變化,調度系統中大多數計算時間都被用來進行重新調度。在實際應用中,這些系統狀態的變化就需要經常進行重新優化。
最初使用微粒群演算法跟蹤動態系統的工作由Carlisle提出,通過周期性地重置所有微粒的記憶來跟蹤動態系統。Eberhart也採用類似想法;之後Hu提出一種自適應PSO演算法,能夠自動跟蹤動態系統中的不同變化,並在拋物線benchmark函數上對不同的環境檢測和響應技術進行了實驗,其中使用的檢測方法是監控種群中最優微粒的行為。後來Carlisle使用搜索空間中的一個隨機點來確定環境是否發生變化,但是這需要集中控制,與PSO演算法的分布式處理模型不符。為此Cui提出TDPSO演算法,讓最優歷史位置的適應值隨著時間減小,從而不再需要集中控制。Blackwell在微粒的更新公式中添加了一項懲罰項,來保持微粒處於一個擴展的群中,以應對快速變化的動態環境,該方法中不需要檢測最優點是否發生變化。
Parsopoulos等的試驗表明,基本PSO演算法就可以有效而穩定地在雜訊環境中工作,且在很多情況下,雜訊的存在還可以幫助PSO演算法避免陷入局部最優。Parsopoulos還通過試驗研究了UPSO演算法在動態環境中的性能。Pugh提出一種抗雜訊的PSO演算法。Pan將假設檢驗和最優計算預算分配(OCBA)技術引入微粒群演算法,提出PSOOHT演算法,來解決雜訊環境下的函數優化問題。
上述工作的研究對象都是簡單的動態系統,所採用的實驗函數是簡單的單模函數,並且所涉及的變化都是簡單環境下的均勻變化(即固定步長)。而事實上,實際的動態系統經常是非線性的,並在復雜的多模搜索空間中非均勻變化。Li採用四個PSO模型,對一系列不同的動態環境進行了對比研究。
上述方法均是針對僅跟蹤單個最優點的情況,
㈧ 演算法效率與分析
演算法效率與分析
數據結構作為程序設計的基礎,其對演算法效率的影響必然是不可忽視的。本文就如何合理選擇數據結構來優化演算法這一問題,對選擇數據結構的原則和方法進行了一些探討。首先對數據邏輯結構的重要性進行了分析,提出了選擇邏輯結構的兩個基本原則;接著又比較了順序和鏈式兩種存儲結構的優點和缺點,並討論了選擇數據存儲結構的方法;最後本文從選擇數據結構的的另一角度出發,進一步探討了如何將多種數據結構進行結合的方法。在討論方法的同時,本文還結合實際,選用了一些較具有代表性的信息學競賽試題舉例進行了分析
【正文】一、引論
「數據結構+演算法=程序」,這就說明程序設計的實質就是對確定的問題選擇一種合適的數據結構,加上設計一種好的演算法。由此可見,數據結構在程序設計中有著十分重要的地位。
數據結構是相互之間存在一種或多種特定關系的數據元素的集合。因為這其中的「關系」,指的是數據元素之間的邏輯關系,因此數據結構又稱為數據的邏輯結構。而相對於邏輯結構這個比較抽象的概念,我們將數據結構在計算機中的表示又稱為數據的存儲結構。
建立問題的數學模型,進而設計問題的演算法,直至編出程序並進行調試通過,這就是我們解決信息學問題的一般步驟。我們要建立問題的數學模型,必須首先找出問題中各對象之間的關系,也就是確定所使用的邏輯結構;同時,設計演算法和程序實現的過程,必須確定如何實現對各個對象的操作,而操作的方法是決定於數據所採用的存儲結構的。因此,數據邏輯結構和存儲結構的好壞,將直接影響到程序的效率。
二、選擇合理的邏輯結構
在程序設計中,邏輯結構的選用就是要分析題目中的數據元素之間的關系,並根據這些特定關系來選用合適的邏輯結構以實現對問題的數學描述,進一步解決問題。邏輯結構實際上是用數學的方法來描述問題中所涉及的操作對象及對象之間的關系,將操作對象抽象為數學元素,將對象之間的復雜關系用數學語言描述出來。
根據數據元素之間關系的不同特性,通常有以下四種基本邏輯結構:集合、線性結構、樹形結構、圖狀(網狀)結構。這四種結構中,除了集合中的數據元素之間只有「同屬於一個集合」的關系外,其它三種結構數據元素之間分別為「一對一」、「一對多」、「多對多」的關系。
因此,在選擇邏輯結構之前,我們應首先把題目中的操作對象和對象之間的關系分析清楚,然後再根據這些關系的特點來合理的選用邏輯結構。尤其是在某些復雜的問題中,數據之間的關系相當復雜,且選用不同邏輯結構都可以解決這一問題,但選用不同邏輯結構實現的演算法效率大不一樣。
對於這一類問題,我們應採用怎樣的標准對邏輯結構進行選擇呢?
下文將探討選擇合理邏輯結構應充分考慮的兩個因素。
一、 充分利用「可直接使用」的信息。
首先,我們這里所講的「信息」,指的是元素與元素之間的關系。
對於待處理的信息,大致可分為「可直接使用」和「不可直接使用」兩類。對於「可直接使用」的信息,我們使用時十分方便,只需直接拿來就可以了。而對於「不可直接使用」的這一類,我們也可以通過某些間接的方式,使之成為可以使用的信息,但其中轉化的過程顯然是比較浪費時間的。
由此可見,我們所需要的是盡量多的「可直接使用」的信息。這樣的信息越多,演算法的效率就會越高。
對於不同的邏輯結構,其包含的信息是不同的,演算法對信息的利用也會出現不同的復雜程度。因此,要使演算法能夠充分利用「可直接使用」的信息,而避免演算法在信息由「不可直接使用」向「可直接使用」的轉化過程中浪費過多的時間,我們必然需要採用一種合理的邏輯結構,使其包含更多「可直接使用」的信息。
〖問題一〗 IOI99的《隱藏的碼字》。
〖問題描述〗
問題中給出了一些碼字和一個文本,要求編程找出文本中包含這些碼字的所有項目,並將找出的項目組成一個最優的「答案」,使得答案中各項目所包含的碼字長度總和最大。每一個項目包括一個碼字,以及該碼字在文本中的一個覆蓋序列(如』abcadc』就是碼字』abac』的一個覆蓋序列),並且覆蓋序列的長度不超過1000。同時,「答案」要求其中每個項目的覆蓋序列互相沒有重疊。
〖問題分析〗
對於此題,一種較容易得出的基本演算法是:對覆蓋序列在文本中的終止位置進行循環,再判斷包含了哪些碼字,找出所有項目,並最後使用動態規劃的方法將項目組成最優的「答案」。
演算法的其它方面我們暫且不做考慮,而先對問題所採用的邏輯結構進行選擇。
如果我們採用線性的邏輯結構(如循環隊列),那麼我們在判斷是否包含某個碼字t時,所用的方法為:初始時用指針p指向終止位置,接著通過p的不斷前移,依次找出碼字t從尾到頭的各個字母。例如碼字為「ABDCAB」,而文本圖1-1,終止位置為最右邊的箭頭符號,每個箭頭代表依次找到的碼字的各個字母。
指針p的移動方向
A B D C A B
C D A C B D C A D C D B A D C C B A D
圖1-1
由於題目規定碼字的覆蓋序列長度不超過1000,所以進行這樣的一次是否包含的判斷,其復雜度為O(1000)。
由於碼字t中相鄰兩字母在文本中的位置,並非只有相鄰(如圖1-1中的』D』和』C』)這一種關系,中間還可能間隔了許多的字母(如圖1-1中』C』和』A』就間隔了2個字母),而線性結構中擁有的信息,僅僅只存在於相鄰的兩元素之間。通過這樣簡單的信息來尋找碼字的某一個字母,其效率顯然不高。
如果我們建立一個有向圖,其中頂點i(即文本的第i位)用52條弧分別連接』a』..』z』,』A』..』Z』這52個字母在i位以前最後出現的位置(如圖1-2的連接方式),我們要尋找碼字中某個字母的前一個字母,就可以直接利用已連接的邊,而不需用枚舉的方法。我們也可以把問題看為:從有向圖的一個頂點出發,尋找一條長度為length(t)-1的路徑,並且路徑中經過的頂點,按照碼字t中的字母有序。
C D A C B D C A D C D B A D C C B A D
圖1-2
通過計算,用圖進行記錄在空間上完全可以承受(記錄1000個點×52條弧×4位元組的長整型=200k左右)。在時間上,由於可以充分利用第i位和第i+1位弧的連接方式變化不大這一點(如圖1-2所示,第i位和第i+1位只有一條弧的指向發生了變化,即第i+1位將其中一條弧指向了第i位),所以要對圖中的弧進行記錄,只需對弧的指向進行整體賦值,並改變其中的某一條弧即可。
因此,我們通過採用圖的邏輯結構,使得尋找字母的效率大大提高,其判斷的復雜度為O(length(t)),最壞為O(100),比原來方法的判斷效率提高了10倍。
(附程序codes.pas)
對於這個例子,雖然用線性的數據結構也可以解決,但由於判斷的特殊性,每次需要的信息並不能從相鄰的元素中找到,而線性結構中只有相鄰元素之間存在關系的這一點,就成為了一個很明顯的缺點。因此,問題一線性結構中的信息,就屬於「不可直接使用」的信息。相對而言,圖的結構就正好滿足了我們的需要,將所有可能產生關系的點都用弧連接起來,使我們可以利用弧的關系,高效地進行判斷尋找的過程。雖然圖的結構更加復雜,但卻將「不可直接使用」的信息,轉化成為了「可直接使用」的信息,演算法效率的提高,自然在情理之中。。
二、 不記錄「無用」信息。
從問題一中我們看到,由於圖結構的信息量大,所以其中的信息基本上都是「可用」的。但是,這並不表示我們就一定要使用圖的結構。在某些情況下,圖結構中的「可用」信息,是有些多餘的。
信息都「可用」自然是好事,但倘若其中「無用」(不需要)的信息太多,就只會增加我們思考分析和處理問題時的復雜程度,反而不利於我們解決問題了。
〖問題二〗 湖南省1997年組隊賽的《乘船問題》
〖問題描述〗
有N個人需要乘船,而每船最多隻能載兩人,且必須同名或同姓。求最少需要多少條船。
〖問題分析〗
看到這道題,很多人都會想到圖的數據結構:將N個人看作無向圖的N個點,凡同名或同姓的人之間都連上邊。
要滿足用船最少的條件,就是需要盡量多的兩人共乘一條船,表現在圖中就是要用最少的邊完成對所有頂點的覆蓋。這就正好對應了圖論的典型問題:求最小邊的覆蓋。所用的演算法為「求任意圖最大匹配」的演算法。
使用「求任意圖最大匹配」的演算法比較復雜(要用到擴展交錯樹,對花的收縮等等),效率也不是很高。因此,我們必須尋找一個更簡單高效的方法。
首先,由於圖中任兩個連通分量都是相對獨立的,也就是說任一條匹配邊的兩頂點,都只屬於同一個連通分量。因此,我們可以對每個連通分量分別進行處理,而不會影響最終的結果。
同時,我們還可以對需要船隻s的下限進行估計:
對於一個包含Pi個頂點的連通分量,其最小覆蓋邊數顯然為[Pi/2]。若圖中共有L個連通分量,則s=∑[Pi/2](1<=i<=L)。
然後,我們通過多次嘗試,可得出一個猜想:
實際需要的覆蓋邊數完全等於我們求出的下限∑[Pi/2](1<=i<=L)。
要用圖的結構對上述猜想進行證明,可參照以下兩步進行:
1. 連通分量中若不存在度為1的點,就必然存在迴路。
2. 從圖中刪去度為1的點及其相鄰的點,或刪去迴路中的任何一邊,連通分量依然連通,即連通分量必然存在非橋邊。
由於圖的方法不是這里的重點,所以具體證明不做詳述。而由採用圖的數據結構得出的演算法為:每次輸出一條非橋的邊,並從圖中將邊的兩頂點刪去。此演算法的時間復雜度為O(n3)。(尋找一條非橋邊的復雜度為O(n2),尋找覆蓋邊操作的復雜度為O(n))
由於受到圖結構的限制,時間復雜度已經無法降低,所以如果我們要繼續對演算法進行優化,只有考慮使用另一種邏輯結構。這里,我想到了使用二叉樹的結構,具體說就是將圖中的連通分量都轉化為二叉樹,用二叉樹來解決問題。
首先,我們以連通分量中任一個頂點作為樹根,然後我們來確定建樹的方法。
1. 找出與根結點i同姓的點j(j不在二叉樹中)作為i的左兒子,再以j為樹根建立子樹。
2. 找出與根結點i同名的點k(k不在二叉樹中)作為i的右兒子,再以k為樹根建立子樹。
如圖2-1-1中的連通分量,我們通過上面的建樹方法,可以使其成為圖2-1-2中的二叉樹的結構(以結點1為根)。(兩點間用實線表示同姓,虛線表示同名)
圖2-1-2
圖2-1-1
接著,我就來證明這棵樹一定包含了連通分量中的所有頂點。
【引理2.1】
若二叉樹T中包含了某個結點p,那麼連通分量中所有與p同姓的點一定都在T中。
證明:
為了論證的方便,我們約定:s表示與p同姓的頂點集合;lc[p,0]表示結點p,lc[p,i](i>0)表示lc[p,i-1]的左兒子,顯然lc[p,i]與p是同姓的。
假設存在某個點q,滿足qs且qT。由於s是有限集合,因而必然存在某個lc[p,k]無左兒子。則我們可以令lc[p,k+1]=q,所以qT,與假設qT相矛盾。
所以假設不成立,原命題得證。
由引理2.1的證明方法,我們同理可證引理2.2。
【引理2.2】
若二叉樹T中包含了某個結點p,那麼連通分量中所有與p同名的點一定都在T中。
有了上面的兩個引理,我們就不難得出下面的定理了。
【定理一】
以連通分量中的任一點p作為根結點的二叉樹,必然能夠包含連通分量中的所有頂點。
證明:
由引理2.1和引理2.2,所有與p同姓或同名的點都一定在二叉樹中,即連通分量中所有與p有邊相連的點都在二叉樹中。由連通分量中任兩點間都存在路徑的特性,該連通分量中的所有點都在二叉樹中。
在證明二叉樹中包含了連通分量的所有頂點後,我們接著就需要證明我們的猜想,也就是下面的定理:
【定理二】包含m個結點的二叉樹Tm,只需要船的數量為boat[m]=[m/2](mN)。
證明:
(i) 當m=1,m=2,m=3時命題顯然成立。
圖2-2-1
圖2-2-2
圖2-2-3
(ii) 假設當m<k(k>3)時命題成立,那麼當m=k時,我們首先從樹中找到一個層次最深的結點,並假設這個結點的父親為p。那麼,此時有且只有以下三種情況(結點中帶有陰影的是p結點):
(1) 如圖2-2-1,p只有一個兒子。此時刪去p和p唯一的兒子,Tk就成為了Tk-2,則boat[k]=boat[k-2]+1=[(k-2)/2]+1=[k/2]。
(2) 如圖2-2-2,p有兩個兒子,並且p是其父親的左兒子。此時可刪去p和p的右兒子,並可將p的左兒子放到p的位置上。同樣地,Tk成為了Tk-2,boat[k]=boat[k-2]+1=[k/2]。
(3) 如圖2-2-3,p有兩個兒子,並且p是其父親的右兒子。此時可刪去p和p的左兒子,並可將p的右兒子放到p的位置上。情況與(2)十分相似,易得此時得boat[k]=boat[k-2]+1=[k/2]。
綜合(1)、(2)、(3),當m=k時,boat[k]=[k/2]。
最後,綜合(i)、(ii),對於一切mN,boat[m]=[m/2]。
由上述證明,我們將問題中數據的圖結構轉化為樹結構後,可以得出求一棵二叉樹的乘船方案的演算法:
proc try(father:integer;var root:integer;var rest:byte);
{輸出root為樹根的子樹的乘船方案,father=0表示root是其父親的左兒子,
father=1表示root是其父親的右兒子,rest表示輸出子樹的乘船方案後,
是否還剩下一個根結點未乘船}
begin
visit[root]:=true; {標記root已訪問}
找到一個與root同姓且未訪問的結點j;
if j<>n+1 then try(0,j,lrest);
找到一個與root同姓且未訪問的結點k;
if k<>n+1 then try(1,k,rrest);
if (lrest=1) xor (rrest=1) then begin {判斷root是否只有一個兒子,情況一}
if lrest=1 then print(lrest,root) else print(rrest,root);
rest:=0;
end
else if (lrest=1) and (rrest=1) then begin {判斷root是否有兩個兒子}
if father=0 then begin
print(rrest,root);root:=j; {情況二}
end
else begin
print(lrest,root);root:=k; {情況三}
end;
rest:=1;
end
else rest:=1;
end;
這只是輸出一棵二叉樹的乘船方案的演算法,要輸出所有人的乘船方案,我們還需再加一層循環,用於尋找各棵二叉樹的根結點,但由於每個點都只會訪問一次,尋找其左右兒子各需進行一次循環,所以演算法的時間復雜度為O(n2)。(附程序boat.pas)
最後,我們對兩種結構得出不同時間復雜度演算法的原因進行分析。其中最關鍵的一點就是因為二叉樹雖然結構相對較簡單,但已經包含了幾乎全部都「有用」的信息。由我們尋找乘船方案的演算法可知,二叉樹中的所有邊不僅都發揮了作用,而且沒有重復的使用,可見信息的利用率也是相當之高的。
既然採用樹結構已經足夠,圖結構中的一些信息就顯然就成為了「無用」的信息。這些多餘的「無用」信息,使我們在分析問題時難於發現規律,也很難找到高效的演算法進行解決。這正如迷宮中的牆一樣,越多越難走。「無用」的信息,只會干擾問題的規律性,使我們更難找出解決問題的方法。
小結
我們對數據的邏輯結構進行選擇,是構造數學模型一大關鍵,而演算法又是用來解決數學模型的。要使演算法效率高,首先必須選好數據的邏輯結構。上面已經提出了選擇邏輯結構的兩個條件(思考方向),總之目的是提高信息的利用效果。利用「可直接使用」的信息,由於中間不需其它操作,利用的效率自然很高;不不記錄「無用」的信息,就會使我們更加專心地研究分析「有用」的信息,對信息的使用也必然會更加優化。
總之,在解決問題的過程中,選擇合理的邏輯結構是相當重要的環
三、 選擇合理的存儲結構
數據的存儲結構,分為順序存儲結構和鏈式存儲結構。順序存儲結構的特點是藉助元素在存儲器中的相對位置來表示數據元素之間的邏輯關系;鏈式存儲結構則是藉助指示元素存儲地址的指針表示數據元素之間的邏輯關系。
因為兩種存儲結構的不同,導致這兩種存儲結構在具體使用時也分別存在著優點和缺點。
這里有一個較簡單的例子:我們需要記錄一個n×n的矩陣,矩陣中包含的非0元素為m個。
此時,我們若採用順序存儲結構,就會使用一個n×n的二維數組,將所有數據元素全部記錄下來;若採用鏈式存儲結構,則需要使用一個包含m個結點的鏈表,記錄所有非0的m個數據元素。由這樣兩種不同的記錄方式,我們可以通過對數據的不同操作來分析它們的優點和缺點。
1. 隨機訪問矩陣中任意元素。由於順序結構在物理位置上是相鄰的,所以可以很容易地獲得任意元素的存儲地址,其復雜度為O(1);對於鏈式結構,由於不具備物理位置相鄰的特點,所以首先必須對整個鏈表進行一次遍歷,尋找需進行訪問的元素的存儲地址,其復雜度為O(m)。此時使用順序結構顯然效率更高。
2. 對所有數據進行遍歷。兩種存儲結構對於這種操作的復雜度是顯而易見的,順序結構的復雜度為O(n2),鏈式結構為O(m)。由於在一般情況下m要遠小於n2,所以此時鏈式結構的效率要高上許多。
除上述兩種操作外,對於其它的操作,這兩種結構都不存在很明顯的優點和缺點,如對鏈表進行刪除或插入操作,在順序結構中可表示為改變相應位置的數據元素。
既然兩種存儲結構對於不同的操作,其效率存在較大的差異,那麼我們在確定存儲結構時,必須仔細分析演算法中操作的需要,合理地選擇一種能夠「揚長避短」的存儲結構。
一、合理採用順序存儲結構。
我們在平常做題時,大多都是使用順序存儲結構對數據進行存儲。究其原因,一方面是出於順序結構操作方便的考慮,另一方面是在程序實現的過程中,使用順序結構相對於鏈式結構更便於對程序進行調試和查找錯誤。因此,大多數人習慣上認為,能夠使用順序結構進行存儲的問題,最「好」採用順序存儲結構。
其實,這個所謂的「好」只是一個相對的標准,是建立在以下兩個前提條件之下的:
1. 鏈式結構存儲的結點與順序結構存儲的結點數目相差不大。這種情況下,由於存儲的結點數目比較接近,使用鏈式結構完全不能體現出記錄結點少的優點,並且可能會由於指針操作較慢而降低演算法的效率。更有甚者,由於指針自身佔用的空間較大,且結點數目較多,因而演算法對空間的要求可能根本無法得到滿足。
2. 並非演算法效率的瓶頸所在。由於不是演算法最費時間的地方,這里是否進行改進,顯然是不會對整個演算法構成太大影響的,若使用鏈式結構反而會顯得操作過於繁瑣。
二、必要時採用鏈式存儲結構。
上面我對使用順序存儲結構的條件進行了分析,最後就只剩下何時應該採用鏈式存儲結構的問題了。
由於鏈式結構中指針操作確實較繁瑣,並且速度也較慢,調試也不方便,因而大家一般都不太願意用鏈式的存儲結構。但是,這只是一般的觀點,當鏈式結構確實對演算法有很大改進時,我們還是不得不進行考慮的。
〖問題三〗 IOI99的《地下城市》。
〖問題描述〗
已知一個城市的地圖,但未給出你的初始位置。你需要通過一系列的移動和探索,以確定初始時所在的位置。題目的限制是:
1. 不能移動到有牆的方格。
2. 只能探索當前所在位置四個方向上的相鄰方格。
在這兩個限制條件下,要求我們的探索次數(不包括移動)盡可能的少。
〖問題分析〗
由於存儲結構要由演算法的需要確定,因此我們首先來確定問題的演算法。
經過對問題的分析,我們得出解題的基本思想:先假設所有無牆的方格都可能是初始位置,再通過探索一步步地縮小初始位置的范圍,最終得到真正的初始位置。同時,為提高演算法效率,我們還用到了分治的思想,使我們每一次探索都盡量多的縮小初始位置的范圍(使程序盡量減少對運氣的依賴)。
接著,我們來確定此題的存儲結構。
由於這道題的地圖是一個二維的矩陣,所以一般來講,採用順序存儲結構理所當然。但是,順序存儲結構在這道題中暴露了很大的缺點。我們所進行的最多的操作,一是對初始位置的范圍進行篩選,二是判斷要選擇哪個位置進行探索。而這兩種操作,所需要用到的數據,只是龐大地圖中很少的一部分。如果採用順序存儲結構(如圖3-1中陰影部分表示已標記),無論你需要用到多少數據,始終都要完全的遍歷整個地圖。
4
3
2
1
1 2 3 4
圖3-1
head
圖3-2
然而,如果我們採用的是鏈式存儲結構(如圖3-2的鏈表),那麼我們需要多少數據,就只會遍歷多少數據,這樣不僅充分發揮了鏈式存儲結構的優點,而且由於不需單獨對某一個數據進行提取,每次都是對所有數據進行判斷,從而避免了鏈式結構的最大缺點。
我們使用鏈式存儲結構,雖然沒有降低問題的時間復雜度(鏈式存儲結構在最壞情況下的存儲量與順序存儲結構的存儲量幾乎相同),但由於體現了前文所述選擇存儲結構時揚長避短的原則,因而演算法的效率也大為提高。(程序對不同數據的運行時間見表3-3)
測試數據編號 使用順序存儲結構的程序 使用鏈式存儲結構的程序
1 0.06s 0.02s
2 1.73s 0.07s
3 1.14s 0.06s
4 3.86s 0.14s
5 32.84s 0.21s
6 141.16s 0.23s
7 0.91s 0.12s
8 6.92s 0.29s
9 6.10s 0.23s
10 17.41s 0.20s
表3-3
(附使用鏈式存儲結構的程序under.pas)
我們選擇鏈式的存儲結構,雖然操作上可能稍復雜一些,但由於改進了演算法的瓶頸,演算法的效率自然也今非昔比。由此可見,必要時選擇鏈式結構這一方法,其效果是不容忽視的。
小結
合理選擇邏輯結構,由於牽涉建立數學模型的問題,可能大家都會比較注意。但是對存儲結構的選擇,由於不會對演算法復雜度構成影響,所以比較容易忽視。那麼,這種不能降低演算法復雜度的方法是否需要重視呢?
大家都知道,剪枝作為一種常用的優化演算法的方法,被廣泛地使用,但剪枝同樣是無法改變演算法的復雜度的。因此,作用與剪枝相似的存儲結構的合理選擇,也是同樣很值得重視的。
總之,我們在設計演算法的過程中,必須充分考慮存儲結構所帶來的不同影響,選擇最合理的存儲結構。
四、 多種數據結構相結合
上文所探討的,都是如何對數據結構進行選擇,其中包含了邏輯結構的選擇和存儲結構的選擇,是一種具有較大普遍性的演算法優化方法。對於多數的問題,我們都可以通過選擇一種合理的邏輯結構和存儲結構以達到優化演算法的目的。
但是,有些問題卻往往不如人願,要對這類問題的數據結構進行選擇,常常會顧此失彼,有時甚至根本就不存在某一種合適的數據結構。此時,我們是無法選擇出某一種合適的數據結構的,以上的方法就有些不太適用了。
為解決數據結構難以選擇的問題,我們可以採用將多種數據結構進行結合的方法。通過多種數據結構相結合,達到取長補短的作用,使不同的數據結構在演算法中發揮出各自的優勢。
這只是我們將多種數據結構進行結合的總思想,具體如何進行結合,我們可以先看下面的例子。
我們可以採用映射的方法,將線性結構中的元素與堆中間的結點一一對應起來,若線性的數組中的元素發生變化,堆中相應的結點也接著變化,堆中的結點發生變化,數組中相應的元素也跟著變化。
將兩種結構進行結合後,無論是第一步還是第二步,我們都不需對所有元素進行遍歷,只需進行常數次復雜度為O(log2n)的堆化操作。這樣,整個時間復雜度就成為了O(nlog2n),演算法效率無疑得到了很大提高。
五、 總結
我們平常使用數據結構,往往只將其作為建立模型和演算法實現的工具,而沒有考慮這種工具對程序效率所產生的影響。信息學問題隨著難度的不斷增大,對演算法時空效率的要求也越來越高,而演算法的時空效率,在很大程度上都受到了數據結構的制約。
㈨ SEO百度排名最近都推出哪些演算法
影響網路SEO自然排名演算法的因素有特別多,像點擊率訪問率,訪問深度以及關鍵詞布局等一系列因素都會影響網路 SEO自然排名,那麼有哪些方法可以優化排名呢?下面就來介紹一些優化SEO排名的技巧。
一、首先要明確有哪些關鍵詞
通常情況下需要查看關鍵詞的PC指數,一般來說,PC指數越高,優化的難度越大。所以首先要明確想要刷的一些關鍵詞,然後直接網路,緊接著在裡面輸入需要進行優化的官網網址,然後就可以查看一系列需要的信息,當然也包括網站裡面一些關鍵詞的相關的指數,從而根據關鍵詞的指數來進行准備和調整優化方案。
二、計算出每個關鍵詞指數對應的日均流量
舉個例子來說,如果你的關鍵詞指數是100,如果對應的需要的流量為10%到20%,那麼計算下來的日均流量就在10到20個IP。
三、尋找更多的人來幫助自己提升排名
這個方法說白了也就類似於網站的推廣,當網站的推廣達到了一定的程度,來自全國各地的不同IP的人來搜索你的關鍵詞並且進入網站,這樣網站的訪問量就會大大提升,排名也會因為訪問量的增多而升高。
四、提高訪問深度和停留時間
有的人可能認為訪問量多就能夠有更好的SEO排名,但是事實上並不是這樣子的。一般來說,訪問深度和層次越深越好,也就是說,每個網頁瀏覽的時間不能夠低於五分鍾,並且可以在網頁瀏覽的時候進行深層次的網頁瀏覽,也就是說,可以點進去網頁內部的一些鏈接,這樣才能夠大大的提升網頁排名。因此在設計網頁內容的時候一定要有獨到之處,首先是關鍵詞一點能夠吸引人,能夠對人們產生一種主導作用,其次網頁的設置和排版也要有一定的新穎之處,這樣才能夠讓人沒有讀下去的興趣。
五、採用先易後難的優化模式
在關鍵詞SEO排名優化的過程中,最好從指數比較低的關鍵詞開始優化,因為指數低的優化起來比較容易,這樣就會比較節省時間,指數高的關鍵詞,如果流量不穩定,其實很快刷上去了,他也會很快掉下來。因此保險起見最好從指數低的關鍵詞開始進行優化。
六、定時更新內容
說來說去一個網站最吸引人的地方應該就是她的內容了,所以堅持每天穩定的增加幾個鏈接,或者說更新一下原創內容,當然,關鍵詞這些基礎是指也要做好,所以說流量雖然是比較重要的,但是一定要保持內容的原創和優質性,這樣才能夠吸引更多的讀者,從而增加流量。
當然除了上面介紹的這些SEO排名優化技巧之外,還有一個最大的技巧,就是貴在堅持。很多人覺得這是一個比較繁瑣的工作,可能做了幾天就沒有興趣了,甚至覺得見效比較慢,所以逐漸的打退堂鼓。但是任何事情都需要一個循序漸進的過程,只要堅持做,相信就一定會有更好的效果。