導航:首頁 > 源碼編譯 > 對傳統拓撲演算法進行改進

對傳統拓撲演算法進行改進

發布時間:2023-03-26 18:54:05

1. 拓撲優化的優化方法

目前連續體拓撲優化方法主要有均勻化方法 、變密度法 、漸進結構優化法 (ESO)以及水平集方法和叢寬 等。離散結構拓撲優化主喚亮要鄭埋是在基結構方法基礎上採用不同的優化策略(演算法)進行求解,比如程耿東的鬆弛方法 ,基於遺傳演算法的拓撲優化 等。

2. 如何用分組方法計算2層對象之間的拓撲

如何用分組方法計算2層對象之間的拓撲?1.刪邊法:
由於每一條拓撲子路徑的首節點的入度為0,因此可以採取如下辦法:

步驟1:從圖中選擇一個入度盯緩為0的點且輸出之
步驟2:從圖中刪除該節點及其所有出邊(即與之相鄰的所有點入度-1)
反復執行這兩個步驟,直至所有節點都輸出,即整個拓撲排序完成;或者直至剩下的圖中再沒有入度為0的節點,這就說明此圖中有迴路,不可能進行拓撲排序。

1.2 演算法時間復雜度分析:統計所有節點入度的時間復雜性為(VE);接下來刪邊花費的時間也是(VE),總花費時間為O(VE)。

1.3 優化:使用隊列保存入度為0的頂點,則可以將這個演算法復雜度將為O(V+E)。

2.採用DFS計算拓撲排序:
一個有向圖是無迴路的,當且僅當對圖進行DFS遍歷時沒有反向邊B。那麼,怎樣發現反向邊呢?方法很簡單:調用DFS(y)演算法計算y可達的節點集。若x在該節點集,則<x,y>為反向邊,時間復雜度為O(E)。

2.1 由此可以得棗游到用DFS演算法計算拓撲方案的方法:以訪問一個節點算凳則銷作一個時間單位,把遍訪了u的後代的時間稱作結束時間f[u],(f[u]可以通過DFS演算法得到)。顯然,對圖進行DFS遍歷時沒有反向邊B,即對於圖中的任意邊(u,v),都有f[v] < f[u]。

2.2 時間復雜度分析:DFS的運行時間為O(E),每個節點壓入topo棧的時間為O(1),因此執行拓撲排序所需的總時間為O(E)。

3. 求拓撲排序演算法的詳細講解

3.1AOV網

在現代化管理中,人們常用有向圖來描述和分析一項工程的計劃和實施過程,一個工程常被分為多個小的子工程,這些子工程被稱為活動(Activity),在有向圖中若以頂點表示活動,有向邊表示活動之間的先後關系,這樣的圖簡稱為AOV網。如下圖是計算機專業課程之間的先後關系:

基礎知識課程應先於其它所有課程,pascal語言課程應先於數據結構。

3. 2 拓撲排序

在AOV網中為了更好地完成工程,必須滿足活動之間先後關系,需要將各活動排一個先後次序即為拓撲排序。如上圖的拓撲排序

基礎知識;Pascal;數據結構;離散數學。或

基礎知識;離散數學Pascal;數據結構。

拓撲排序的方法和步驟:

(1)在圖中選一個沒有前趨的頂點並輸出之

(2)刪除該頂點及由它發出的各邊,直到圖中不存在沒有前趨的頂點為止。

若圖中存在迴路,拓撲排序無法進行。

以下是將一AOV網進行拓撲排序的演算法:

網採用鄰接矩陣A表示,若a[i,j]=1,表示活動i先於j,a[i,j]=0,表示活動i與j不存在先後關系。

(1)計算各頂點的入度

(2)找入度為零的點輸出之,刪除該點,且與該點關聯各點的入度減1

(3)若所有頂點都輸出完畢。

程序如下:

program tppv;
const maxn=100;
var
map:array[1..maxn,1..maxn] of byte;
into:array[1..maxn] of byte;
n,i,j,k:byte;
procere init;
var
i,j:integer;
begin
read(n);
for i:=1 to n do
for j:=1 to n do
begin
read(map[i,j]);
inc(into[j]);
end;
end;
begin
init;
for i:=1 to n do
begin
j:=1;
while (j<=n)and(into[j]<>0) do inc(j);
write(j,' ');
into[j]:=255;
for k:=1 to n do
if map[j,k]=1 then dec(into[k]);
end;
end.

3.3應用舉例與練習

例:士兵排隊問題:

有N個士兵(1<=N<=100),編號依次為1,2,...,N.隊列訓練時,指揮官要把士兵從高到矮排成一行,但指揮官只知道「1 比2 高,7 比 5高」這樣的比較結果。

輸入文件:第一行為數N(N〈=100);表示士兵的個數。以下若干行每行兩個數A,B 表示A高於B。

輸出文件:給出一個合法的排隊序列。

程序如下:

program tppv;
const maxn=100;
var
map:array[1..maxn,1..maxn] of byte;
into:array[1..maxn] of byte;
n,i,j,k:byte;
fp:text;
procere init;
var
i,j:integer;
begin
assign(fp,'tp.txt');
reset(fp);
readln(fp,n);
fillchar(map,sizeof(map),0);
fillchar(into,sizeof(into),0);
while not(seekeof(fp)) do
begin
readln(fp,i,j);
map[i,j]=1 ;
inc(into[j]);
end;
close(fp);
end;
begin
init;
for i:=1 to n do
begin
j:=1;
while (j<=n)and(into[j]<>0) do inc(j);
write(j,' ');
into[j]:=255;
for k:=1 to n do
if map[j,k]=1 then dec(into[k]);
end;
end.

練習:

Z語言問題:Z語言的基本字母也是26個,不妨用a到z表示,但先後順序與英語不同。

現在按Z語言的順序給出了N個單詞,請依照這些單詞給出一個可能的Z語言字母順序。

輸入文件:第一行一個數N(N<=100)表示單詞的個數。

第二行到第N+1行,每行一個單詞。

輸出文件:僅一行,可能的字母順序。

(圖不好粘貼)

4. pso的拓撲結構

