優化演算法實現
⑴ 最優化原理的演算法實現
動態規劃的主要難點在於理論上的設計,也就是上面4個步驟的確定,一旦設計完成,實現部分就會非常簡單。使用動態規劃求解問題,最重要的就是確定動態規劃三要素:問題的階段,每個階段的狀態以及從前一個階段轉化到後一個階段之間的遞推關系。遞推關系必須是從次小的問題開始到較大的問題之間的轉化,從這個角度來說,動態規劃往往可以用遞歸程序來實現,不過因為遞推可以充分利用前面保存的子問題的解來減少重復計算,所以對於大規模問題來說,有遞歸不可比擬的優勢,這也是動態規劃演算法的核心之處。確定了動態規劃的這三要素,整個求解過程就可以用一個最優決策表來描述,最優決策表示一個二維表,其中行表示決策的階段,列表示問題狀態,表格需要填寫的數據一般對應此問題的在某個階段某個狀態下的最優值(如最短路徑,最長公共子序列,最大價值等),填表的過程就是根據遞推關系,從1行1列開始,以行或者列優先的順序,依次填寫表格,最後根據整個表格的數據通過簡單的取捨或者運算求得問題的最優解。下面分別以求解最大化投資回報問題和最長公共子序列問題為例闡述用動態規劃演算法求解問題的一般思路。
實例:
最大化投資回報問題
某人有一定的資金用來購買不同面額的債卷,不同面額債卷的年收益是不同的,求給定資金,年限以及債卷面額、收益的情況下怎樣購買才能使此人獲得最大投資回報。
程序輸入約定:第一行第一列表示資金(1000的倍數)總量,第二列表示投資年限;第二行表示債卷面額總數;從第三行開始每行表示一種債卷,佔用兩列,前一列表示債卷面額,後一列表示其年收益,如下輸入實例,
10000 1
2
4000 400
3000 250
程序實現如下,注釋幾乎說明了一切,所以不再另外分析。
/// 此數組是演算法的關鍵存儲結構,用來存儲不同階段各種債卷
/// 組合下對應可獲取的最大利息。
int saifa[80005];
/// 此函數用於計算當前債卷在不同購買額下的最優利息情況,
/// 注意此時的利息情況是基於上一次債卷的情況下計算得到的,
/// 也就是說當前利息最優是基於上一次利息最優的基礎上計算出來的,
/// 這也正好體現了動態規劃中「最優化原則」:不管前面的策略如何,
/// 此後的決策必須是基於當前狀態(由上一次決策產生)的最優決策。
/*
動態規劃的求解過程一般都可以用一個最優決策表來描述,
對於本程序,以示例輸入為例,對於第一年,其最優決策表如下:
0 1 2 3 4 5 6 7 8 9 10(*1000) -- (1)
0 0 0 0 400 400 400 400 800 800 800 -- (2)
0 0 0 250 400 400 500 650 800 900900 -- (3)
(1) -- 表示首先選利息為400的債卷在對應資金下的最優利息。
(2) -- 表示可用來購買債卷的資金。
(3) -- 表示在已有狀態下再選擇利息為300的債卷在對應資金下的最優利息。
注意上面表格,在求購買利息為300的債卷獲得的最優收益的時候,
參考了以前的最優狀態,以3行8列的650為例,7(*1000)可以
在以前購買了0張4000的債卷的基礎上再2張3000的,也可以在以前購
買了1張4000的基礎上再買1張3000,經比較取其收益大的,這就是典
型的動態規劃中的當前最優狀態計算。
本程序中把上面的最優決策二維表用一個一維數組表示,值得借鑒。
*/
void add(int a,int b)
{
cout << a << << b << endl; // for debug
for(int i=0;i<=80000;i++)
{
if(i+a > 80000)
{
break;
}
if(saifa[i]+b > saifa[i+a]) // 累計同時購買多種債卷時的利息
{
saifa[i+a] = saifa[i] + b;
}
if(i<200) // for debug
cout << i << -<< saifa[i] << ;
}
cout << endl; // for debug
}
int main(void)
{
int n,d,money,year,pay,bond;
int ii,i;
scanf(%d,&n);
for(ii=0;ii<n;ii++)
{
memset(saifa,0,sizeof(saifa));
scanf(%d%d,&money,&year);
scanf(%d,&d);
for(i=0;i<d;i++)
{
scanf(%d%d,&pay,&bond);
add(pay/1000,bond);
}
// 計算指定年限內最優組合的本金利息總額
for(i=0;i<year;i++)
{
cout << saifa[money/1000]<< ; // for debug
money += saifa[money/1000];
}
cout << endl; // for debug
printf(%d
,money);
}
return 0;
}
上述程序實現方法同樣適合於背包問題,最優庫存問題等,只是針對具體情況,最優決策表的表示和生成會有所不同。
⑵ 經濟最優單目標遺傳優化演算法怎麼實現
我給你一個標准遺傳演算法程序供你參考:
該程序是遺傳演算法優化BP神經網路函數極值尋優:
%% 該代碼為基於神經網路遺傳演算法的系統極值尋優
%% 清空環境變數
clc
clear
%% 初始化遺傳演算法參數
%初始化參數
maxgen=100; %進化代數,即迭代次數
sizepop=20; %種群規模
pcross=[0.4]; %交叉概率選擇,0和1之間
pmutation=[0.2]; %變異概率選擇,0和1之間
lenchrom=[1 1]; %每個變數的字串長度,如果是浮點變數,則長度都為1
bound=[-5 5;-5 5]; %數據范圍
indivials=struct('fitness',zeros(1,sizepop), 'chrom',[]); %將種群信息定義為一個結構體
avgfitness=[]; %每一代種群的平均適應度
bestfitness=[]; %每一代種群的最佳適應度
bestchrom=[]; %適應度最好的染色體
%% 初始化種群計算適應度值
% 初始化種群
for i=1:sizepop
%隨機產生一個種群
indivials.chrom(i,:)=Code(lenchrom,bound);
x=indivials.chrom(i,:);
%計算適應度
indivials.fitness(i)=fun(x); %染色體的適應度
end
%找最好的染色體
[bestfitness bestindex]=min(indivials.fitness);
bestchrom=indivials.chrom(bestindex,:); %最好的染色體
avgfitness=sum(indivials.fitness)/sizepop; %染色體的平均適應度
% 記錄每一代進化中最好的適應度和平均適應度
trace=[avgfitness bestfitness];
%% 迭代尋優
% 進化開始
for i=1:maxgen
i
% 選擇
indivials=Select(indivials,sizepop);
avgfitness=sum(indivials.fitness)/sizepop;
%交叉
indivials.chrom=Cross(pcross,lenchrom,indivials.chrom,sizepop,bound);
% 變異
indivials.chrom=Mutation(pmutation,lenchrom,indivials.chrom,sizepop,[i maxgen],bound);
% 計算適應度
for j=1:sizepop
x=indivials.chrom(j,:); %解碼
indivials.fitness(j)=fun(x);
end
%找到最小和最大適應度的染色體及它們在種群中的位置
[newbestfitness,newbestindex]=min(indivials.fitness);
[worestfitness,worestindex]=max(indivials.fitness);
% 代替上一次進化中最好的染色體
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=indivials.chrom(newbestindex,:);
end
indivials.chrom(worestindex,:)=bestchrom;
indivials.fitness(worestindex)=bestfitness;
avgfitness=sum(indivials.fitness)/sizepop;
trace=[trace;avgfitness bestfitness]; %記錄每一代進化中最好的適應度和平均適應度
end
%進化結束
%% 結果分析
[r c]=size(trace);
plot([1:r]',trace(:,2),'r-');
title('適應度曲線','fontsize',12);
xlabel('進化代數','fontsize',12);ylabel('適應度','fontsize',12);
axis([0,100,0,1])
disp('適應度 變數');
x=bestchrom;
% 窗口顯示
disp([bestfitness x]);
⑶ 演算法優化有哪些主要方法和作用
優化演算法有很多,關鍵是針對不同的優化問題,例如可行解變數的取值(連續還是離散)、目標函數和約束條件的復雜程度(線性還是非線性)等,應用不同的演算法。
對於連續和線性等較簡單的問題,可以選擇一些經典演算法,如梯度、Hessian
矩陣、拉格朗日乘數、單純形法、梯度下降法等。
而對於更復雜的問題,則可考慮用一些智能優化演算法,如遺傳演算法和蟻群演算法,此外還包括模擬退火、禁忌搜索、粒子群演算法等。
⑷ 什麼是智能優化演算法
群體智能優化演算法是一類基於概率的隨機搜索進化演算法,各個演算法之間存在結構、研究內容、計算方法等具有較大的相似性。因此,群體智能優化演算法可以建立一個基本的理論框架模式:
Step1:設置參數,初始化種群;
Step2:生成一組解,計算其適應值;
Step3:由個體最有適應著,通過比較得到群體最優適應值;
Step4:判斷終止條件示否滿足?如果滿足,結束迭代;否則,轉向Step2;
各個群體智能演算法之間最大不同在於演算法更新規則上,有基於模擬群居生物運動步長更新的(如PSO,AFSA與SFLA),也有根據某種演算法機理設置更新規則(如ACO)。
(4)優化演算法實現擴展閱讀
優化演算法有很多,經典演算法包括:有線性規劃,動態規劃等;改進型局部搜索演算法包括爬山法,最速下降法等,模擬退火、遺傳演算法以及禁忌搜索稱作指導性搜索法。而神經網路,混沌搜索則屬於系統動態演化方法。
優化思想裡面經常提到鄰域函數,它的作用是指出如何由當前解得到一個(組)新解。其具體實現方式要根據具體問題分析來定。
⑸ 結構優化的目標,優化方法,優化演算法哪些,及實現流程
產業結構優化升級目標:提高利潤,增強產品競爭力
區域協調發展的目標:減小貧富差距
產業結構優化措施:政策扶持科技企業
區域協調發展的措施:加大欠發達地區投入,沿海地區產業重心向內地礌功辟嘉轉黃辨萎玻聯遷移
簡單的說
⑹ 粒子群優化演算法C語言實現
隨著計算機技術的不斷發展,軟體的規模越來越大,隨之而來軟體的錯誤也越來越隱蔽,造成的後果也越來越嚴重。因此,提高軟體質量及可靠性己成為軟體工程領域的重要任務。而軟體測試則是保證軟體質量、提高軟體可靠性的關鍵。但軟體測試需要耗費巨大的人力、物力和時間,故提高軟體測試的自動化程度對於確保軟體開發質量、降低軟體開發成本都是非常重要的。其中,提高生成測試用例的自動化程度又是提高軟體測試自動化程度的關鍵。 本文分析了軟體測試中測試用例自動生成技術的發展現狀和粒子群優化演算法的基本原理及實現步驟,並詳細研究了幾種重要的改進的粒子群優化演算法。在此基礎上,改進了基本粒子群優化演算法,提出了基於改進的粒子群優化演算法的測試用例自動生成系統框架,並給出了基於改進的粒子群優化演算法的測試用例自動生成演算法。最後,採用C語言編程實現了基於改進的粒子群優化演算法的測試用例自動生成演算法,用具體實例對其進行了實驗,並對結果數據進行了分析。 本文提出的基於改進的粒子群優化演算法的測試用例自動生成演算法具有簡單、易實現、設置參數少和收斂速度快等特點。實驗結果表明,使用本文提出的演算法測試用例自動生成的效果明顯優於遺傳演算法等測試用例自動生成演算法。 本文提出的基於改進的粒子群優化演算法的測試用例自動生成演算法提高了測試用例自動生成的效率,但該演算法只實現了數值類型的數據,而且還存在手動操作問題,這將是作者下一步的主要研究方向。
⑺ tensorflow的各種優化演算法怎麼實現的
如何高效的學習TensorFlow代碼?目前TensorFlow代碼已超過40w行,從代碼量上來看,絕不是一個能夠迅速上手的小項目。所以,想要精通TensorFlow的同學需要做好心理准備。對於想要學習TensorFlow(以下簡稱TF)的人,根據目的不同,可以簡單分為以下2類:1.研究學者,僅僅需要TF這個平台實現深度學習演算法,無需了解太多底層原理2.好學的行業內人員(比如我⊙﹏⊙),不僅需要了解演算法模型,同時還要熟悉TF平台的原理。在運算元、通信、模型優化等方面進行平台的二次開發的人。研究學者:你們可以考慮使用Keras,python寫的深度神經網路庫,已經實現了絕大部分神經網路,如:RNN、GRU、LSTM,CNN,Pooling,Full-Connected,以及sigmoid、tanh、Relu、PRelu、SRelu等各種激活函數。並且採用TF/Theano作為後端計算引擎,自己本身擁有一套更高層的API,可以同時跑在TF/Theano平台上。相對於TF來說,這個學習壓力小了很多,我們公司負責演算法的同事也是用Keras來寫模型,然後我再用TF的API來實現分布式部署。附:開發人員:對於我們這類人來說,首先需要弄清平台的很多名稱、概念、定義,@賈揚清曾說過TF有太多的Abstraction需要學習。誠然,這加大了我們的學習難度。但是,這也說明Google是想要把這個平台做大做強的,所以才會花時間去設計這一套框架和統一的結構。特別是讀了部分源碼後,更有這種感觸。那麼,具體要怎麼開始呢?極客學院有翻譯部分TF的官方文檔,對於初步了解Tensor、DAG、Operator、Variable、Device、Optimizer等是幫助的。在看完這些概念後,有一個MNIST的例子程序作為TF的入門。這個樣例用一個簡單的Softmax實現了手寫體數字識別的神經網路,只有一層參數。同時還介紹了Session、tf.placeholder、圖的計算等重要概念。在看完這個樣例後,如果理解了DAG和Session,可以繼續看用卷積神經網路實現的MNIST,准確率上升到了99%,相對於單層Softmax的92%左右,已經接近目前最高的准確率了。TFv0.8發布了分布式模型,我也研究了將近1個月,才把Seq2seq機器翻譯改造成了分布式,但是現在公司不讓發布出來ORZ。好消息是,我改寫了社區的MNIST分布式程序,並且已經合並到master分支了。所以,如果想要繼續學習分布式的話,我建議可以看一下那份代碼。比較遺憾的是,極客學院目前沒有翻譯分布式的教程,所以大家得移步TF官網(貌似被牆了)。由於分布式的資料較少,我這里簡單梳理下概念,大家在官網會看到他們的定義:TF採用了PS/Worker的結構來定義集群,其中PS(parameterserver):存儲variable(模型參數),主要負責參數更新和發放;Worker:存儲operator,主要負責圖計算和梯度計算(TF使用Optimizer實現了自動化的梯度計算);job:由於工作類型不同,用job_name來區分ps和workertask:對於每個worker來說,具體做什麼任務(算什麼圖)也有可能不同,用task_index區分device:指具體的CPU/GPU,通常PS綁定到CPU上,Worker綁定到GPU上,各取所長。syncReplicaOptimizer:同步優化器,其本質仍然是用普通優化器進行梯度計算,但是通過Queue機制和Coordinator多線程協同實現了所有worker的梯度匯總和平均,最終將梯度傳回PS進行參數更新。以上幾個概念對於分布式的理解非常重要。當然,想要完全弄懂,還得不斷的看文檔和源碼。源碼我推薦幾個python目錄下非常值得看的基礎類定義:framework/Ops.py:定義了Tensor、Graph、Opreator類等Ops/Variables.py:定義了Variable類
⑻ 想知道優化演算法是什麼
優化演算法是通過改善計算方式來最小化或最大化損失函數E(x)。模型內部有些參數是用來計算測試集中目標值Y的真實值和預測值的偏差程度的,基於這些參數就形成了損失函數E(x),比如說,權重(W)和偏差(b)就是這樣的內部參數,一般用於計算輸出值,在訓練神經網路模型時起到主要作用。
優化演算法分的分類
一階優化演算法是使用各參數的梯度值來最小化或最大化損失函數E(x),最常用的一階優化演算法是梯度下降。函數梯度導數dy/dx的多變數表達式,用來表示y相對於x的瞬時變化率。
二階優化演算法是使用了二階導數也叫做Hessian方法來最小化或最大化損失函數,由於二階導數的計算成本很高,所以這種方法並沒有廣泛使用。
⑼ Miller Rabin演算法的優化實現
Miller-Rabin演算法最為耗時的步驟在2.2模冪操作和2.3.2 循環。對演算法的優化實現主要集中在對這兩部分運算的優 化。對模冪操作的優化有兩種途徑:減少模冪演算法中的模乘 操作和優化模乘操作。在求模冪的過程中不能先求冪最後一次求模,這樣會產生一個十分巨大的中間結果,造成實際的 不可操作,所以在求模冪的演算法中用模乘代替乘法,使得中 間結果的長度不超過模的長度。對模冪演算法的優化,我們使 用改進的滑動窗口演算法結合Montgomery模乘和模平方演算法。表1給出模冪演算法的比較。 模冪演算法 預先計算 模平方 模乘法 模平方 模乘法 最壞情況 平均情況 平方乘演算法滑動窗口類演算法 改進的滑動窗口演算法 011 02k -32k-1-1 tt-(k-1)≤次數≤t t-(k-1)≤次數≤t t (t/k)-1 (t/k)-1 t/2 t/k(2k-1)/ 2kk≤t/k(2 -1)/ * 模冪演算法比較,其中k是窗口大小,根據情況 選擇以達到最優,t是指數的二進制位數。 優化的模冪演算法描述:輸入: x,e=(e tet-1?e1e0)2,其中et=1,k≥1( 窗口大小)輸出: xe mod n1、預計算1.1、x1← MontMul(x, R2,n),x2←MontSqu(x 1, n)1.2、對i 從1 到2k-1-1計算x2i+1←MontMul(x2i-1, x2,n)2、A←R,i ←t3、 當i≥ 0時作下面的操作: 3.1、如果ei=0,A←MontSqu(A ,n),i← i-13.2、否則找到最長的位串eiei-1?es使得i-s+1≤k並且es=1,計算3.2.1、A <-A2i-s+1 , (利 用MontSqu函數計算)3.2.2、A <-A*X(ee ...e )2 ,(利 用MontMul函數計算)3.2.3、i ←s-14、A←MontMul(A ,1 ,n)5、返回A其中MontMul(x,y,n) 是Montgomery模乘函數,函數輸出 結果為x*y*R-1 mod n,MontSqu(x,n) 是Montgomery模平方函 數,輸出結果為x2R-1 mod n。模乘演算法如果採用大整數乘法 和除法求模乘,因為涉及耗時的除法操作,所以要相對較 慢,結合大整數乘法和Barrett求模演算法可以用2(n2+3n+1) 步 單精度乘法完成。使用Montgomery求模演算法結合大整數乘法 演算法,可以 在 2n(n+1) 步單精度乘法內完成演算法。 Montgomery模平方的操作可以在3n(n+1) /2步單精度乘法內 完成,而Barrett模平方需要(3n(n+3)/2+1) 步單精度乘法。結 合改進的滑動窗口演算法和Montgomery類演算法,可以得到目前 非特殊情況下的最優的模冪演算法。在Miller-Rabin演算法的2.3.2循環中的模平方操作我們沒有 使用Montgomery模平方演算法,因為該演算法給出的結果帶有R-1這個參數,在2.3.2循環中處理掉這個參數將占整個循環運 行時間中的很大部分,尤其是在循環的控制參數s 相對較小的時候。我們在這里使用大整數平方演算法結合Barrett求模算 法,2.3.2的循環最壞情況需要(s-1)(3n(n+3)/2+1)步單精度乘法。
⑽ 如何用粒子群優化(PSO)演算法實現多目標優化
粒子群演算法,也稱粒子群優化演算法(ParticleSwarmOptimization),縮寫為PSO,是近年來發展起來的一種新的進化演算法(EvolutionaryAlgorithm-EA)。PSO演算法屬於進化演算法的一種,和模擬退火演算法相似,它也是從隨機解出發,通過迭代尋找最優解,它也是通過適應度來評價解的品質,但它比遺傳演算法規則更為簡單,它沒有遺傳演算法的「交叉」(Crossover)和「變異」(Mutation)操作,它通過追隨當前搜索到的最優值來尋找全局最優。這種演算法以其實現容易、精度高、收斂快等優點引起了學術界的重視,並且在解決實際問題中展示了其優越性。粒子群演算法是一種並行演算法。