演算法參數
① 粒子群演算法的參數設置
從上面的例子我們可以看到應用PSO解決優化問題的過程中有兩個重要的步驟: 問題解的編碼和適應度函數 不需要像遺傳演算法一樣是二進制編碼(或者採用針對實數的遺傳操作.例如對於問題 f(x) = x1^2 + x2^2+x3^2 求解, 粒子可以直接編碼為 (x1, x2, x3), 而適應度函數就是f(x). 接著我們就可以利用前面的過程去尋優.這個尋優過程是一個疊代過程, 中止條件一般為設置為達到最大循環數或者最小錯誤
PSO中並沒有許多需要調節的參數,下面列出了這些參數以及經驗設置
粒子數: 一般取 20 – 40. 其實對於大部分的問題10個粒子已經足夠可以取得好的結果, 不過對於比較難的問題或者特定類別的問題, 粒子數可以取到100 或 200
粒子的長度: 這是由優化問題決定, 就是問題解的長度
粒子的范圍: 由優化問題決定,每一維可以設定不同的范圍
Vmax: 最大速度,決定粒子在一個循環中最大的移動距離,通常設定為粒子的范圍寬度,例如上面的例子里,粒子 (x1, x2, x3) x1 屬於 [-10, 10], 那麼 Vmax 的大小就是 20
學習因子: c1 和 c2 通常等於 2. 不過在文獻中也有其他的取值. 但是一般 c1 等於 c2 並且范圍在0和4之間
中止條件: 最大循環數以及最小錯誤要求. 例如, 在上面的神經網路訓練例子中, 最小錯誤可以設定為1個錯誤分類, 最大循環設定為2000, 這個中止條件由具體的問題確定.
全局PSO和局部PSO: 我們介紹了兩種版本的粒子群優化演算法: 全局版和局部版. 前者速度快不過有時會陷入局部最優. 後者收斂速度慢一點不過很難陷入局部最優. 在實際應用中, 可以先用全局PSO找到大致的結果,再用局部PSO進行搜索. 代碼來自2008年數學建模東北賽區B題, #includestdafx.h#include<math.h>#include<time.h>#include<iostream>#include<fstream>usingnamespacestd;intc1=2;//加速因子intc2=2;//加速因子doublew=1;//慣性權重doubleWmax=1;//最大慣性權重doubleWmin=0.6;//最小慣性權重intKmax=110;//迭代次數intGdsCnt;//物資總數intconstDim=10;//粒子維數intconstPNum=50;//粒子個數intGBIndex=0;//最優粒子索引doublea=0.6;//適應度調整因子doubleb=0.5;//適應度調整因子intXup[Dim];//粒子位置上界數組intXdown[Dim]=;//粒子位置下界數組intValue[Dim];//初始急需度數組intVmax[Dim];//最大速度數組classPARTICLE;//申明粒子節點voidCheck(PARTICLE&,int);//約束函數voidInput(ifstream&);//輸入變數voidInitial();//初始化相關變數doubleGetFit(PARTICLE&);//計算適應度voidCalculateFit();//計算適應度voidBirdsFly();//粒子飛翔voidRun(ofstream&,int=2000);//運行函數classPARTICLE//微粒類{public:intX[Dim];//微粒的坐標數組intXBest[Dim];//微粒的最好位置數組intV[Dim];//粒子速度數組doubleFit;//微粒適合度doubleFitBest;//微粒最好位置適合度};PARTICLEParr[PNum];//粒子數組intmain()//主函數{ofstreamoutf(out.txt);ifstreaminf(data.txt);//關聯輸入文件inf>>GdsCnt;//輸入物資總數Input(inf);Initial();Run(outf,100);system(pause);return0;}voidCheck(PARTICLE&p,intcount)//參數:p粒子對象,count物資數量{srand((unsigned)time(NULL));intsum=0;for(inti=0;i<Dim;i++){if(p.X>Xup)p.X=Xup;elseif(p.X<Xdown)p.X=Xdown;if(p.V>Vmax)p.V=Vmax;elseif(p.V<0)p.V=0;sum+=p.X;}while(sum>count){p.X[rand()%Dim]--;sum=0;for(inti=0;i<Dim;i++){if(p.X>Xup)p.X=Xup;elseif(p.X<Xdown)p.X=Xdown;if(p.V>Vmax)p.V=Vmax;elseif(p.V<0)p.V=0;sum+=p.X;}}voidInput(ifstream&inf)//以inf為對象輸入數據{for(inti=0;i<Dim;i++)inf>>Xup;for(inti=0;i<Dim;i++)inf>>Value;}voidInitial()//初始化數據{GBIndex=0;srand((unsigned)time(NULL));//初始化隨機函數發生器for(inti=0;i<Dim;i++)Vmax=(int)((Xup-Xdown)*0.035);for(inti=0;i{for(intj=0;j<Dim;j++){Parr.X[j]=(int)(rand()/(double)RAND_MAX*(Xup[j]-Xdown[j])-Xdown[j]+0.5);Parr.XBest[j]=Parr.X[j];Parr.V[j]=(int)(rand()/(double)RAND_MAX*(Vmax[j]-Vmax[j]/2));}Parr.Fit=GetFit(Parr);Parr.FitBest=Parr.Fit;if(Parr.Fit>Parr[GBIndex].Fit)GBIndex=i;}}doubleGetFit(PARTICLE&p)//計算對象適應度{doublesum=0;for(inti=0;i<Dim;i++)for(intj=1;j<=p.X;j++)sum+=(1-(j-1)*a/(Xup-b))*Value;returnsum;}voidCalculateFit()//計算數組內各粒子的適應度{for(inti=0;i{Parr.Fit=GetFit(Parr);}}voidBirdsFly()//粒子飛行尋找最優解{srand((unsigned)time(NULL));staticintk=10;w=Wmax-k*(Wmax-Wmin)/Kmax;k++;for(inti=0;i{for(intj=0;j<Dim;j++){Parr.V[j]=(int)(w*Parr.V[j]);Parr.V[j]+=(int)(c1*rand()/(double)RAND_MAX*(Parr.XBest[j]-Parr.X[j]);Parr.V[j]+=c2*rand()/(double)RAND_MAX*(Parr[GBIndex].XBest[j]-Parr.X[j]));}}Check(Parr,GdsCnt);for(intj=0;j<Dim;j++){Parr.X[j]+=Parr.V[j];Check(Parr,GdsCnt);}CalculateFit();for(inti=0;i{if(Parr.Fit>=Parr.FitBest){Parr.FitBest=Parr.Fit;for(intj=0;j<Dim;j++)Parr.XBest[j]=Parr.X[j];}}GBIndex=0;for(inti=0;i{if(Parr.FitBest>Parr[GBIndex].FitBest&&i!=GBIndex)GBIndex=i;}}voidRun(ofstream&outf,intnum)//令粒子以規定次數num飛行{for(inti=0;i<num;i++){BirdsFly();outf<<(i+1)<<ends<for(intj=0;j<Dim;j++)outf<outf<<endl;}cout<<Done!<<endl;}
② PID演算法的參數怎麼確定
PID是自動控制理論里的一種控制方法,PID的意思分別代表了比例、積分和微分。具體是什麼意思呢?解釋如下:
首先,我們有一個狀態量,這個狀態量在整個過程中,我們希望通過輸入一個控制量,使這個狀態量發生變化,並盡量的接近目標量。比如,在航線控制中,狀態量是飛機當前的飛行航向,目標量是飛機為到達目標點而應該飛行的目標航向,控制量則是我們對其進行控制的方向舵面,或橫滾角度。我們通過調整方向舵面、橫滾角度來控制飛機的當前飛行航向,使之盡量接近為壓航線而應該飛行的目標航向。
那麼我們如何給出這個控制量,比如給哪個方向的、多大的方向舵量呢?最簡單的考慮,是按照當前航向與目標航向的偏差大小來決定給多大的方向舵量:方向舵量p = P * (目標航向 – 當前航向)。這個方向舵量p,就是PID控制里的P部分,即比例部分。
那麼,是不是只要有了P,我們的控制就完成了呢?實際上有了P,在大多數情況下,我們可以控制飛機朝目標量去接近,但可能會出現一些情況,比如,當飛機的安裝有偏差(我們稱之為系統誤差),導致我們輸出一個左5方向舵給舵機的時候,飛機才能直飛;當不給方向舵,即方向舵放在中位時,飛機會右偏。我們想像一下這個時候如果只有P項控制會有什麼後果:假設初始狀態是飛機飛行航向和目標航向一致,按P輸出飛機方向舵應該在中位。而這時候,由於系統安裝誤差的存在,會導致飛機偏右,於是偏離了目標航向,然後P項控制會輸出一個左舵,來修正航向偏差,剛開始的時候由於偏差量很小,輸出的這個左舵也很小,於是飛機繼續右偏,然後導致這個左舵加大,最終到達5,使飛機直飛,但這時候的飛行航向與目標航向始終存在一個偏差,這就是P的局限,無法修正系統誤差。於是I項積分控制就出場了。
I項的輸出這樣定義:方向舵量i = I * (偏差和)。偏差和是當前航向和目標航向的偏差,每計算一次累加一次,一直累加到上次的值,再加上這次計算時當前航向和目標航向的偏差。即這個偏差和是跟以前的累積誤差有關的。同樣是上面的例子,I項的效果就這樣體現:當飛機飛行航向與目標航向始終存在偏差時,I項將這個值累加上,比如說是5度吧,於是在P項之上,再疊加一個I*5的修正量,增加了一個左舵,比如說是2,然後導致飛機的飛行航向與目標航向的偏差會小一些。也許這一次計算輸出的控制量並沒有完全消除誤差,但下一次再計算時,如果還有誤差,於是會繼續再增加輸出控制量,使誤差再小,於是經過多次計算後,使I項始終輸出一個左5的舵量,使誤差歸零。這就是I項的作用,消除系統誤差。
D項的意思是微分。為了便於解釋,我們假設不存在系統誤差,I項為0。比如當目標航向為0度,當前航向為30度時,根據P項作用,會輸出一個左舵,假設為左15吧,使飛機向左轉向,於是當前航向逐漸減小,比如減小到20度的時候,P項輸出的左舵也會減小到左10。那麼,當飛機轉到0度時,跟目標航向一致時,P項輸出方向舵回到中立位,飛機是否就保持0度直飛了呢?XX是否定的。由於飛機的慣性,飛機在左轉彎時產生了一個左轉彎的速率,導致飛機航向回到目標航向無偏差且方向舵回中後,仍然還會繼續左轉,然後產生負的偏差,P項再輸出右方向舵,然後再回中。如果P項合適,我們看到的就是一個逐漸收斂於目標航向的飛行航向,即先左過頭,然後右過頭,再左過頭,再右過頭……最後過頭量越來越小,最終到達目標航向。而D項的作用,就是盡量消除這個過頭量,使之盡快貼近目標航向。
D項的定義是:方向舵d = D * (當前狀態量 – 上一次的狀態量)。在這個例子中,當飛機在從30度的航向,左轉彎到0度目標航向的過程中,D項的輸出實際上是轉彎角速率的比例值,並且方向與P項相反,這樣當飛機比較接近0度目標航向時,由於P值已經很小了,而這時候如果轉彎速率不小,D項就輸出一個右方向舵,抵消過快的轉彎速率,阻止飛機航向到達目標航向後繼續沖過頭。
最後,方向舵量 = 方向舵量p + 方向舵量i + 方向舵量d,為完整的輸出。根據飛行的表現,通過對P、I、D系數的調整,最終使輸出的控制量能夠盡快的控制狀態量貼近目標量,並消除系統誤差,避免過度震盪。
在完整的固定翼飛控系統中,除了航向通道需要PID控制外,其餘需要控制的通道還有:副翼舵->目標橫滾角、升降舵->目標俯仰角、目標俯仰角->高度差、油門舵->空速、目標航向->偏航距。
③ 各種計算方法中的相關參數
地下水地源熱泵適宜區可開采資源量的計算方法有水熱均衡法和地下水量折演算法,本項目選擇地下水量折演算法;地埋管地源熱泵經濟區可開采資源量採用換熱量現場測試法計算。對評價方法及相關參數分別介紹如下。
圖5-2可開采資源量評價框架圖
1.體積法評價方法
利用體積法進行評價計算時,應先確定潛水水位,再確定主要地層厚度、物性參數。
(1)在包氣帶中,其淺層地溫能靜態儲量按下式計算:
北京淺層地溫能資源
式中:QR——淺層地溫能儲存總量,kJ;
QS——岩土體中的熱儲存量,kJ;
QW——岩土體所含水中的熱儲存量,kJ;
QA——岩土中所含空氣中的熱儲存量,kJ。
其中:
北京淺層地溫能資源
式中:ρS——岩土體密度,kg/m3;
Cs——岩土體比熱容,kJ/(kg·℃);
φ——岩土體的孔隙率;
M——計算面積,m2;
d1——包氣帶厚度,m;
ΔT——利用溫差,℃。
北京淺層地溫能資源
式中:ρW——水的密度,取1000kg/m3;
CW——水的比熱容,取4.18kJ/(kg·℃);
ω——岩土體的含水率;
北京淺層地溫能資源
ρA——空氣的密度,取1.29kg/m3;
CA——空氣的比熱容,1.008kJ/(kg·℃)。
(2)在含水層和相對隔水層中,其地熱能儲存量按下式計算:
北京淺層地溫能資源
式中:QR——淺層地溫能儲存總量,kJ;
QS——岩土體中的熱儲存量,kJ;
QW——岩土體所含水中的熱儲存量,kJ;
北京淺層地溫能資源
d2為潛水位至計算下限的岩土體厚度。
通過以上介紹,體積法計算簡便、物理意義明確,而且使用范圍廣泛,不僅適用於鬆散岩層分布區的淺層地溫能靜態儲量評價,而且同樣適用於基岩地區的淺層地溫能靜態儲量評價;不僅適用於地下水地源熱泵適宜區靜態儲量的計算,而且適用於地埋管地源熱泵經濟區靜態儲量的計算。由於本次研究工作在國內尚屬首次,故選用體積法。在本次工作的基礎上,對於淺層地溫能資源條件相近區域可以採用類比法進行評價,拓展評價區域范圍。
體積法相關參數:根據公式(5-1)~(5-6),可以確定主要參數分為評價范圍參數和岩土體物性參數兩個方面,分別為:評價區域面積(M,m2)、計算厚度(d2、d2,m)、岩土體孔隙率(φ,%)、岩土體天然含水率(ω,%)、岩土體天然密度(ρs,kg/m3)、岩土體比熱容[Cs,kJ/(kg·℃)]、利用溫差(ΔT,℃)。
2.地下水熱泵適宜區可開采資源量計算方法
(1)水熱均衡法:主要通過研究區的水、熱均衡計算,了解地下水的水、熱儲存量和水、熱補排情況。
水均衡
北京淺層地溫能資源
式中:qin——補給量,m3/d;
qout——排泄量,m3/d;
Δqw——存量的變化量,m3/d。
在包氣帶中,岩土體水分的補給項有:降水入滲量、灌溉入滲量等;排泄項有:植物蒸騰量、土面蒸發量、下滲補給地下水的量等。
地下水補給項有:降水入滲量、灌溉入滲量、渠系入滲量、河流入滲量、側向補給量、越流補給量等;排泄項有:潛水蒸發量、人工開采量、側向排泄量、泉排泄量、河流排泄量、越流排泄量等。
熱均衡
北京淺層地溫能資源
式中:Qin——熱收入量,kW;
Qout——熱支出量,kW;
ΔQ——熱儲存量的變化量,kW。
在包氣帶,熱的收入項有:太陽照射熱量、大地熱流量、地表水向岩土體散發的熱量、側向傳導流入的熱量等;支出項有:向大氣散發的熱量、向地表水散發的熱量、側向傳導流出的熱量等。
在地下水中,熱的收入項有:太陽照射熱量、大地熱流量、側向傳導流入的熱量等;支出項有:向大氣散發的熱量、水排泄帶走的熱量、側向傳導流出的熱量等。恆溫帶以下,熱收入項沒有太陽照射熱量。
(2)地下水量折演算法:地下水量折演算法適用於地下水地源熱泵適宜區淺層地溫能可開采資源量的計算,其表達式如下:
北京淺層地溫能資源
式中:Qq——評價區淺層地溫能可開采量,kW;
Qh——單井淺層地溫能可開采量,kW;
n——可鑽抽水井數;
T——土地利用系數。
其中:
北京淺層地溫能資源
式中:Qh——單井淺層地溫能可開采量,kW;
qw——單井出水量,m3/d;
△T——地下水利用溫差,℃;
Cw——水的比熱容,kJ/(kg·℃)。
土地利用系數,居民點、公共用地和其他用地的比例。根據《北京市土地利用現狀遙感解譯圖》中草地、園地、居民及工礦用地和未利用土地面積等占土地面積的27.81%,在以上區域內,開展地下水地源熱泵工程時,還要考慮建築布局、建築負荷需求、建築佔地面積、資源承載力、地下水連通性等因素的影響,取土地利用系數為22%(27.81%×0.8)。
地下水量折演算法相關參數:根據式(5-9)~(5-10),在地下水地源熱泵適宜區,利用地下水量折演算法評價可開采資源量的相關參數主要有:單井出水量(qw,m3/d)、可鑽抽水井數(n)、溫差(ΔT,℃)、土地利用系數(T)。
(3)地下水地源熱泵適宜區可開采資源量評價方法小結:水熱均衡法需要有長期動態監測數據的支撐,適用於評價淺層地溫能資源可利用量的保證程度;地下水量折演算法可操作性強,較好地反映了地下水地源熱泵利用淺層地溫能資源的特點,因此本次研究採用該方法。
3.地埋管熱泵適宜區可開采資源量評價方法
(1)換熱量現場測試法:換熱量現場測試法適用於地埋管熱泵經濟區淺層地溫能可開采資源量的計算,其表達式如下:
北京淺層地溫能資源
式中:Dq——評價區淺層地溫能可開采資源量,kW;
D——單孔換熱量,kW;
n——可鑽換熱孔數;
T——土地利用系數。
北京淺層地溫能資源
式中:kz——綜合傳熱系數,W/(m·℃);
ΔT——溫差,℃,即為U形管內循環液平均溫度與岩土體原始溫度之差;
L——雙U形地埋管換熱孔長度,m。
土地利用系數,居民點、公共用地和其他用地的比例與地下水量折演算法相同為27.81%,開展地埋管地源熱泵工程時,還要考慮建築布局、建築負荷需求、建築佔地面積、資源承載力等因素,取土地利用系數為8.3%(27.81%×0.3)。
(2)換熱量現場測試法相關參數:根據式(5-11)~(5-12),在地埋管地源熱泵適宜區,利用換熱量現場測試法評價可開采資源量的相關參數主要有:綜合傳熱系數[kz,W/(m·℃)]、可鑽換熱孔數(n)、溫差(ΔT)、土地利用系數(T)。
4.淺層地溫能資源評價相關參數的分類
由前面評價方法的分析可知,在評價計算淺層地溫能資源靜態儲量和可開采量時需要確定的參數見表5-1。
表5-1資源量評價相關參數分類表
5.淺層地溫能資源評價相關參數的意義
(1)區域地質、水文地質條件:淺層地溫能資源蘊藏在地下岩土體內,其儲藏、運移以及開采利用都受到區域地質、水文地質條件的嚴格制約,不同區域的資源利用方式和規模存在較大差異,因此,全面了解北京平原區的地質、水文地質條件十分重要。
(2)第四系岩性厚度:北京平原是由多條河流沖洪積作用形成的,在沖洪積扇的頂部至下部,第四系厚度逐漸增大,含水層由單一、厚度較大逐漸過渡為多層、單層厚度較薄,顆粒由粗變細,岩性由砂卵礫石、粘性土互層逐漸過渡為多層的粘砂、粉細砂。
(3)淺層地溫能資源條件分區:根據淺層地溫能資源開發利用形式的不同,考慮到項目的初投資、運行狀況以及地質環境影響等因素,結合北京市不同地區地質、水文地質條件的特點,劃分出地下水地源熱泵系統的適宜區、較適宜區、一般適宜區和嚴禁應用區,以及地埋管地源熱泵系統的經濟區、較經濟區和欠經濟區。
(4)地下水水位(m):地下水水位是評價淺層地溫能資源的一個重要參數。在評價淺層地溫能資源靜態儲量時,將地下水面以上劃分為包氣帶,將地下水面以下劃分為飽水帶,再分別計算靜態儲量;在評價地下水地源熱泵適宜區可開采資源量時,地下水水位一方面影響單井出水量,一方面也會影響單井回灌量。
(5)變溫層厚度(m):地殼按熱力狀態從上而下分為變溫帶、常溫帶、增溫帶。變溫帶的地溫受氣溫的控制呈周期性的晝夜變化和年變化,隨著深度的增加,變化幅度很快變小。氣溫的影響趨於零的深度叫常溫帶,常溫帶以上地層厚度即為變溫層厚度。
(6)岩土體天然密度(g/cm3):單位體積岩土體的質量稱為岩土體的密度。
(7)岩土體天然含水率(%):岩土體中水的質量與岩土體顆粒質量之比,稱為岩土體的天然含水率。
(8)岩土體孔隙率(%):岩土體中孔隙所佔體積與總體積之比稱為岩土體的孔隙率。
(9)岩土體熱導率[W/(m·℃)]:在岩土體內部垂直於導熱方向取兩個相距1m,面積為1m2的平行平面,若兩個平面的溫度相差1℃,則在1秒內從一個平面傳導至另一個平面的熱量就規定為該岩土體的熱導率。
(10)岩土體的比熱容[kJ/(kg·℃)]:單位質量的岩土體溫度升高1℃吸收的熱量(或降低1℃釋放的熱量)叫做該岩土體的比熱容。
(11)單井出水量(qw,m3/d):抽水井的出水量(5m降深)。
(12)單位涌水量[m3/(h·m)]:單位涌水量是井抽水水位降深換算為1m時的單井出水量。
(13)滲透系數(m/d):是綜合反映土體滲透能力的一個指標,水力梯度等於1時的滲透流速。
(14)抽水井影響半徑(m):機井在抽水時,水位下降,井周圍附近含水層的水向井內流動,形成一個以抽水井為中心的水位下降漏斗,這個水位下降漏斗的半徑叫影響半徑。
(15)土地利用系數(T)[kz,W/(m·℃)]:居民點、公共用地和其他用地的比例。
(16)綜合傳熱系數[kz,W/(m·℃)]:進行換熱量現場測試,計量地埋管換熱器的進出水溫度、流量,在熱交換達到穩定的條件下,計算得到鑽孔每延長米在溫度變化1℃(循環液平均溫度與岩土體原始溫度比)時的換熱量即為綜合傳熱系數。
(17)平均導熱系數[kp,W/(m·℃)]:該參數是利用Fluent軟體模擬換熱孔的溫度場影響半徑時需要設置的一個重要參數,也是表現當地岩土體平均換熱能力的一個重要指標。其定義為在當地水文地質環境下,當傳熱達到穩定時,假設岩土體是勻質的,在岩土體內部垂直於導熱方向取兩個相距1m,面積為1m2的平行平面,若兩個平面的溫度相差1℃,則在1秒內從一個平面傳導至另一個平面的熱量就是該岩土體的平均導熱系數。
④ 請問怎樣確定遺傳演算法的參數
遺傳演算法的參數設計對於不同的實際問題都不同
目前還沒有完整的理論來參考
種群大小越大 收斂效果越好 但計算量也會增大
在空間復雜度(內存大小)和計算速度允許的情況下 盡量大一些 不過如果問題的解空間不大或者是變化的話 則要另加考慮(解空間不大就沒必要把種群定得很大了)
交叉率。。。一般都是全部參與交叉(染色體都會交叉嘛) 只是交叉方式的設計問題,有單點,多點,隨機等等 另外還要考慮交叉後解的可行性 對於具體問題,可以各種方法都試一下(這方面的理論實在是很弱)
變異率不要設高,一般在%5以下,變異是為了避免把個體局限在較優的局部解空間內(模擬退火演算法就有這個問題,所以經常會結合遺傳演算法)
總結一下,這個演算法的理論支持目前還較弱,但是很實用,反正算得快,多算幾遍,參數多改改,一般和近似解都很接近
⑤ 遞歸演算法的參數傳遞問題
採用遞歸方法來解決問題,必須符合以下三個條件:
1、可以把要解決的問題轉化為一個新問題,而這個新的問題的解決方法仍與原來的解決方法相同,只是所處理的對象有規律地遞增或遞減。
說明:解決問題的方法相同,調用函數的參數每次不同(有規律的遞增或遞減),如果沒有規律也就不能適用遞歸調用。
2、可以應用這個轉化過程使問題得到解決。
說明:使用其他的辦法比較麻煩或很難解決,而使用遞歸的方法可以很好地解決問題。
3、必定要有一個明確的結束遞歸的條件。
說明:一定要能夠在適當的地方結束遞歸調用。不然可能導致系統崩潰。
實例:
例:使用遞歸的方法求n!
當n>1時,求n!的問題可以轉化為n*(n-1)!的新問題。
比如n=5:
第一部分:5*4*3*2*1 n*(n-1)!
第二部分:4*3*2*1 (n-1)*(n-2)!
第三部分:3*2*1 (n-2)(n-3)!
第四部分:2*1 (n-3)(n-4)!
第五部分:1 (n-5)! 5-5=0,得到值1,結束遞歸。
源程序:
fac(int n)
{int t;
if(n==1)||(n==0) return 1;
else
{ t=n*fac(n-1);
return t;}
}
main( )
{int m,y;
printf(「Enter m:」);
scanf(「%d」,&m);
if(m<0) printf(「Input data Error! 」);
else
{y=fac(m);
printf(「 %d! =%d 」,m,y);
}
}
遞歸演算法是把問題轉化為規模縮小了的同類問題的子問題。然後遞歸調用函數(或過程)來表示問題的解。一個過程(或函數)直接或間接調用自己本身,這種過程(或函數)叫遞歸過程(或函數)。
⑥ PID演算法中的三個參數設定及其C源程序
有,可以看看書上那個經典的方法,一般的計算機控制的書都有哈
⑦ msrcr演算法怎麼選取合適參數
distinct可以剔重,語句如下:
select distinct a,b from table where c>3;
剔重也可以用row_number() over函數,語句如下:
select * from (
select a,b, row_number() over(partition by a,b order by c) rn
from table
where c>3 ) ac
where ac.rn=1;
⑧ 粒子群優化的演算法參數
PSO參數包括:群體規模m,慣性權重w,加速常數c1和c2,最大速度Vmax,最大代數Gmax,解空間[Xmin Xmax]。
Vmax決定在當前位置與最好位置之間的區域的解析度(或精度)。如果Vmax太高,微粒可能會飛過好解,如果Vmax太小,微粒不能進行足夠的探索,導致陷入局部優值。該限制有三個目的:防止計算溢出;實現人工學習和態度轉變;決定問題空間搜索的粒度。
慣性權重w使微粒保持運動的慣性,使其有擴展搜索空間的趨勢,有能力探索新的區域。
加速常數c1和c2代表將每個微粒推向pbest和gbest位置的統計加速項的權重。低的值允許微粒在被拉回來之前可以在目標區域外徘徊,而高的值導致微粒突然的沖向或者越過目標區域。
如果沒有後兩部分,即c1 = c2 = 0,微粒將一直以當前的速度飛行,直到到達邊界。由於它只能搜索有限的區域,將很難找到好的解。
如果沒有第一部分,即w = 0,則速度只取決於微粒當前的位置和它們歷史最好位置pbest和gbest,速度本身沒有記憶性。假設一個微粒位於全局最好位置,它將保持靜止。而其它微粒則飛向它本身最好位置pbest和全局最好位置gbest的加權中心。在這種條件下,微粒群將統計的收縮到當前的全局最好位置,更象一個局部演算法。
在加上第一部分後,微粒有擴展搜索空間的趨勢,即第一部分有全局搜索的能力。這也使得w的作用為針對不同的搜索問題,調整演算法全局和局部搜索能力的平衡。
如果沒有第二部分,即c1 = 0,則微粒沒有認知能力,也就是「只有社會(social-only)」的模型。在微粒的相互作用下,有能力到達新的搜索空間。它的收斂速度比標准版本更快,但是對復雜問題,比標准版本更容易陷入局部優值點。
如果沒有第三部分,即c2 = 0,則微粒之間沒有社會信息共享,也就是「只有認知(cognition-only)」的模型。因為個體間沒有交互,一個規模為m的群體等價於m個單個微粒的運行。因而得到解的幾率非常小。
⑨ 遺傳演算法 參數擬合
我來說說我的思路吧
這種擬合問題的目的是求出擬合函數的參數,如多項式函數的系數
那麼可以把擬合函數值與Y的絕對差值當做目標函數和適應度函數,相對應所求的擬合函數的參數作為遺傳演算法中的基因編碼,每組參數對應一個擬合函數相當於一個染色體個體
遺傳演算法採用基本遺傳演算法即可
單點交叉,高斯變異
初步設想,望請指正
⑩ 神經網路演算法中,參數的設置或者調整,有什麼方法可以採用
若果對你有幫助,請點贊。
神經網路的結構(例如2輸入3隱節點1輸出)建好後,一般就要求神經網路里的權值和閾值。現在一般求解權值和閾值,都是採用梯度下降之類的搜索演算法(梯度下降法、牛頓法、列文伯格-馬跨特法、狗腿法等等),這些演算法會先初始化一個解,在這個解的基礎上,確定一個搜索方向和一個移動步長(各種法算確定方向和步長的方法不同,也就使各種演算法適用於解決不同的問題),使初始解根據這個方向和步長移動後,能使目標函數的輸出(在神經網路中就是預測誤差)下降。 然後將它更新為新的解,再繼續尋找下一步的移動方向的步長,這樣不斷的迭代下去,目標函數(神經網路中的預測誤差)也不斷下降,最終就能找到一個解,使得目標函數(預測誤差)比較小。
而在尋解過程中,步長太大,就會搜索得不仔細,可能跨過了優秀的解,而步長太小,又會使尋解過程進行得太慢。因此,步長設置適當非常重要。
學習率對原步長(在梯度下降法中就是梯度的長度)作調整,如果學習率lr = 0.1,那麼梯度下降法中每次調整的步長就是0.1*梯度,
而在matlab神經網路工具箱里的lr,代表的是初始學習率。因為matlab工具箱為了在尋解不同階段更智能的選擇合適的步長,使用的是可變學習率,它會根據上一次解的調整對目標函數帶來的效果來對學習率作調整,再根據學習率決定步長。
機制如下:
if newE2/E2 > maxE_inc %若果誤差上升大於閾值
lr = lr * lr_dec; %則降低學習率
else
if newE2 < E2 %若果誤差減少
lr = lr * lr_inc;%則增加學習率
end
詳細的可以看《神經網路之家》nnetinfo里的《[重要]寫自己的BP神經網路(traingd)》一文,裡面是matlab神經網路工具箱梯度下降法的簡化代碼
若果對你有幫助,請點贊。
祝學習愉快