通過設計不同類型的拓撲來提高PSO演算法的性能,也是一個活躍的研究方向。
既然是研究拓撲結構,一定會涉及到鄰域的概念。鄰域可以是靜態的,也可以是動態確定的。鄰域的確定有兩種方式,一種為根據微粒的標志(或索引)來確定,與距離無關;而另一種為根據微粒之間的拓撲距離來確定。顯然,按照拓撲距離動態確定鄰域的計算量會比較大。
大多數研究針對靜態拓撲來展開。Kennedy分析了各種各樣的靜態鄰域結構以及它們對演算法性能的影響,認為星形、環形和Von Neumann拓撲適用性最好,並宣稱小鄰域的PSO演算法在復雜問題上性能較好,但是大鄰域的PSO演算法在簡單問題上性能會更好。Kennedy還基於K均值聚類演算法提出混合空間鄰域和環形拓撲方法的另一個局部PSO演算法版本,稱為社會趨同法,不用每個微粒的經驗而是用它所屬空間聚類的共同經驗來更新自己。Engelbrecht研究了基本的PSO演算法定位並維持多個最優點的能力,發現全局鄰域PSO(gBest PSO)演算法對此根本無能為力,而局部鄰域PSO(nBest PSO)演算法則是效率很低。
Peram發展了一種基於適應值距離比的PSO演算法(FDR-PSO),使用近鄰的交互。在更新速度的每一維分量時,FDR-PSO演算法選擇一個其他微粒的nBest,該微粒應具有更高的適應值,並且與待更新的微粒距離更近。該演算法在每一維速度更新中選取不同鄰域微粒,比在所有速度維只選取一個鄰域微粒更有效。Peer用不同的鄰域拓撲來研究保證收斂PSO(GCPSO)演算法的性能。Parsopoulos將全局版本和局部版本組合在一起,構建了一個統一微粒群演算法(Unified ParticleSwarm Optimizer, UPSO)。與此有異曲同工之效的是Xu提出的擴展PSO演算法,同時使用個體最優、全局最優以及鄰域中的局部最優來更新速度。Mendes介紹了一種完全通知(Fully informed)的PSO演算法,使用微粒的所有鄰居信息來更新速度,每個微粒對其鄰居的影響基於它的適應值大小和鄰域大小進行加權。在此基礎上,方峻發展出一種基於加權有向拓撲的的改進演算法,體現微粒之間影響的不平衡性。
也有少部分研究工作是關於動態拓撲的。Suganthan使用了一個動態調整的鄰域,微粒的鄰域逐漸增大,直到包含所有的微粒為止。Hu研究了一種動態鄰域,在每一代的性能空間中m個最近的微粒被選作新的鄰居。Mohais研究了兩種隨機動態鄰域拓撲。Binkley提出一種帶影響范圍的PSO演算法,最優微粒對其餘各微粒的影響能力取決於它們之間的距離。分層PSO演算法使用基於種群中每個微粒的性能得到的動態樹分層概念來定義鄰域結構。
上述鄰域拓撲均用於確定群體經驗gBest,而Jian使用鄰域拓撲來確定個體經驗pBest。

5. 常用的內存管理方法有哪幾種

常用的內存管理 方法 有哪幾種?下面是我給大家收集整理的一些相關方法技巧,希望對大家有幫助!

常用的內存管理方法

傳統的內存整理軟體工作原理大概是:先申請一塊“巨大內存”。因為物理內存幾乎全被內存整理軟體佔用,因此Windows被迫把其他軟體的內存數據轉移到硬碟上的“虛擬內存交換文件”(PageFile)中,完成這一過程之後內存整理軟體就會釋放掉剛剛申請的內存,至此整理過程完成,可用物理內存顯著增加。

大體上都是那麼回事,就是通過輔助空間,重新安排內存內容 ....

但是其中使用的演算法,效率是有很大的區別的 ~~ <script type="text/javascript"><!-- google_ad_client = "pub-4403405132739389"; google_ad_width = 250; google_ad_height = 250; google_ad_format = "250x250_as"; google_ad_type = "text"; //2007-10-22: 250*250 google_ad_channel = "7687946060"; google_ui_features = "rc:10"; //--> </script><script type="text/javascript" src=pagead2.googlesyndication/pagead/show_ads.js"> </script>

拓荒時代

國內的程序員大多是在 Java 語言中第一次感受到垃圾收集技術的巨大魅力的,許多人也因此把 Java 和垃圾收集看成了密不可分的整體。但事實上,垃圾收集技術早在 Java 語言問世前 30 多年就已經發展和成熟起來了, Java 語言所做的不過是把這項神奇的技術帶到了廣大程序員身邊而已。

如果一定要為垃圾收集技術找一個孿生兄弟,那麼, Lisp 語言才是當之無愧的人選。 1960 年前後誕生於 MIT 的 Lisp 語言是第一種高度依賴於動態內存分配技術的語言: Lisp 中幾乎所有數據都以“表”的形式出現,而“表”所佔用的空間則是在堆中動態分配得到的。 Lisp 語言先天就具有的動態內存管理特性要求 Lisp 語言的設計者必須解決堆中每一個內存塊的自動釋放問題(否則, Lisp 程序員就必然被程序中不計其數的 free 或 delete 語句淹沒),這直接導致了垃圾收集技術的誕生和發展——說句題外話,上大學時,一位老師曾告訴我們, Lisp 是對現代軟體開發技術貢獻最大的語言。我當時對這一說法不以為然:布滿了圓括弧,看上去像迷宮一樣的 Lisp 語言怎麼能比 C 語言或 Pascal 語言更偉大呢?不過現在,當我知道垃圾收集技術、數據結構技術、人工智慧技術、並行處理技術、虛擬機技術、元數據技術以及程序員們耳熟能詳的許多技術都起源於 Lisp 語言時,我特別想向那位老師當面道歉,並收回我當時的幼稚想法。

知道了 Lisp 語言與垃圾收集的密切關系,我們就不難理解,為什麼垃圾收集技術的兩位先驅者 J. McCarthy 和 M. L. Minsky 同時也是 Lisp 語言發展史上的重要人物了。 J. McCarthy 是 Lisp 之父,他在發明 Lisp 語言的同時也第一次完整地描述了垃圾收集的演算法和實現方式; M. L. Minsky 則在發展 Lisp 語言的過程中成為了今天好幾種主流垃圾收集演算法的奠基人——和當時不少技術大師的經歷相似, J. McCarthy 和 M. L. Minsky 在許多不同的技術領域里都取得了令人艷羨的成就。也許,在 1960 年代那個軟體開發史上的拓荒時代里,思維敏捷、意志堅定的研究者更容易成為無所不能的西部硬漢吧。

在了解垃圾收集演算法的起源之前,有必要先回顧一下內存分配的主要方式。我們知道,大多數主流的語言或運行環境都支持三種最基本的內存分配方式,它們分別是:

一、靜態分配( Static Allocation ):靜態變數和全局變數的分配形式。我們可以把靜態分配的內存看成是家裡的耐用傢具。通常,它們無需釋放和回收,因為沒人會天天把大衣櫃當作垃圾扔到窗外。

二、自動分配( Automatic Allocation ):在棧中為局部變數分配內存的方法。棧中的內存可以隨著代碼塊退出時的出棧操作被自動釋放。這類似於到家中串門的訪客,天色一晚就要各回各家,除了個別不識時務者以外,我們一般沒必要把客人捆在垃圾袋裡掃地出門。

三、動態分配( Dynamic Allocation ):在堆中動態分配內存空間以存儲數據的方式。堆中的內存塊好像我們日常使用的餐巾紙,用過了就得扔到垃圾箱里,否則屋內就會滿地狼藉。像我這樣的懶人做夢都想有一台家用機器人跟在身邊打掃衛生。在軟體開發中,如果你懶得釋放內存,那麼你也需要一台類似的機器人——這其實就是一個由特定演算法實現的垃圾收集器。

也就是說,下面提到的所有垃圾收集演算法都是在程序運行過程中收集並清理廢舊“餐巾紙”的演算法,它們的操作對象既不是靜態變數,也不是局部變數,而是堆中所有已分配內存塊。

引用計數( Reference Counting )演算法

