尋優演算法整數
A. 求人工神經網路的具體演算法,數學模型,比如求一個函數最優值之類的,不要各種亂七八糟的介紹,謝謝
神經網路就像多項式或者線性模型一樣,是個看不見表達式的模型,它的表達式就是網路,它比一般模型具有更高的自由度和彈性;同時它是一個典型的黑箱模型方法;比多項式等模型還黑。優化演算法,就是尋優的演算法,所謂尋優過程,就是尋找使目標函數最小時(都是統一表示成尋找使函數具有最小值)的自變數的值。回歸或者擬合一個模型,例如用一個多項式模型去擬合一組數據,其本質就是尋找使殘差平方和最小的參數值,這就是一個尋優的過程,其實就是尋找使函數F(x)值最小時的x的值;對於這個具體的尋找過程就涉及到演算法問題,就是如何計算。所謂演算法,是數值分析的一個范疇,就是解這問題的方法;例如一個一元二次方程 x^2-3x+1=0的解法,因為簡單可以直接求解,也可以用牛頓逐個靠近的方法求解,也即是迭代,慢慢接近真實解,如此下去不斷接近真值,要注意迭代演算法是涉及演算法精度的,這些迭代演算法是基於計算機的,演算法的初衷也是用近似的演算法用一定的精度來接近真實值。 比如上面的方程也可以用遺傳演算法來解,可以從一些初始值最終迭代到最佳解。神經網路在尋找網路的參數即權值的時候,也有尋找使訓練效果最好的過程,這也是尋優的過程,這里涉及到了演算法就是所謂的神經網路演算法,這和最小二乘演算法是一樣的道理;例如做響應面的時候,其實就是二次回歸,用最小二乘得到二次模型的參數,得到一個函數,求最大產物量就是求函數模型的最大值,怎麼算呢?頂點處如果導數為0,這個地方對應的x值就是最優的,二次模型簡單可以用偏導數=0來直接解決,這過程也可以遺傳演算法等來解決。說到底所謂尋優的本質就是,尋找函數極值處對應的自變數的值。
B. 智能演算法參數尋優最佳適應度怎麼看
SVM演算法,粒子群演算法,免疫演算法,種類太多了,各種演算法還有改進版,比如說遺傳神經網路。從某本書上介紹,各種演算法性能、效力等各不同,應依據具體問題選擇演算法。
C. 圖像處理中應用的尋優演算法有哪些
高級點的智能演算法包括粒子演算法、卡爾曼、蟻群、退火、神經網路....
常規的經典演算法包括梯度、Hessian 矩陣、拉格朗日乘數、單純形法、梯度下降法.....
還可以看一下凸優化、線性規劃等等
D. 多目標優化遺傳演算法求解混合整數規劃問題
可以參考多目標尋優遺傳方法的進化思路,把遺傳演算法修改為針對整數規劃的方法就可以
E. 求助matlab編程!!!演算法尋優
你好
像這樣的求最小值,可以用很多演算法,可以用命令窗口編程,或者利用優化工具箱。對於初學者,可以利用optimization toolbox裡面演算法,只要自己寫一個目標函數就可以了。
一般的有約束多變數函數都可以通過fmincon函數求解得到,但是如果初始值選取不恰當也可以可以陷入局部最優。全局最優搜索能力比較強的可能屬智能演算法了,如遺傳演算法等等下面我採用fmincon函數嘗試求解:
目標函數寫好好,保存為funmint.m文件,函數如下;
functionZ=funmint(x)
x1=x(1);
x2=x(2);
x3=x(3);
x4=x(4);
S1=x(5);
S2=x(6);
eg=64.11-0.043-0.49*x2-0.06*x3-0.075*x4-3.258e-4*x1*x2+9.712e-5*x1*x3...
+2.781e-4*x1*x4-4.738e-5*x2*x3-1.212e-3*x2+6.053e-4*x3*x4+...
7.775e-4*x1^2+1.125e-3*x2^2-8.665e-4*x3^2+5.89e-3*x4^2;
sd=-6.02953+0.03583*x1+0.067595*x2-2.90115e-3*x3-0.053463*x4-1.7325e-4*x1*x2+...
1.1525e-4*x1*x3-7.4375e-5*x1*x4-6.3375e-5*x2*x3+4.03125e-4*x2*x4-...
3.16562e-4*x3*x4+3.625e-6*x1^2-1.07375e-4*x2^2-2.68437e-5*x3^2-3.27344e-4*x4^2;
Z=sd+1e7*abs(-eg+0.0518*sd+S1)+1e7*abs(0.1-eg-0.0518*sd+S2);
在命令窗口中輸入下面這些求解代碼:
clear
lb=[60235402100];
ub=[802558029InfInf];
x0=[7024560251010];
options=optimset('Algorithm','active-set');
[x,fval]=fmincon(@funmint,x0,[],[],[],[],lb,ub,[],options)
可以得到一個最小值,以及對應的6個變數如下:
x=[62.9860 244.9435 74.5278 21.3001 1.8670 2.0691]
最小值為:
fval=3.4326
當然你也可以換用其他函數,只要把fmincon換了就可以。優化函數結構都差不多。
希望對你有幫助!
F. 粒子群優化參數尋優
研究PSO參數尋優中,採用粒子群演算法對SVM的參數(懲罰參數C,核函數參數σ)進行最優選擇。PSO是一種進化計算技術,由Eberhart和Kennedy於1995年提出,其思想源於鳥類捕食行為,演算法的數學描述如下(何同弟等,2011):
設在一個D維搜索空間中,由有m個粒子組成的一個群體,其中第i個粒子的位置表示為向量zi=(zi1,zi2,…,ziD),i=1,2,…,m。第i個粒子的飛行速度表示為向量vi=(vi1,vi2,…,viD),其搜索的最佳位置pi=(pi1,pi2,…,piD),整個粒子群搜索到的最優位置pg=(pg1,pg2,…,pgD)。找到這兩個最優位置時,各粒子根據如下公式更新自己的速度和位置:
高光譜遙感影像信息提取技術
式中:i=1,2,…,m;ψ是慣性權重函數,用來控制前面速度對當前速度的影響;c1和c2稱為加速因子,為非負常數;r1和r2是[0,1]的隨機數。
G. 求文檔: Dijkstra 距離尋優演算法程序
http://ke..com/view/7839.htm
這里講得很詳細,也有程序。要不也可以找一個《圖論》方面的書,一般講單源最短路徑都會講這個演算法。
看這個文檔的 例9 ,是Dijkstra演算法求解最短路的例題,附有Matlab源程序。
http://lxy.sjzu.e.cn/jmzt/jpk/jch/51.doc
H. 高分求遺傳演算法程序
遺傳演算法作為一種快速有效的尋優演算法,在工業控制、經濟決策和交通規劃等居多領域得到廣泛應用。其特點就是其不同於傳統的搜索尋優方式而是模擬自然界生物進化過程,通過基因的變異交叉重組使整體得到進化,不斷的進化最終得到最優的組群,即最優解。
下面是一個具體實例,是小可在別人程序的基礎上改寫優化而成。這里首先要建立數學模型,即問題的數學公式描述,數學建模是一門對數學能力有相當要求的課程,一個人的數學能力往往決定其從事工作的層次。下面的程序是求多項式y=x^6-10x^5-26x^4+344x^3+193x^2-1846x-1680在區間[-8,8]的最小值,誤差不超過0.001。對於這個復雜的多項式,可先用matlab繪制函數的大概曲線,確認函數的最小值大概處於[-8,8]之間,再用本程序求出精確解。
程序已在Dev-c++下運行通過,結果正確。
如有什麼疑問,給我消息。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define SUM 20 /* 總共的染色體數量 */
#define MAXloop 1200 /* 最大循環次數 */
#define error 0.01 /* 若兩次最優值之差小於此數則認為結果沒有改變 */
#define crossp 0.7 /* 交叉概率 */
#define mp 0.04 /* 變異概率 */
struct gen /* 定義染色體結構 */
{
int info;
double suitability;
};
struct gen gen_group[SUM];/* 定義一個含有20個染色體的組 */
struct gen gen_new[SUM];
struct gen gen_result; /* 記錄最優的染色體 */
int result_unchange_time; /* 記錄在error前提下最優值未改變的循環次數 */
struct log /* 形成鏈表,記錄每次循環所產生的最優的適應度 */
{
double suitability;
struct log *next;
}llog,*head,*end;
int log_num; /* 鏈表長度 */
void initiate(); /*初始化函數*/
void evaluation(int flag); /*適應度評估和排序函數*/
void cross(); /*交叉函數*/
void selection(); /*選擇函數*/
int record(); /*記錄每次最優解和判斷循環是否終止*/
void mutation(); /*變異函數*/
void showresult(int); /*顯示結果*/
int randsign(double p); /*按概率p產生0,1隨機數,p表示產生值1的概率*/
int randbit(int i,int j);/*產生i,j間的隨機整數*/
int randnum(); /*隨機產生14個位(基因)組成的染色體*/
int convertionD2B(double x); /*編碼*/
double convertionB2D(int x); /*解碼*/
int createmask(int a); /*交叉操作*/
int main()
{
int i,flag;
flag=0;
initiate();
evaluation( 0 );
for( i = 0 ; i < MAXloop ; i++ )
{
cross();
evaluation( 1 );
selection();
if( record() == 1 )
{
flag = 1;
break;
}
mutation();
}
showresult( flag );
system("pause");
return 0
}
void initiate()
{
int i , stime;
long ltime;
ltime=time(NULL);
stime=(unsigned)ltime/2;
srand(stime);
for( i = 0 ; i < SUM ; i++ )
{
gen_group[i].info = randnum();
}
gen_result.suitability=1000;
result_unchange_time=0;
head=end=(struct log *)malloc(sizeof(llog));
if(head==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
end->next = NULL;
log_num = 1;
}
void evaluation(int flag)
{
int i,j,k;
struct gen *genp;
int gentinfo;
double gentsuitability;
double x;
if( flag == 0 )
genp = gen_group;
else genp = gen_new;
for(i = 0 ; i < SUM ; i++)/* 計算各染色體對應的表達式值 */
{
x = convertionB2D( genp[i].info );
genp[i].suitability = x*(x*(x*(x*(x*(x-10)-26)+344)+193)-1846)-1680;
}
for(i = 0 ; i < SUM - 1 ; i++)/* 按表達式的值進行排序 */
{ k=i;
for(j = i + 1 ; j < SUM ; j++)
if( genp[i].suitability > genp[j].suitability ) k=j;
if( k!=i )
{
gentinfo = genp[i].info;
genp[i].info = genp[k].info;
genp[k].info = gentinfo;
gentsuitability = genp[i].suitability;
genp[i].suitability = genp[k].suitability;
genp[k].suitability = gentsuitability;
}
}
}
void cross()
{
int i , j , k ;
int mask1 , mask2;
int a[SUM];
for(i = 0 ; i < SUM ; i++) a[i] = 0;
k = 0;
for(i = 0 ; i < SUM ; i++)
{
if( a[i] == 0)
{
for( ; ; )/* 隨機找到一組未進行過交叉的染色體與a[i]交叉 */
{
j = randbit(i + 1 , SUM - 1);
if( a[j] == 0) break;
}
if(randsign(crossp) == 1)
{
mask1 = createmask(randbit(0 , 14-1));
mask2 = ~mask1;
gen_new[k].info = (gen_group[i].info) & mask1 + (gen_group[j].info) & mask2;
gen_new[k+1].info=(gen_group[i].info) & mask2 + (gen_group[j].info) & mask1;
k = k + 2;
}
else
{
gen_new[k].info=gen_group[i].info;
gen_new[k+1].info=gen_group[j].info;
k=k+2;
}
a[i] = a[j] = 1;
}
}
}
void selection()
{
int i , j , k;
j = 0;
i = SUM/2-1;
if(gen_group[i].suitability < gen_new[i].suitability)
{
for(j = 1 ; j < SUM / 2 ; j++)
{
if(gen_group[i+j].suitability > gen_new[i-j].suitability)
break;
}
}
else
if(gen_group[i].suitability>gen_new[i].suitability)
{
for(j=-1;j>-SUM/2;j--)
{
if(gen_group[i+j].suitability<=gen_new[i-j].suitability)
break;
}
}
for(k=j;k<SUM/2+1;k++)
{
gen_group[i+k].info = gen_new[i-k].info;
gen_group[i+k].suitability = gen_new[i-k].suitability;
}
}
int record()
{
double x;
struct log *r;
r=(struct log *)malloc(sizeof(llog));
if(r==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
r->next = NULL;
end->suitability = gen_group[0].suitability;
end->next = r;
end = r;
log_num++;
x = gen_result.suitability - gen_group[0].suitability;
if(x < 0)x = -x;
if(x < error)
{
result_unchange_time++;
if(result_unchange_time >= 20)return 1;
}
else
{
gen_result.info = gen_group[0].info;
gen_result.suitability = gen_group[0].suitability;
result_unchange_time=0;
}
return 0;
}
void mutation()
{
int i , j , k, m;
double x;
double gmp;
int gentinfo;
double gentsuitability;
gmp = 1 - pow(1 - mp , 11);/* 在基因變異概率為mp時整條染色體的變異概率 */
for(i = 0 ; i < SUM ; i++)
{
if(randsign(gmp) == 1)
{
j = randbit(0 , 14);
m = 1 << j;
gen_group[i].info = gen_group[i].info^m;
x = convertionB2D(gen_group[i].info);
gen_group[i].suitability = x*(x*(x*(x*(x*(x-10)-26)+344)+193)-1846)-1680;
}
}
for(i = 0 ; i < SUM - 1 ; i++)
{ k=i;
for(j = i + 1 ; j < SUM ; j++)
if(gen_group[i].suitability > gen_group[j].suitability) k=j;
if(k!=i)
{
gentinfo = gen_group[i].info;
gen_group[i].info = gen_group[k].info;
gen_group[k].info = gentinfo;
gentsuitability = gen_group[i].suitability;
gen_group[i].suitability = gen_group[k].suitability;
gen_group[k].suitability = gentsuitability;
}
}
}
void showresult(int flag)/* 顯示搜索結果並釋放內存 */
{
int i , j;
struct log *logprint,*logfree;
FILE *logf;
if(flag == 0)
printf("已到最大搜索次數,搜索失敗!");
else
{
printf("當取值%f時表達式達到最小值為%f\n",convertionB2D(gen_result.info),gen_result.suitability);
printf("收斂過程記錄於文件log.txt");
if((logf = fopen("log.txt" , "w+")) == NULL)
{
printf("Cannot create/open file");
exit(1);
}
logprint=head;
for(i = 0 ; i < log_num ; i = i + 5)/* 對收斂過程進行顯示 */
{
for(j = 0 ; (j < 5) & ((i + j) < log_num-1) ; j++)
{
fprintf(logf , "%20f" , logprint->suitability);
logprint=logprint->next;
}
fprintf(logf,"\n\n");
}
}
for(i = 0 ; i< log_num ; i++)/* 釋放內存 */
{
logfree=head;
head=head->next;
free(logfree);
}
fclose(logf);
getch();
}
int randsign(double p)/* 按概率p返回1 */
{
if(rand() > (p * 32768))
return 0;
else return 1;
}
int randbit(int i, int j)/* 產生在i與j之間的一個隨機數 */
{
int a , l;
l = j - i + 1;
a = i + rand() * l / 32768;
return a;
}
int randnum()
{
int x;
x = rand() / 2;
return x;
}
double convertionB2D(int x)
{
double y;
y = x;
y = (y - 8192) / 1000;
return y;
}
int convertionD2B(double x)
{
int g;
g = (x * 1000) + 8192;
return g;
}
int createmask(int a)
{
int mask;
mask=(1 << a) - 1;
return mask;
}
I. 什麼是二進制整數和二進制實數
二進制整數 1. This paper introces a new program method——segment disposal,it can convert binary integer to decimal integer fleetly. 介紹了一種新型高速的二進制整數轉化為十進制數的程序設計方法——分段處理。 2) dyadic 二進 1. The basic conception of dyadic wavelet transform is introced The practical expression of dyadic discrete wavelet transform of digital signal is presented. 介紹了二進小波變換的基本概念 ,給出了數字信號二進離散小波變換的實用表達式 .解釋了二進離散小波分析的工程實現方法和變換過程 .給出了應用實 3) law with 2 二進律 4) binary system 二進制 1. Computers need numerical value change between binary system,octal system and decimal system The fortran77 is used in the programming to perform the numerical value converting. 計算機需要數制轉換,計算機內部使用二進制,二進制八進制十進制之間的數制轉換,FORTRAN77編制,圍繞二進制與小數,完成二進制八進制十進制之間的數制轉換 2. It transferred the identity matrix in common use into the binary system. 應用BP演算法對轉子進行故障診斷 ,首先論述了BP演算法的基本原理 ,然後提出了輸出模式矩陣的改進方法 ,即將常用的單位矩陣來表示的故障模式轉變為二進制結構 ,由此簡化了網路結構 ,明顯減少了樣本訓練次數 ,提高了計算故障診斷中對單一故障尤為有效 .最後通過實例進行分析 ,證明這一方法對提高運算速度十分有效 3. This paper suggested a steady water supplying method With this method,a water supplying system can be designed of several pumps in parallel The pumps work on the principle of binary system,so the water supplying system works well The water pressure is stead 本方法構造的給水系統由M台水泵並聯運行,M台水泵的額定揚程相同,額定流量呈二倍遞變,以數字1表示水泵工作,以數字0表示水泵停止工作,則M台水泵組合工作狀態可用一個M位的二進制數表達,該數還代表水泵組合出水流量。 5) Binary 二進制 1. The algorithm utilizes two important strategies,how to select the item based on its average value and the binary particle swarm optimization algorithm,55 multidimensional 0-1 knapsack test instances are tested by the proced algorithm,all instances achieve optimum solutions. 提出了一種求解多維0-1背包問題的混合粒子群演算法,演算法使用了兩個主要的思想策略,即依據物品單位容積價值的高低選擇物品的貪婪策略和基於二進制編碼的粒子群演算法.用提出的演算法,對55個測試算例進行了測試,得到了全部算例的最優解.測試結果表明,提出的混合粒子群演算法求解多維0-1背包問題,計算結果的優度高,時間短,是求解此問題的有效演算法 2. Because the binary and gray coding modes themselves have defects in poor function of "fin. 對照分析了遺傳演算法三種不同的編碼方式對模擬計算結果的影響,並用簡例對其進行了驗證.結果表明,二進制編碼的誤差最大,格雷數編碼的准確度雖有改進,但仍然很大,採用了浮點數編碼後,大大提高了模擬結果的准確度.這是由於二進制和格雷數編碼本身存在「微調」功能貧乏的缺陷,不適應處理這類問題,浮點數編碼克服了它們的缺陷,從而大大提高了模擬的准確度 3. The binary improved particle swarm optimization(PSO) algorithm for knapsack problem is brought forward,and the detailed realization of the algorithm is illustrated. 提出了用於求解0 1背包問題的二進制編碼的粒子群演算法,闡明了該演算法求解背包問題的具體實現過程.為了提高粒子群演算法的收斂速度,在傳統的二進制編碼的粒子群演算法中嵌入了記憶功能.通過對其他文獻中模擬實例的計算和結果比較,表明該演算法在尋優能力、計算速度和穩定性方面都超過了文獻中提到的遺傳演算法和模擬退火演算法.提出的求解背包問題的二進制改進粒子群演算法,同樣可以應用於其他離散優化問題
J. 偏移(shift)對優化演算法尋優的影響
對函數進行旋轉,最優點的位置並沒有改變;
對函數進行偏移,最優點的位置變了。
旋轉偏移操作,整個坐標位置也全都改變,對尋優演算法有個旋轉不變性的考驗。