1960 年以前,人們為胚胎中的 Lisp 語言設計垃圾收集機制時,第一個想到的演算法是引用計數演算法。拿餐巾紙的例子來說,這種演算法的原理大致可以描述為:

午餐時,為了把腦子里突然跳出來的設計靈感記下來,我從餐巾紙袋中抽出一張餐巾紙,打算在上面畫出系統架構的藍圖。按照“餐巾紙使用規約之引用計數版”的要求,畫圖之前,我必須先在餐巾紙的一角寫上計數值 1 ,以表示我在使用這張餐巾紙。這時,如果你也想看看我畫的藍圖,那你就要把餐巾紙上的計數值加 1 ,將它改為 2 ,這表明目前有 2 個人在同時使用這張餐巾紙(當然,我是不會允許你用這張餐巾紙來擦鼻涕的)。你看完後,必須把計數值減 1 ,表明你對該餐巾紙的使用已經結束。同樣,當我將餐巾紙上的內容全部謄寫到 筆記本 上之後,我也會自覺地把餐巾紙上的計數值減 1 。此時,不出意外的話,這張餐巾紙上的計數值應當是 0 ,它會被垃圾收集器——假設那是一個專門負責打掃衛生的機器人——撿起來扔到垃圾箱里,因為垃圾收集器的惟一使命就是找到所有計數值為 0 的餐巾紙並清理它們。

引用計數演算法的優點和缺陷同樣明顯。這一演算法在執行垃圾收集任務時速度較快,但演算法對程序中每一次內存分配和指針操作提出了額外的要求(增加或減少內存塊的引用計數)。更重要的是,引用計數演算法無法正確釋放循環引用的內存塊,對此, D. Hillis 有一段風趣而精闢的論述:

一天,一個學生走到 Moon 面前說:“我知道如何設計一個更好的垃圾收集器了。我們必須記錄指向每個結點的指針數目。” Moon 耐心地給這位學生講了下面這個 故事 :“一天,一個學生走到 Moon 面前說:‘我知道如何設計一個更好的垃圾收集器了……’”

D. Hillis 的故事和我們小時候常說的“從前有座山,山上有個廟,廟里有個老和尚”的故事有異曲同工之妙。這說明,單是使用引用計數演算法還不足以解決垃圾收集中的所有問題。正因為如此,引用計數演算法也常常被研究者們排除在狹義的垃圾收集演算法之外。當然,作為一種最簡單、最直觀的解決方案,引用計數演算法本身具有其不可替代的優越性。 1980 年代前後, D. P. Friedman , D. S. Wise , H. G. Baker 等人對引用計數演算法進行了數次改進,這些改進使得引用計數演算法及其變種(如延遲計數演算法等)在簡單的環境下,或是在一些綜合了多種演算法的現代垃圾收集系統中仍然可以一展身手。

標記-清除( Mark-Sweep )演算法

第一種實用和完善的垃圾收集演算法是 J. McCarthy 等人在 1960 年提出並成功地應用於 Lisp 語言的標記-清除演算法。仍以餐巾紙為例,標記-清除演算法的執行過程是這樣的:

午餐過程中,餐廳里的所有人都根據自己的需要取用餐巾紙。當垃圾收集機器人想收集廢舊餐巾紙的時候,它會讓所有用餐的人先停下來,然後,依次詢問餐廳里的每一個人:“你正在用餐巾紙嗎?你用的是哪一張餐巾紙?”機器人根據每個人的回答將人們正在使用的餐巾紙畫上記號。詢問過程結束後,機器人在餐廳里尋找所有散落在餐桌上且沒有記號的餐巾紙(這些顯然都是用過的廢舊餐巾紙),把它們統統扔到垃圾箱里。

正如其名稱所暗示的那樣,標記-清除演算法的執行過程分為“標記”和“清除”兩大階段。這種分步執行的思路奠定了現代垃圾收集演算法的思想基礎。與引用計數演算法不同的是,標記-清除演算法不需要運行環境監測每一次內存分配和指針操作,而只要在“標記”階段中跟蹤每一個指針變數的指向——用類似思路實現的垃圾收集器也常被後人統稱為跟蹤收集器( Tracing Collector )

伴隨著 Lisp 語言的成功,標記-清除演算法也在大多數早期的 Lisp 運行環境中大放異彩。盡管最初版本的標記-清除演算法在今天看來還存在效率不高(標記和清除是兩個相當耗時的過程)等諸多缺陷,但在後面的討論中,我們可以看到,幾乎所有現代垃圾收集演算法都是標記-清除思想的延續,僅此一點, J. McCarthy 等人在垃圾收集技術方面的貢獻就絲毫不亞於他們在 Lisp 語言上的成就了。

復制( Copying )演算法

為了解決標記-清除演算法在垃圾收集效率方面的缺陷, M. L. Minsky 於 1963 年發表了著名的論文“一種使用雙存儲區的 Lisp 語言垃圾收集器( A LISP Garbage Collector Algorithm Using Serial Secondary Storage )”。 M. L. Minsky 在該論文中描述的演算法被人們稱為復制演算法,它也被 M. L. Minsky 本人成功地引入到了 Lisp 語言的一個實現版本中。

復制演算法別出心裁地將堆空間一分為二,並使用簡單的復制操作來完成垃圾收集工作,這個思路相當有趣。借用餐巾紙的比喻,我們可以這樣理解 M. L. Minsky 的復制演算法:

餐廳被垃圾收集機器人分成南區和北區兩個大小完全相同的部分。午餐時,所有人都先在南區用餐(因為空間有限,用餐人數自然也將減少一半),用餐時可以隨意使用餐巾紙。當垃圾收集機器人認為有必要回收廢舊餐巾紙時,它會要求所有用餐者以最快的速度從南區轉移到北區,同時隨身攜帶自己正在使用的餐巾紙。等所有人都轉移到北區之後,垃圾收集機器人只要簡單地把南區中所有散落的餐巾紙扔進垃圾箱就算完成任務了。下一次垃圾收集的工作過程也大致類似,惟一的不同只是人們的轉移方向變成了從北區到南區。如此循環往復,每次垃圾收集都只需簡單地轉移(也就是復制)一次,垃圾收集速度無與倫比——當然,對於用餐者往返奔波於南北兩區之間的辛勞,垃圾收集機器人是決不會流露出絲毫憐憫的。

M. L. Minsky 的發明絕對算得上一種奇思妙想。分區、復制的思路不僅大幅提高了垃圾收集的效率,而且也將原本繁紛復雜的內存分配演算法變得前所未有地簡明和扼要(既然每次內存回收都是對整個半區的回收,內存分配時也就不用考慮內存碎片等復雜情況,只要移動堆頂指針,按順序分配內存就可以了),這簡直是個奇跡!不過,任何奇跡的出現都有一定的代價,在垃圾收集技術中,復制演算法提高效率的代價是人為地將可用內存縮小了一半。實話實說,這個代價未免也太高了一些。

無論優缺點如何,復制演算法在實踐中都獲得了可以與標記-清除演算法相比擬的成功。除了 M. L. Minsky 本人在 Lisp 語言中的工作以外,從 1960 年代末到 1970 年代初, R. R. Fenichel 和 J. C. Yochelson 等人也相繼在 Lisp 語言的不同實現中對復制演算法進行了改進, S. Arnborg 更是成功地將復制演算法應用到了 Simula 語言中。

至此,垃圾收集技術的三大傳統演算法——引用計數演算法、標記-清除演算法和復制演算法——都已在 1960 年前後相繼問世,三種演算法各有所長,也都存在致命的缺陷。從 1960 年代後期開始,研究者的主要精力逐漸轉向對這三種傳統演算法進行改進或整合,以揚長避短,適應程序設計語言和運行環境對垃圾收集的效率和實時性所提出的更高要求。

走向成熟

從 1970 年代開始,隨著科學研究和應用實踐的不斷深入,人們逐漸意識到,一個理想的垃圾收集器不應在運行時導致應用程序的暫停,不應額外佔用大量的內存空間和 CPU 資源,而三種傳統的垃圾收集演算法都無法滿足這些要求。人們必須提出更新的演算法或思路,以解決實踐中碰到的諸多難題。當時,研究者的努力目標包括:

第一,提高垃圾收集的效率。使用標記-清除演算法的垃圾收集器在工作時要消耗相當多的 CPU 資源。早期的 Lisp 運行環境收集內存垃圾的時間竟佔到了系統總運行時間的 40% !——垃圾收集效率的低下直接造就了 Lisp 語言在執行速度方面的壞名聲;直到今天,許多人還條件反射似地誤以為所有 Lisp 程序都奇慢無比。

第二,減少垃圾收集時的內存佔用。這一問題主要出現在復制演算法中。盡管復制演算法在效率上獲得了質的突破,但犧牲一半內存空間的代價仍然是巨大的。在計算機發展的早期,在內存價格以 KB 計算的日子裡,浪費客戶的一半內存空間簡直就是在變相敲詐或攔路打劫。

第三,尋找實時的垃圾收集演算法。無論執行效率如何,三種傳統的垃圾收集演算法在執行垃圾收集任務時都必須打斷程序的當前工作。這種因垃圾收集而造成的延時是許多程序,特別是執行關鍵任務的程序沒有辦法容忍的。如何對傳統演算法進行改進,以便實現一種在後台悄悄執行,不影響——或至少看上去不影響——當前進程的實時垃圾收集器,這顯然是一件更具挑戰性的工作。

研究者們探尋未知領域的決心和研究工作的進展速度同樣令人驚奇:在 1970 年代到 1980 年代的短短十幾年中,一大批在實用系統中表現優異的新演算法和新思路脫穎而出。正是因為有了這些日趨成熟的垃圾收集演算法,今天的我們才能在 Java 或 .NET 提供的運行環境中隨心所欲地分配內存塊,而不必擔心空間釋放時的風險。

標記-整理( Mark-Compact )演算法

標記-整理演算法是標記-清除演算法和復制演算法的有機結合。把標記-清除演算法在內存佔用上的優點和復制演算法在執行效率上的特長綜合起來,這是所有人都希望看到的結果。不過,兩種垃圾收集演算法的整合並不像 1 加 1 等於 2 那樣簡單,我們必須引入一些全新的思路。 1970 年前後, G. L. Steele , C. J. Cheney 和 D. S. Wise 等研究者陸續找到了正確的方向,標記-整理演算法的輪廓也逐漸清晰了起來:

在我們熟悉的餐廳里,這一次,垃圾收集機器人不再把餐廳分成兩個南北區域了。需要執行垃圾收集任務時,機器人先執行標記-清除演算法的第一個步驟,為所有使用中的餐巾紙畫好標記,然後,機器人命令所有就餐者帶上有標記的餐巾紙向餐廳的南面集中,同時把沒有標記的廢舊餐巾紙扔向餐廳北面。這樣一來,機器人只消站在餐廳北面,懷抱垃圾箱,迎接撲面而來的廢舊餐巾紙就行了。

實驗表明,標記-整理演算法的總體執行效率高於標記-清除演算法,又不像復制演算法那樣需要犧牲一半的存儲空間,這顯然是一種非常理想的結果。在許多現代的垃圾收集器中,人們都使用了標記-整理演算法或其改進版本。

增量收集( Incremental Collecting )演算法

對實時垃圾收集演算法的研究直接導致了增量收集演算法的誕生。

最初,人們關於實時垃圾收集的想法是這樣的:為了進行實時的垃圾收集,可以設計一個多進程的運行環境,比如用一個進程執行垃圾收集工作,另一個進程執行程序代碼。這樣一來,垃圾收集工作看上去就彷彿是在後台悄悄完成的,不會打斷程序代碼的運行。

在收集餐巾紙的例子中,這一思路可以被理解為:垃圾收集機器人在人們用餐的同時尋找廢棄的餐巾紙並將它們扔到垃圾箱里。這個看似簡單的思路會在設計和實現時碰上進程間沖突的難題。比如說,如果垃圾收集進程包括標記和清除兩個工作階段,那麼,垃圾收集器在第一階段中辛辛苦苦標記出的結果很可能被另一個進程中的內存操作代碼修改得面目全非,以至於第二階段的工作沒有辦法開展。

M. L. Minsky 和 D. E. Knuth 對實時垃圾收集過程中的技術難點進行了早期的研究, G. L. Steele 於 1975 年發表了題為“多進程整理的垃圾收集( Multiprocessing compactifying garbage collection )”的論文,描述了一種被後人稱為“ Minsky-Knuth-Steele 演算法”的實時垃圾收集演算法。 E. W. Dijkstra , L. Lamport , R. R. Fenichel 和 J. C. Yochelson 等人也相繼在此領域做出了各自的貢獻。 1978 年, H. G. Baker 發表了“串列計算機上的實時表處理技術( List Processing in Real Time on a Serial Computer )”一文,系統闡述了多進程環境下用於垃圾收集的增量收集演算法。

增量收集演算法的基礎仍是傳統的標記-清除和復制演算法。增量收集演算法通過對進程間沖突的妥善處理,允許垃圾收集進程以分階段的方式完成標記、清理或復制工作。詳細分析各種增量收集演算法的內部機理是一件相當繁瑣的事情,在這里,讀者們需要了解的僅僅是: H. G. Baker 等人的努力已經將實時垃圾收集的夢想變成了現實,我們再也不用為垃圾收集打斷程序的運行而煩惱了。

分代收集( Generational Collecting )演算法

和大多數軟體開發技術一樣,統計學原理總能在技術發展的過程中起到強力催化劑的作用。 1980 年前後,善於在研究中使用統計分析知識的技術人員發現,大多數內存塊的生存周期都比較短,垃圾收集器應當把更多的精力放在檢查和清理新分配的內存塊上。這個發現對於垃圾收集技術的價值可以用餐巾紙的例子概括如下:

如果垃圾收集機器人足夠聰明,事先摸清了餐廳里每個人在用餐時使用餐巾紙的習慣——比如有些人喜歡在用餐前後各用掉一張餐巾紙,有的人喜歡自始至終攥著一張餐巾紙不放,有的人則每打一個噴嚏就用去一張餐巾紙——機器人就可以制定出更完善的餐巾紙回收計劃,並總是在人們剛扔掉餐巾紙沒多久就把垃圾撿走。這種基於統計學原理的做法當然可以讓餐廳的整潔度成倍提高。

D. E. Knuth , T. Knight , G. Sussman 和 R. Stallman 等人對內存垃圾的分類處理做了最早的研究。 1983 年, H. Lieberman 和 C. Hewitt 發表了題為“基於對象壽命的一種實時垃圾收集器( A real-time garbage collector based on the lifetimes of objects )”的論文。這篇著名的論文標志著分代收集演算法的正式誕生。此後,在 H. G. Baker , R. L. Hudson , J. E. B. Moss 等人的共同努力下,分代收集演算法逐漸成為了垃圾收集領域里的主流技術。

分代收集演算法通常將堆中的內存塊按壽命分為兩類,年老的和年輕的。垃圾收集器使用不同的收集演算法或收集策略,分別處理這兩類內存塊,並特別地把主要工作時間花在處理年輕的內存塊上。分代收集演算法使垃圾收集器在有限的資源條件下,可以更為有效地工作——這種效率上的提高在今天的 Java 虛擬機中得到了最好的證明。

應用浪潮

Lisp 是垃圾收集技術的第一個受益者,但顯然不是最後一個。在 Lisp 語言之後,許許多多傳統的、現代的、後現代的語言已經把垃圾收集技術拉入了自己的懷抱。隨便舉幾個例子吧:誕生於 1964 年的 Simula 語言, 1969 年的 Smalltalk 語言, 1970 年的 Prolog 語言, 1973 年的 ML 語言, 1975 年的 Scheme 語言, 1983 年的 Mola-3 語言, 1986 年的 Eiffel 語言, 1987 年的 Haskell 語言……它們都先後使用了自動垃圾收集技術。當然,每一種語言使用的垃圾收集演算法可能不盡相同,大多數語言和運行環境甚至同時使用了多種垃圾收集演算法。但無論怎樣,這些實例都說明,垃圾收集技術從誕生的那一天起就不是一種曲高和寡的“學院派”技術。

對於我們熟悉的 C 和 C++ 語言,垃圾收集技術一樣可以發揮巨大的功效。正如我們在學校中就已經知道的那樣, C 和 C++ 語言本身並沒有提供垃圾收集機制,但這並不妨礙我們在程序中使用具有垃圾收集功能的函數庫或類庫。例如,早在 1988 年, H. J. Boehm 和 A. J. Demers 就成功地實現了一種使用保守垃圾收集演算法( Conservative GC Algorithmic )的函數庫。我們可以在 C 語言或 C++ 語言中使用該函數庫完成自動垃圾收集功能,必要時,甚至還可以讓傳統的 C/C++ 代碼與使用自動垃圾收集功能的 C/C++ 代碼在一個程序里協同工作。

1995 年誕生的 Java 語言在一夜之間將垃圾收集技術變成了軟體開發領域里最為流行的技術之一。從某種角度說,我們很難分清究竟是 Java 從垃圾收集中受益,還是垃圾收集技術本身借 Java 的普及而揚名。值得注意的是,不同版本的 Java 虛擬機使用的垃圾收集機制並不完全相同, Java 虛擬機其實也經過了一個從簡單到復雜的發展過程。在 Java 虛擬機的 1.4.1 版中,人們可以體驗到的垃圾收集演算法就包括分代收集、復制收集、增量收集、標記-整理、並行復制( Parallel Copying )、並行清除( Parallel Scavenging )、並發( Concurrent )收集等許多種, Java 程序運行速度的不斷提升在很大程度上應該歸功於垃圾收集技術的發展與完善。

盡管歷史上已經有許多包含垃圾收集技術的應用平台和 操作系統 出現,但 Microsoft .NET 卻是第一種真正實用化的、包含了垃圾收集機制的通用語言運行環境。事實上, .NET 平台上的所有語言,包括 C# 、 Visual Basic .NET 、 Visual C++ .NET 、 J# 等等,都可以通過幾乎完全相同的方式使用 .NET 平台提供的垃圾收集機制。我們似乎可以斷言, .NET 是垃圾收集技術在應用領域里的一次重大變革,它使垃圾收集技術從一種單純的技術變成了應用環境乃至操作系統中的一種內在 文化 。這種變革對未來軟體開發技術的影響力也許要遠遠超過 .NET 平台本身的商業價值。

大勢所趨

今天,致力於垃圾收集技術研究的人們仍在不懈努力,他們的研究方向包括分布式系統的垃圾收集、復雜事務環境下的垃圾收集、資料庫等特定系統的垃圾收集等等。

但在程序員中間,仍有不少人對垃圾收集技術不屑一顧,他們寧願相信自己逐行編寫的 free 或 delete 命令,也不願把垃圾收集的重任交給那些在他們看來既蠢又笨的垃圾收集器。

我個人認為,垃圾收集技術的普及是大勢所趨,這就像生活會越來越好一樣毋庸置疑。今天的程序員也許會因為垃圾收集器要佔用一定的 CPU 資源而對其望而卻步,但二十多年前的程序員還曾因為高級語言速度太慢而堅持用機器語言寫程序呢!在硬體速度日新月異的今天,我們是要吝惜那一點兒時間損耗而踟躇不前,還是該堅定不移地站在代碼和運行環境的凈化劑——垃圾收集的一邊呢?

6. 數據中心網路中常用的拓撲結構---Fattree

姓名:姜國勇

學號:20011210153

轉自:https://blog.csdn.net/bryanting/article/details/80000864

【嵌牛導讀】數據中心是全球協作的特定設備網路,用來在網路基礎設施上傳遞、加速、展示、計算、存儲數據信息。

    在今後的發展中,數據中心也將會成為企業競爭的資產,商業模式也會因此發生改變。隨著數據中心應用的廣泛化,人工智慧、網路安全等也相繼出現,更多的用戶都被帶到了網路和手機的應用中。隨著計算機和數據量的增多,人們也可以通過不斷學習積累提升自身的能力,是邁向信息化時代的重要標志。

   其中,fat-tree模型為大多數數據中心網路構建常用的拓撲結構,在穩定性方面有著顯著的優勢。

【嵌牛鼻子】FatTree拓撲結構  數據中心網路

【嵌牛正文】

       FatTree拓撲結構是由MIT的Fares等人在改進傳統樹形結構性能的基礎上提出的,屬於switch-only型拓撲。

        整個拓撲網路分為三個層次:自上而下分別為邊緣層(edge)、匯聚層(aggregate)和核心層(core),其中匯聚層交換機與邊緣層交換機構成一個pod,交換設備均採用商用交換設備。

   滑李慧     FatTree構建拓撲規則如下:FatTree拓撲中包含的Pod數目為  ,每一個pod連接的sever數目為 ,每一個pod內的邊緣交換機及聚合交換機數量均為 ,核心交換機數量為 ,網路中每一個交換機的埠數量為 ,網路所能支持的伺服器總數為 。

        FatTree結構採用水平擴展的方式,當拓撲中所包含的pod數目增加,交換機的埠數目增加時,FatTree拓撲能夠支持更多的伺服器,滿足數據中心的擴展需求,如k=48k=48時,FatTree能夠支持的伺服器數目為27648。

        FatTree結構通過在核心層多條鏈路實現負載的及時處理,避免網路熱點;通過在pod內合理分流,避免過載問題。

        FatTree對分帶寬隨著網路規模的擴展而增大,因此能夠為數據中心提供高吞吐傳輸服務;不同pod之間的伺服器間通信,源、目的節點之間具有多條並行路徑,因此網路的容錯性能良好,一般不會出現單點故障;信答採用商用設備取代高性能交換設備,大幅度降低網路設備開銷;網路直徑小,能夠保證視頻、在線會與等服務對網路實時性的要求;拓撲結構規則、對稱,利於網路布線及自動化配置、優化升級等。

        Fat-Tree結構也存在一定的缺陷:Fat-Tree結構的擴展規模在理論上受限於核心交換機的埠數目,不利於數據中心的長期發展要求;對於Pod內部,Fat-Tree容錯性能差,對底層交換設備故障非常敏感,當底層交換設備故障時,難以保證服務質量;拓撲結構的特點決定了網路不能很好的支持one-to-all及all-to-all網路通信模式,不利於部署MapRece、Dryad等現代高性能應用;網路中交換機與伺服器的比值較大,在一定程度上使得網路設備成本依然很高,不利於企業的經濟擾巧發展。

7. 傳統優化演算法和現代優化演算法包括哪些.區別是什麼

1. 傳統優化演算法一般是針對結構化的問題,有較為明確的問題和條件描述,如線性規劃,二次規劃,整數規劃,混合規劃,帶約束和不帶約束條件等,即有清晰的結構信息;而智能優化演算法一般針對的是較為普適的問題描述,普遍比較缺乏結構信息。

2. 傳統優化演算法不少都屬於凸優化范疇,有唯一明確的全局最優點;而智能優化演算法針對的絕大多數是多極值問題,如何防止陷入局部最優而盡可能找到全局最優是採納智能優化演算法的根本原因:對於單極值問題,傳統演算法大部分時候已足夠好,而智能演算法沒有任何優勢;對多極值問題,智能優化演算法通過其有效設計可以在跳出局部最優和收斂到一個點之間有個較好的平衡,從而實現找到全局最優點,但有的時候局部最優也是可接受的,所以傳統演算法也有很大應用空間和針對特殊結構的改進可能。

3. 傳統優化演算法一般是確定性演算法,有固定的結構和參數,計算復雜度和收斂性可做理論分析;智能優化演算法大多屬於啟發性演算法,能定性分析卻難定量證明,且大多數演算法基於隨機特性,其收斂性一般是概率意義上的,實際性能不可控,往往收斂速度也比較慢,計算復雜度較高。

8. 拓撲排序演算法實現

#define MAXV 30
#define OK 1
#define ERROR 0
typedef char VertexType;
typedef int status;

typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;

typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAXV ];

typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;

int LocateVex(ALGraph G,char m);
status Creat_Graph1(ALGraph &G);
int dfs_topsort(ALGraph g,int n);//拓撲排序演算法

void dfs(ALGraph g,int v,int&flag);//深度優先搜索
void Menuselect();
頭文件

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<iostream.h>
#include"head.h"

int visited[MAXV];
int finished[MAXV];

int dfs_topsort(ALGraph g,int n)
{
int flag=1,i;
for(i=0;i<n;i++) //置初值
{
visited[i]=0;
finished[i]=1;
}
i=0; //從編號為0的頂點開始遍歷
while(flag&&i<n)
{
if(visited[i]==0)
{ i++;
dfs(g,i,flag);}

}
return flag;
}

void dfs(ALGraph g,int v,int&flag)
{
ArcNode *p;
printf("%d\n",v);
finished[v]=0;
visited[v]=0;
p=g.vertices[v]. firstarc; //找頂點V的第一條弧
while(p!=NULL)
{

if(visited[p->adjvex]==0)
{
dfs(g,p->adjvex,flag);
finished[p->adjvex ]=1;
}
p=p->nextarc ;
}
}

int LocateVex(ALGraph G,char m){
int i;
for(i=0;i<G.vexnum;i++)
if(G.vertices[i].data==m)return i;
return ERROR;
}

status Creat_Graph1(ALGraph &G){
int i,j,r;char m,n;ArcNode *p;
printf("請輸入頂點數:");
scanf("%d",&G.vexnum);
printf("請輸入邊數:");
scanf("%d",&G.arcnum);
printf("請輸入圖的所有頂點:");
for(i=0;i<G.vexnum;i++)
{cin>裂笑>肆或含G.vertices[i].data;G.vertices[i].firstarc=NULL;}
printf("請輸入圖的所有邊,如A->B邊記團孫為AB,:\n");
for(r=0;r<G.arcnum;r++){
cin>>m;cin>>n;
i=LocateVex(G,m);j=LocateVex(G,n);

p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
}
return OK;
}

void Menuselect(){
int done=1,select,i;
ALGraph g;
printf("please input select number");
while(done){
printf("請輸入操作碼:");
scanf("%d",&select);
switch(select){
case 1:
if(Creat_Graph1(g))printf("OK");
printf("\n\n");
break;

case 2:
dfs_topsort( g,g.vexnum);
printf("\n\n");
break;
case 3:
done=0;
break;
default:printf("輸入的操作碼錯誤\n\n");
}
}
}
實現文件

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<iostream.h>
#include"head.h"
void main()
{

printf("圖的拓撲排序");

Menuselect();

}
主文件

9. BP演算法及其改進

傳統的BP演算法及其改進演算法的一個很大缺點是:由於其誤差目標函數對於待學習的連接權值來說非凸的,存在局部最小點,對網路進行訓練時,這些演算法的權值一旦落入權值空間的局部最小點就很難跳出,因而無法達到全局最小點(即最優點)而使得網路訓練失敗。針對這些缺陷,根據凸函數及其共軛的性質,利用Fenchel不等式,使用約束優化理論中的罰函數方法構造出了帶有懲罰項的新誤差目標函數。

用新的目標函數對前饋神經網路進行優化訓練時,隱層輸出也作為被優化變數。這個目標函數的主要特點有:
1.固定隱層輸出,該目標函數對連接權值來說是凸的;固定連接權值,對隱層輸出來說是凸的。這樣在對連接權值和隱層輸出進行交替優化時,它們所面對的目標函數都是凸函數,不存在局部最小的問題,演算法對於初始權值的敏感性降低;
2.由於懲罰因子是逐漸增大的,使得權值的搜索空間變得比較大,從而對於大規模的網路也能夠訓練,在一定程度上降低了訓練過程陷入局部最小的可能性。

這些特性能夠在很大程度上有效地克服以往前饋網路的訓練演算法易於陷入局部最小而使網路訓練失敗的重大缺陷,也為利用凸優化理論研究前饋神經網路的學習演算法開創了一個新思路。在網路訓練時,可以對連接權值和隱層輸出進行交替優化。把這種新演算法應用到前饋神經網路訓練學習中,在學習速度、泛化能力、網路訓練成功率等多方面均優於傳統訓練演算法,如經典的BP演算法。數值試驗也表明了這一新演算法的有效性。

本文通過典型的BP演算法與新演算法的比較,得到了二者之間相互關系的初步結論。從理論上證明了當懲罰因子趨於正無窮大時新演算法就是BP演算法,並且用數值試驗說明了懲罰因子在網路訓練演算法中的作用和意義。對於三層前饋神經網路來說,懲罰因子較小時,隱層神經元局部梯度的可變范圍大,有利於連接權值的更新;懲罰因子較大時,隱層神經元局部梯度的可變范圍小,不利於連接權值的更新,但能提高網路訓練精度。這說明了在網路訓練過程中懲罰因子為何從小到大變化的原因,也說明了新演算法的可行性而BP演算法則時有無法更新連接權值的重大缺陷。

礦體預測在礦床地質中佔有重要地位,由於輸入樣本量大,用以往前饋網路演算法進行礦體預測效果不佳。本文把前饋網路新演算法應用到礦體預測中,取得了良好的預期效果。

本文最後指出了新演算法的優點,並指出了有待改進的地方。

關鍵詞:前饋神經網路,凸優化理論,訓練演算法,礦體預測,應用

Feed forward Neural Networks Training Algorithm Based on Convex Optimization and Its Application in Deposit Forcasting
JIA Wen-chen (Computer Application)
Directed by YE Shi-wei

Abstract

The paper studies primarily the application of convex optimization theory and algorithm for feed forward neural networks』 training and convergence performance.

It reviews the history of feed forward neural networks, points out that the training of feed forward neural networks is essentially a non-linear problem and introces BP algorithm, its advantages as well as disadvantages and previous improvements for it. One of the big disadvantages of BP algorithm and its improvement algorithms is: because its error target function is non-convex in the weight values between neurons in different layers and exists local minimum point, thus, if the weight values enter local minimum point in weight values space when network is trained, it is difficult to skip local minimum point and reach the global minimum point (i.e. the most optimal point).If this happening, the training of networks will be unsuccessful. To overcome these essential disadvantages, the paper constructs a new error target function including restriction item according to convex function, Fenchel inequality in the conjugate of convex function and punishment function method in restriction optimization theory.
When feed forward neural networks based on the new target function is being trained, hidden layers』 outputs are seen as optimization variables. The main characteristics of the new target function are as follows:

1.With fixed hidden layers』 outputs, the new target function is convex in connecting weight variables; with fixed connecting weight values, the new target function is convex in hidden layers』 outputs. Thus, when connecting weight values and hidden layers』 outputs are optimized alternately, the new target function is convex in them, doesn』t exist local minimum point, and the algorithm』s sensitiveness is reced for original weight values .
2.Because the punishment factor is increased graally, weight values 』 searching space gets much bigger, so big networks can be trained and the possibility of entering local minimum point can be reced to a certain extent in network training process.

Using these characteristics can overcome efficiently in the former feed forward neural networks』 training algorithms the big disadvantage that networks training enters local minimum point easily. This creats a new idea for feed forward neural networks』 learning algorithms by using convex optimization theory .In networks training, connecting weight variables and hidden layer outputs can be optimized alternately. The new algorithm is much better than traditional algorithms for feed forward neural networks. The numerical experiments show that the new algorithm is successful.

By comparing the new algorithm with the traditional ones, a primary conclusion of their relationship is reached. It is proved theoretically that when the punishment factor nears infinity, the new algorithm is BP algorithm yet. The meaning and function of the punishment factor are also explained by numerical experiments. For three-layer feed forward neural networks, when the punishment factor is smaller, hidden layer outputs』 variable range is bigger and this is in favor to updating of the connecting weights values, when the punishment factor is bigger, hidden layer outputs』 variable range is smaller and this is not in favor to updating of the connecting weights values but it can improve precision of networks. This explains the reason that the punishment factor should be increased graally in networks training process. It also explains feasibility of the new algorithm and BP algorithm』s disadvantage that connecting weigh values can not be updated sometimes.

Deposit forecasting is very important in deposit geology. The previous algorithms』 effect is not good in deposit forecasting because of much more input samples. The paper applies the new algorithm to deposit forecasting and expectant result is reached.
The paper points out the new algorithm』s strongpoint as well as to-be-improved places in the end.

Keywords: feed forward neural networks, convex optimization theory, training algorithm, deposit forecasting, application

傳統的BP演算法及其改進演算法的一個很大缺點是:由於其誤差目標函數對於待學習的連接權值來說非凸的,存在局部最小點,對網路進行訓練時,這些演算法的權值一旦落入權值空間的局部最小點就很難跳出,因而無法達到全局最小點(即最優點)而使得網路訓練失敗。針對這些缺陷,根據凸函數及其共軛的性質,利用Fenchel不等式,使用約束優化理論中的罰函數方法構造出了帶有懲罰項的新誤差目標函數。

用新的目標函數對前饋神經網路進行優化訓練時,隱層輸出也作為被優化變數。這個目標函數的主要特點有:
1.固定隱層輸出,該目標函數對連接權值來說是凸的;固定連接權值,對隱層輸出來說是凸的。這樣在對連接權值和隱層輸出進行交替優化時,它們所面對的目標函數都是凸函數,不存在局部最小的問題,演算法對於初始權值的敏感性降低;
2.由於懲罰因子是逐漸增大的,使得權值的搜索空間變得比較大,從而對於大規模的網路也能夠訓練,在一定程度上降低了訓練過程陷入局部最小的可能性。

這些特性能夠在很大程度上有效地克服以往前饋網路的訓練演算法易於陷入局部最小而使網路訓練失敗的重大缺陷,也為利用凸優化理論研究前饋神經網路的學習演算法開創了一個新思路。在網路訓練時,可以對連接權值和隱層輸出進行交替優化。把這種新演算法應用到前饋神經網路訓練學習中,在學習速度、泛化能力、網路訓練成功率等多方面均優於傳統訓練演算法,如經典的BP演算法。數值試驗也表明了這一新演算法的有效性。

本文通過典型的BP演算法與新演算法的比較,得到了二者之間相互關系的初步結論。從理論上證明了當懲罰因子趨於正無窮大時新演算法就是BP演算法,並且用數值試驗說明了懲罰因子在網路訓練演算法中的作用和意義。對於三層前饋神經網路來說,懲罰因子較小時,隱層神經元局部梯度的可變范圍大,有利於連接權值的更新;懲罰因子較大時,隱層神經元局部梯度的可變范圍小,不利於連接權值的更新,但能提高網路訓練精度。這說明了在網路訓練過程中懲罰因子為何從小到大變化的原因,也說明了新演算法的可行性而BP演算法則時有無法更新連接權值的重大缺陷。

礦體預測在礦床地質中佔有重要地位,由於輸入樣本量大,用以往前饋網路演算法進行礦體預測效果不佳。本文把前饋網路新演算法應用到礦體預測中,取得了良好的預期效果。

本文最後指出了新演算法的優點,並指出了有待改進的地方。

關鍵詞:前饋神經網路,凸優化理論,訓練演算法,礦體預測,應用

Feed forward Neural Networks Training Algorithm Based on Convex Optimization and Its Application in Deposit Forcasting
JIA Wen-chen (Computer Application)
Directed by YE Shi-wei

Abstract

The paper studies primarily the application of convex optimization theory and algorithm for feed forward neural networks』 training and convergence performance.

It reviews the history of feed forward neural networks, points out that the training of feed forward neural networks is essentially a non-linear problem and introces BP algorithm, its advantages as well as disadvantages and previous improvements for it. One of the big disadvantages of BP algorithm and its improvement algorithms is: because its error target function is non-convex in the weight values between neurons in different layers and exists local minimum point, thus, if the weight values enter local minimum point in weight values space when network is trained, it is difficult to skip local minimum point and reach the global minimum point (i.e. the most optimal point).If this happening, the training of networks will be unsuccessful. To overcome these essential disadvantages, the paper constructs a new error target function including restriction item according to convex function, Fenchel inequality in the conjugate of convex function and punishment function method in restriction optimization theory.
When feed forward neural networks based on the new target function is being trained, hidden layers』 outputs are seen as optimization variables. The main characteristics of the new target function are as follows:

1.With fixed hidden layers』 outputs, the new target function is convex in connecting weight variables; with fixed connecting weight values, the new target function is convex in hidden layers』 outputs. Thus, when connecting weight values and hidden layers』 outputs are optimized alternately, the new target function is convex in them, doesn』t exist local minimum point, and the algorithm』s sensitiveness is reced for original weight values .
2.Because the punishment factor is increased graally, weight values 』 searching space gets much bigger, so big networks can be trained and the possibility of entering local minimum point can be reced to a certain extent in network training process.

Using these characteristics can overcome efficiently in the former feed forward neural networks』 training algorithms the big disadvantage that networks training enters local minimum point easily. This creats a new idea for feed forward neural networks』 learning algorithms by using convex optimization theory .In networks training, connecting weight variables and hidden layer outputs can be optimized alternately. The new algorithm is much better than traditional algorithms for feed forward neural networks. The numerical experiments show that the new algorithm is successful.

By comparing the new algorithm with the traditional ones, a primary conclusion of their relationship is reached. It is proved theoretically that when the punishment factor nears infinity, the new algorithm is BP algorithm yet. The meaning and function of the punishment factor are also explained by numerical experiments. For three-layer feed forward neural networks, when the punishment factor is smaller, hidden layer outputs』 variable range is bigger and this is in favor to updating of the connecting weights values, when the punishment factor is bigger, hidden layer outputs』 variable range is smaller and this is not in favor to updating of the connecting weights values but it can improve precision of networks. This explains the reason that the punishment factor should be increased graally in networks training process. It also explains feasibility of the new algorithm and BP algorithm』s disadvantage that connecting weigh values can not be updated sometimes.

Deposit forecasting is very important in deposit geology. The previous algorithms』 effect is not good in deposit forecasting because of much more input samples. The paper applies the new algorithm to deposit forecasting and expectant result is reached.
The paper points out the new algorithm』s strongpoint as well as to-be-improved places in the end.

Keywords: feed forward neural networks, convex optimization theory, training algorithm, deposit forecasting, application

BP演算法及其改進

2.1 BP演算法步驟

1°隨機抽取初始權值ω0;

2°輸入學習樣本對(Xp,Yp),學習速率η,誤差水平ε;

3°依次計算各層結點輸出opi,opj,opk;

4°修正權值ωk+1=ωk+ηpk,其中pk=,ωk為第k次迭代權變數;

5°若誤差E<ε停止,否則轉3°。

2.2 最優步長ηk的確定

在上面的演算法中,學習速率η實質上是一個沿負梯度方向的步長因子,在每一次迭代中如何確定一個最優步長ηk,使其誤差值下降最快,則是典型的一維搜索問題,即E(ωk+ηkpk)=(ωk+ηpk)。令Φ(η)=E(ωk+ηpk),則Φ′(η)=dE(ωk+ηpk)/dη=E(ωk+ηpk)Tpk。若ηk為(η)的極小值點,則Φ′(ηk)=0,即E(ωk+ηpk)Tpk=-pTk+1pk=0。確定ηk的演算法步驟如下

1°給定η0=0,h=0.01,ε0=0.00001;

2°計算Φ′(η0),若Φ′(η0)=0,則令ηk=η0,停止計算;

3°令h=2h, η1=η0+h;

4°計算Φ′(η1),若Φ′(η1)=0,則令ηk=η1,停止計算;

若Φ′(η1)>0,則令a=η0,b=η1;若Φ′(η1)<0,則令η0=η1,轉3°;

5°計算Φ′(a),若Φ′(a)=0,則ηk=a,停止計算;

6°計算Φ′(b),若Φ′(b)=0,則ηk=b,停止計算;

7°計算Φ′(a+b/2),若Φ′(a+b/2)=0,則ηk=a+b/2,停止計算;

若Φ′(a+b/2)<0,則令a=a+b/2;若Φ′(a+b/2)>0,則令b=a+b/2

8°若|a-b|<ε0,則令,ηk=a+b/2,停止計算,否則轉7°。

2.3 改進BP演算法的特點分析

在上述改進的BP演算法中,對學習速率η的選取不再由用戶自己確定,而是在每次迭代過程中讓計算機自動尋找最優步長ηk。而確定ηk的演算法中,首先給定η0=0,由定義Φ(η)=E(ωk+ηpk)知,Φ′(η)=dE(ωk+ηpk)/dη=E(ωk+ηpk)Tpk,即Φ′(η0)=-pTkpk≤0。若Φ′(η0)=0,則表明此時下降方向pk為零向量,也即已達到局部極值點,否則必有Φ′(η0)<0,而對於一維函數Φ(η)的性質可知,Φ′(η0)<0則在η0=0的局部范圍內函數為減函數。故在每一次迭代過程中給η0賦初值0是合理的。

改進後的BP演算法與原BP演算法相比有兩處變化,即步驟2°中不需給定學習速率η的值;另外在每一次修正權值之前,即步驟4°前已計算出最優步長ηk。

閱讀全文

與對傳統拓撲演算法進行改進相關的資料

熱點內容
程序員那麼可愛歌曲完整版 瀏覽:904
為什麼購買pdf 瀏覽:43
操作系統代碼編譯 瀏覽:483
程序員東北大學 瀏覽:426
編譯忽略空字元 瀏覽:117
多店鋪阿里雲伺服器教程 瀏覽:378
單片機求初值 瀏覽:420
安卓機如何在電腦備份圖片 瀏覽:925
ca證書加密機價格 瀏覽:798
天乾地支年份演算法 瀏覽:796
程序員打造的視頻 瀏覽:7
java和php通信 瀏覽:680
為什麼黑程序員 瀏覽:163
程序員男生 瀏覽:456
戴爾文件夾內文件怎麼置頂 瀏覽:582
雲伺服器6m網速 瀏覽:722
vivo手機中國聯通伺服器地址 瀏覽:862
工程總控編譯失敗 瀏覽:707
燕趙紅楓app如何下載 瀏覽:867
php查殺軟體 瀏覽:878