❶ 數據結構這門課程第一章概述的知識點有哪些
數據結構這門課第一章概述的知識點包含章節導引,第一節數據的邏輯結構,第二節數據的物理結構,第三節演算法的描述和分析,第四節小結,課後練習,。
❷ 誰能把這個數據結構演算法詳細的講解一下啊
題目的演算法思路是:從第一個結點開始,先設第一個結點為目標結點,然後向後遍歷整個鏈表,看有沒有與第一個結點重復的結點,如果有刪除重復結點,然後按鏈表順序以第二個結點為目標結點,重復上邊的工作,以此類推,直至最後一個結點。對於你上邊給的演算法,可能是你謄寫出錯了,我認為有幾處錯誤。例如
if(p->data==m){
u=p;
p=p->next;
free(u);
這里直接刪掉了u結點,那麼會發現從這時起鏈表已經斷掉了。後邊雖然有q-next=p;但是已是在while循環之外了。我把你這個演算法整理修改了下然後加上了注釋希望能幫到你。
LinkList Delete(LinkList la){//刪除以la為頭結點的單鏈表中的重復元素
pre=la->next;//先讓pre指向第一個結點(非頭結點)
while(pre!=NULL){//這里開始循環,pre指向作對比的目標結點,循環跳出條件pre為空,代表已遍歷整個單鏈表
m=pre->data;//m做為目標結點的值的載體
q=pre;//由p,q兩個指針做游標遍歷pre以後的單鏈表結點,以尋找重復結點,之所以用兩個指針是為了方便刪除操作
p=q->next;
while(p!=NULL){//開始循環遍歷
if(p->data==m){//如果遇到重復結點,進行刪除操作
u=p;//以u為刪除的載體,因為p還要接著使用所以不便刪除
p=p->next;//p向後走一步
q-next=p;//繞過u把p和q相連,從而使鏈表在刪除結點後不斷
free(u);//刪除u,釋放空間
}
else{//如果p不是與pre重復的結點,那麼繼續向後走
q=p;
p=p->next;
}
}//while循環結束,所有與pre重復的結點已刪除,pre繼續向後指進行下一次循環
pre=pre->next;
}//所有結點的重復結點刪除完畢
return la;//返回頭結點
}
❸ 機器學習故事匯-集成演算法
機器學習故事匯-集成演算法
【咱們的目標】系列演算法講解旨在用最簡單易懂的故事情節幫助大家掌握晦澀無趣的機器學習,適合對數學很頭疼的同學們,小板凳走起!
今天咱們就來討論一下傳說中的集成演算法,之前咱們講的演算法都是單兵作戰的(單個模型得到結果),但是回過頭來想一想現在是不是幹啥都講究個合作共贏,所以咱們的模型也是如此。單個演算法確實勢單力薄,假如我們可以把它們組合起來會不會得到更好的效果呢?(演算法們要揭竿起義了,今亡亦死舉大計亦死。。。編不下去了)
在集成演算法中,有三個核心模塊,咱們就一一道來,先來概述一下:
Bagging集成:並行的構造多個基礎模型(隨機森林),每一個基礎模型都各自為政,然後把它們的結果求一個平均就好!
Boosting集成:串列的構造多個基礎模型(Xgboost),每一個基礎模型都要嚴格篩選,在前面的基礎上加進來的新模型後,它們整體的效果起碼得沒加這個新的基礎模型前要強吧!
Stacking集成:多種演算法群毆一起上!選擇多個機器學習演算法做同一件事,最後把它們的結果合並就OK啦!
先來看看第一個傢伙Bagging模型,其典型代表就是隨機森立了,簡單來說就是並行的訓練一堆樹模型,然後求其平均結果,在這里我們要討論一個問題,就是每個樹模型該怎麼構造呢?如果不加入任何限制,那每個樹模型不都差不多嘛,那最後的平均結果又會有什麼變化呢?所以為了結果的泛化能力更強,必須要使得每個樹模型表現出多樣性,也就是盡可能的讓每個樹模型都不一樣!
這該怎麼做呢?什麼影響模型呢?數據絕對是最大的影響因子,這里的森林很好理解了,就是把樹放在一起,那麼隨機又是什麼呢?為了保證每個樹的多樣性,在構建模型時,我們做了二重隨機(我自創的詞。。。)第一重就是對樣本的選擇,每次隨機的有放回的選擇部分樣本作為一棵樹的訓練樣本(比如選擇百分之八十作為訓練集)。第二重還要考慮特徵了,既然樣本數據能隨機,那麼特徵也是一樣的,每棵樹選擇的特徵也是不一樣的隨機選擇部分特徵來建模!
隨機的意義非常重要,這是隨機森林的精神所在!
隨機森林作為灰常經典的機器學習演算法,優勢自然少不了,當我們建模完之後,還可以對特徵進行重要性評估,其實簡單來說一個特徵的重要與否可以取決於建模的時候如果把這個特徵換成噪音特徵再去看看結果的錯誤率是不是顯著上升,如果顯著上升,那麼這個特徵自然很重要,如果沒變化,那這個特徵就沒啥用了,因為它和噪音沒啥區別!
隨機森林中樹的個數是不是越多越好呢?理論上越多的樹效果應該會更好吧,但是實際上我們把樹的個數增加到一定的時候比如100棵了已經,再往上增加樹的個數結果也只會發生小范圍的浮動,基本也就穩定了!
Boosting集成中典型的代表就屬Xgboost啦,一個大殺器,這個演算法由於涉及的數學比較多,咱們後續來一個專題去講Xgboost,我們先來看看簡單些的Adaboost。
Adaboost演算法概述來說就是,首選我有一個非常簡單的模型,比如深度為1的樹模型,然後我去預測一下結果,在結果中我發現某些樣本預測錯了,這個時候第二個簡單的樹模型就來了,還是同樣的任務只不過數據的權重發生了變換,一開始所有的數據都是相同的權重,但是第二次會把前面那次預測錯的數據的權重增大,相對來說預測對的數據的權重就會減小。說白了就是讓後面的模型更注重我之前哪些數據分錯了,這回好能分對它!(好比我們在考試前都會復習之前做錯的題)
最後來看一下堆疊模型吧,社會我Stacking,人狠話不多,不需要多解釋,做了一堆演算法,然後把它們的結果堆疊起來,每個演算法都有自己的預測結果,這些結果組合在一起那不相當於一個新的特徵嘛,再把它們結果組成的特徵去做一個分類或者回歸,又得到了一個唯一的結果。
❹ 十二地支講解:天乾地支最正確的演算法
天乾地支計算方法
一、年干支計算公元後年份的口訣是:
「公元年數先減三,除10餘數是天干,基數改用12除,余數便是地支年」。
以2010年為例,年份減3得基數2007,除以10得余數7,對查天干次序(甲、乙、丙、丁、戊、已、庚、辛、壬、癸)。
得」庚「,再將基數2007除以12得余數為3,再循環對查地支次序(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)得」寅「,故2010年為庚寅年。(若得0可理解為1之前即12)
二、月干支月的地支是固定的如正月起寅之類,只計算月干。
月干=年干數乘2+月份例:2010年(庚寅)三月(辰月)的天干=7*2+3=17,天干10為周期,就去掉10,得7,天干第7位為庚,則此月干支為庚辰。
三、日干支1900——1999年日干支基數=(年尾二位數+3)*5+55+(年尾二位數-1)除42000——2099年日干支基數=(年尾二位數+7)*5+15+(年尾二位數+19)除4(只用商數,余數不用,數過60就去掉60)
例:2010年4月12日星期一日干支基數=(10+7)*5+15+(10+19)/4=47(已去掉60的倍數)這就是1月1日的干支數。從1月1日到4月12日為47+31(1月天數,下類推)+28+31+12=149,去掉60的倍數得29、天干去10的倍數餘9為壬,地支去12的倍數餘5為辰,今天的干支就是壬辰。
四、時干支時干=日干序數*2+日支序數-2
五、倒推年齡法從今年的干支推出任何年齡的干支,即年齡去掉60為基數,去掉10的倍數為天干倒推數,去掉12的倍數為地支倒推數。
如今年為庚寅年,56歲生年的干支這樣推:56去50餘6,天干從庚倒推6位是乙,地支為56去掉48餘8,從寅倒推8位是未,生年就是乙未年。65歲生年去掉60餘5,從今年的天干倒推5位丙,從今年的地支倒推5位戌,生年就是丙戌年。
【結束語】古人的智慧是不是令人贊嘆呢?在哪種科學技術不發達的時代,能相想出如此精密的演算法,真是一絕。為古人的智慧點贊!!
❺ kmp 演算法原理
樸素演算法
先看看最「樸素」的演算法: ///find a template in a string. #include<string.h> #include<stdio.h> int Index(char *S, char *T, int pos) { int k=pos, j=0; while(k <strlen(S) && j<strlen(T))//未超出字元串的長度 { if (S[k] == T[j]) { ++k; ++j;} //如果相同,則繼續向後比較 else {k = k-j+1; j =0;} //如果不同,就回溯,重新查找 } if (j == strlen(T)) return k-strlen(T); else return 0; }
編輯本段KMP演算法
一種由Knuth(D.E.Knuth)、Morris(J.H.Morris)和Pratt(V.R.Pratt)三人設計的線性時間字元串匹配演算法。這個演算法不用計算變遷函數δ,匹配時間為Θ(n),只用到輔助函數π[1,m],它是在Θ(m)時間內,根據模式預先計算出來的。數組π使得我們可以按需要,「現場」有效的計算(在平攤意義上來說)變遷函數δ。粗略地說,對任意狀態q=0,1,…,m和任意字元a∈Σ,π[q]的值包含了與a無關但在計算δ(q,a)時需要的信息。由於數組π只有m個元素,而δ有Θ(m∣Σ∣)個值,所以通過預先計算π而不是δ,使得時間減少了一個Σ因子。[1] KMP演算法是通過分析子串,預先計算每個位置發生不匹配的時候,所需GOTO的下一個比較位置,整理出來一個next數組,然後在上面的演算法中使用。
編輯本段KMP演算法的講解
當我們分析一個子串時,例如:abcabcddes. 需要分析一下,每個字元x前面最多有多少個連續的字元和字元串從初始位置開始的字元匹配。然後+1就行了(別忘了,我們的字元串都是從索引1開始的)當然,不要相同位置自己匹配,默認第一個字元的匹配數是0。
編輯本段定義
設字元串為 x1x2x3...xn ,其中x1,x2,x3,... xi,... xn均是字元,設ai為字元xi對應的整數。則a=m,當且僅當滿足如下條件:字元串x1x2...xm equals 字元串x(i-m+1)...xi-1 xi 並且x1x2...xm x(m+1) unequals x(i-m) x(i-m+1)...xi-1 xi。
編輯本段舉例
abcabcddes 0111234111 |----------------------默認是0 --| | |-----------------不能自己在相同位置進行字元匹配,所以這里認為沒有匹配字元串,所以0+1 =1,繼續從1開始匹配 ------| | |-----------前面的字元和開始位置的字元相同,所以是2,3,4 -----------| | | |-------不匹配只能取1。 希望能明白的是,如果開始字元是 Ch1的話,那麼我們就是要在串中第2個Ch1後面的位置開始自己和自己匹配,計算最大的吻合度。 程序寫出來就是: void GetNext(char* T, int *next) { int k=1,j=0; next[1]=0; while( k〈 T[0] ){ if (j ==0 || T[k] == T[j]) { ++k; ++j; next[k] = j; } else j= next[j]; } } 但是這個不是最優的,因為他沒有考慮aaaaaaaaaaaaaaaaaaab的情況,這樣前面會出現大量的1,這樣的演算法復雜度已經和最初的樸素演算法沒有區別了。所以稍微改動一下: void GetNextEx(char *T, char *next) { int k=1,j=0; next[1] = 0; while(k < T[0]) { if (j == 0 || T[k] == T[j]) { ++k; ++j; if (T[k] == T[j]) next[k] = next[j]; else next[k] = j; } else j = next[j]; } } 現在我們已經可以得到這個next字元串的值了,接下來就是KMP演算法的本體了: 相當簡單: int KMP(char* S, char* T, int pos) { int k=pos, j=1; while (k){ if (S[k] == T[j]){ ++k; ++j; } else j = next[j]; } if (j>T[0]) return k-T[0]; else return 0; } 和樸素演算法相比,只是修改一句話而已,但是演算法復雜度從O(m*n) 變成了:O(m)
編輯本段KMP演算法的偽代碼
KMP-MATCHER(T,P) 1n ← length[T] 2m ←length[P] 3π ← COMPUTE-PREFIX-FUNCTION(P) 4q ← 0△Number of characters matched. 5for i ← 1 to n△Scan the text from left to right. 6do while q>0 and P[q+1]≠T[i] 7do q ← π[q]△Next character does not match. 8if P[q+1]=T[i] 9then q ← q+1△Next character matches. 10if q=m△Is all of P matched? 11then print 「Pattern occurs with shift」 i-m 12q ← π[q]△Look for the next match. COMPUTE-PERFIX-FUNCTION(P) 1m ← length[P] 2π[1] ← 0 3k ← 0 4for q ← 2 to m 5do while k>0 and P[k+1]≠P[q] 6do k ← π[k] 7if P[k+1]=P[q] 8then k ← k+1 9π[q] ← k 10return π[1]
編輯本段KMP演算法的c++實現
//c++實現的KMP演算法,所有涉及字元串,其初始下標從0開始(上述演算法均是從1開始) //example: char s[100],t[100];cin>>s>>t;KMP(s,t); //獲取待查詢模式的next數組 int* get_next(char* T, int* next){ int i = 0, j = -1; int length = strlen(T); int *temp = next; *next = -1; while(i< length){ if(j==-1 || *(T+i)==*(T+j)){ i++; j++; //優化後的get_next方法,可以防止出現形如"aaaaab"這種模式的計算退化 if(*(T+i)!=*(T+j)) *(next+i)=j; else *(next+i)=*(next+j); } else j=*(next+j); } return temp; } //KMP演算法 int KMP(char *S, char *T){ int S_Length = strlen(S); int T_Length = strlen(T); //若模式長度大於字元串,則直接返回查詢失敗 if( S_Length < T_Length) return 0; int i = 0, j = 0; int* next = new int[T_Length]; get_next(T, next); while(i < S_Length && j < T_Length){ if(j == -1 || *(S+i) == *(T+j)){ i++; j++; } else j=*(next+j); } if(j>=T_Length) return i-T_Length; return 0; } 在此提供一個更簡明的適用於字元串的kmp實現: #include<iostream> #include<string.h> int next[100]; void getnext(char b[]) { int i=1,j=0; //i是每個位子,j是回退的位子 next[1]=0; while(i<=strlen(b)) { if(j==0||b[i-1]==b[j-1]) { i++; j++; next[i]=j; } else j=next[j]; //用上一個的 回退關系 } } int kmp(char a[],char b[]) { int i=1,j=1; //i是主串中的位子 ,j匹配串的位子 while(i<=strlen(a)&&j<=strlen(b)) { if(j==0||a[i-1]==b[j-1]) { i++; j++; } else j=next[j]; } if(j>strlen(b)) return i-strlen(b); else return 0; } int main() { char a[40],b[40]; printf("要匹配的主串:\n"); scanf("%s",a); printf("要匹配的子串:\n"); scanf("%s",b); getnext(b); printf("輸出next值:\n"); for(int i=1;i<=strlen(b);i++) printf("%d ",next[i]); printf("\n"); printf("%d",kmp(a,b)); system("pause"); main(); return 0; }
編輯本段串的最大匹配演算法
摘要:
給定兩個串S和T,長分別m和n,本文給出了一個找出二串間最大匹配的演算法。該演算法可用於比較兩個串S和T的相似程度,它與串的模式匹配有別。
關鍵詞:
模式匹配 串的最大匹配 演算法 Algorithm on Maximal Matching of Strings Lin YuCai Xiang YongHong Zhang ChunXia Zhang JianJun (Computer Science Department of Yunnan Normal University Kunming 650092) ABSTRACT Given Two Strings S of length m and T of length n,the paper presents an algorithm which finds the maximal matching of them. The algorithm can be used to compare the similarility of the two strings S and T, it is different with the strings' pattren matching. KEY WORDS Pattern Matching Maximal Matching of Strings Algorithm
編輯本段問題的提出
字元串的模式匹配主要用於文本處理,例如文本編輯。文本數據的存儲(文本壓縮)和數據檢索系統。所謂字元串的模式匹配[2],就是給定兩個字元串S和T,長度分別為m和n,找出T中出現的一個或多個或所有的S,在這方面已經取得了不少進展[3][4][5][6][7][8][9][10][11]。本文從文本處理的另一個角度出發,找出兩個串的最大匹配,比較其相似程度[1]。它主要應用於文本比較,特別是在計算機輔助教學中。顯然前者要找S的完全匹配,而後者並無此要求。例如,若S=ABCD,T=EFABCDX,那麼模式匹配的結果就是找出了T中的一個ABCD,而我們演算法的結果就是S能與T的ABCD完全匹配,但是T中還有3個字元是比S多出來的,也就是說在S中有100%的字元與T中的匹配,而在T中有57%的字元與S中的匹配。若S= ABCDFE,T=AFXBECDY。則在模式匹配中S與T無匹配項,但在我們的演算法中就能發現T中存在A,B,C,D,但D後不存在E,F。而且S中也存在A,B,C,D,且具有順序性。這樣就能公正地評價S,T的區別。得知其相似程度。 文章的組織如下:首先介紹基本定義和問題的描述;第三節是演算法設計;最後是本文總結。
編輯本段問題的描述
設∑為任意有限集,其元稱為字元,w:∑→N為∑到N的函數,稱為∑的權函數(註:本文僅討論權值恆為1的情況)。∑*為∑上的有限字元串集合,那麼對任意S,T∈∑*,設S=a1a2…am,T=b1b2…bn,m>0,n>0。記<m>={1,2, …,m},<n>={1,2, …,n},則稱{(i,j)∣i∈<m>,j∈<n>,ai=bj}為S與T的匹配關系集,記作M(S,T),稱M為S與T的一個(容許)匹配,若對任意(i,j), ( i',j' )∈,① i< i',當且僅當j< j',② i= i'當且僅當j= j'。S與T的匹配中滿足 最大者,稱為S與T的最大匹配。若C(i,j)為N上的m×n矩陣,且滿足: 則稱矩陣C為串S與T的匹配關系陣。 於是求串S與T的最大匹配,等價於求C中的一個最大獨立點集M,它滿足,若ci,j,ci',j'∈M,則i< i' 當且僅當j< j',i=i'當且僅當j=j'。我們稱這樣的最大獨立點集為C的最大C-獨立點集。 例:設∑為所有字母的集合,對任意x∈∑,w(x)≡1,設S與T分別為:S=「BOOKNEWS」,T=「NEWBOOKS」。則我們可以得到S與T兩個匹配: 這里=5; 這里 =4。 顯然為串S與T的最大匹配。 S與T的匹配關系陣C可表示如下: 其中帶圈的部分為一最大C-獨立點集。
編輯本段演算法設計
我們僅就權值為一的情況進行討論。 設S和T為任意給定串,C為的S與T匹配關系陣,那麼由2的討論知,求S與T的最大匹配問題,等價於求C的最大C-獨立點集問題。因而,為了解決我們的問題,只要給出求C的最大C-獨立點集的演算法就可以了。 顯然,為了求出C的最大C-獨立點集,我們可以採用這樣的方法:搜索C的所有C-獨立點集,並找出它的最大者。這種方法是可行的,但並不是非常有效的。這會使問題變得很繁,復雜度很大。因此,我們先對問題進行分析。 在下面的討論中,我們把C的任一C-獨立點集={ai1,j1,…,ais,js},記作=ai1,j1…ais,js,i1 <…< is。於是可看作陣C中以1為節點的一條路,滿足:對路中的任意兩節點,均有某一節點位於另一節點的右下方。稱這種路為右下行路。 於是求C-獨立點集等價於求陣C的右下行路。這種求右下行路的搜索可以逐行往下進行。 命題1. 若 =αai,jβ和ψ=α'ai,jσ為C的兩個C-獨立點集,且α為α'的加細,則存在C-獨立點集'=αai,jδ,滿足≥。 命題2. 若 =αai,jβ和ψ=α'ai+k,jσ為C的兩個C-獨立點集,且≥,則存在C-獨立點集'=αai,jδ,滿足≥。 命題3. 若 =αai,jβ和ψ=α'ai,j+kσ為C的兩個C-獨立點集,且≥,則存在C-獨立點集'=αai,jδ,滿足≥。 由命題1知,在搜索右下行路的過程中,如果已獲得了某一C-獨立點集的某一初始截段αai,j和另一C-獨立點集ψ的某一初始截段α'ai,j,且有≤,則我們可以停止對ψ的進一步搜索。 由命題2知,在搜索右下行路的過程中,在某一列j存在某兩個C-獨立點集的某初始截段=ai1,j1…ais,j和ψ=al1,m1…alt,j,如果≥,但lt>is,則我們可以停止對ψ的進一步搜索。 由命題3知,在搜索右下行路的過程中,在某一行i存在某兩個C-獨立點集的某初始截段=ai1,j1…ai,js和ψ=ai1,m1…ai,mt,如果≥,但mt>js,則我們可以停止對ψ的進一步搜索。 由此可見,並不要求搜索所有C的最大C-獨立點集,而可以採用比這簡單得多的方法進行計算。那麼按照我們上面的三個命題,來看如下實例: 首先我們得到=B(在上的節點用①表示),我們向右下方找路,可以發現,在第4列有兩個1,根據命題2,我們選擇上面的一個1,也就是說選擇第1行的那個1,而不要第2行的那個1。同時我們也發現在第1行也有兩個1,由命題3知,我們選擇左邊的那個1,即第4列的那個1。此時=BO。但是當我們的演算法運行到第4行時,=BOOK,由於K在第3行第6列,而本行的1在第1列,在路最後一個節點K的左邊,那麼我們必須新建一條路ψ,因為我們並不能確定是否以後就有≥,當演算法運行到第6行時,=BOOK,ψ=NEW,=4,=3,我們將S鏈到路上,此時我們得到最長右下行路=BOOKS,=5。這樣我們就可以計算出這兩個字元串的匹配程度。 在我們的演算法設計過程中,用到了兩個技巧。技巧之一,矩陣C不用存儲,是動態建立的,節省了空間。技巧之二,本演算法並不要求所有的S與T中所有的元素都相互進行比較,也並不存儲所有的右下行路,節省了時間和空間。由矩陣中1的出現情況可見,本演算法所需的空間和時間都遠小於O(mn)
編輯本段結束語
本文給出了一個與模式匹配不同的,具有若干應用的,串的最大匹配演算法,該演算法已經在機器上實現,達到了預期的效果。本文僅討論權值恆為1的情況,對於權值任意的情形不難由此得到推廣。
編輯本段C語言代碼(C Code)
#include<stdio.h> #include<string.h> void getnext(int next[],char s[],int l) { int i=1,j=0; next[1]=0; while(i<l) { if(j==0 || s[i]==s[j]) { i++;j++; next[i]=j; } else j=next[j]; } } int KMP(char s1[],char s2[],int l1,int l2,int next[]) { int i,j; i=j=1; while(i<=l1 && j<=l2) { if(j==0||s1[i]==s2[j]) { i++;j++; } else j=next[j]; } if(j>l2) return(i-l2); return 0; } int main() { int next[10001],ans; char s1[10001],s2[10001],l1,l2; scanf("%s",s1+1); scanf("%s",s2+1); l1=strlen(s1+1); l2=strlen(s2+1); getnext(next,s2,l2); ans=KMP(s1,s2,l1,l2,next); if(ans!=0) printf("%d\n",ans); else printf("No!\n"); system("pause"); return 0; }
編輯本段KMP演算法的pascal實現
var next:array [1 ..1000001] of longint; s,t:ansistring; procere get_next(t:ansistring); var j,k:integer; begin j:=1; k:=0; while j<length(t) do begin if (k=0) or (t[j]=t[k]) then begin inc(j); inc(k); next[j]:=k; end else k:=next[k]; end; end; function index(s:ansistring;t:ansistring):longint; var i,j:longint; begin get_next(t); index:=0; i:=1; j:=1; while (i<=length(s))and(j<=length(t)) do begin if (j=0)or(s[i]=t[j]) then begin inc(i); inc(j); end else j:=next[j]; if j>length(t) then index:=i-length(t); end; end; begin readln(s); readln(t); writeln(index(s,t)) end.
編輯本段KMP播放器
K-multimedia player的縮寫
來自韓國的影音全能播放器,與Mplayer一樣從linux平台移植而來的Kmplayer(簡稱KMP)幾乎可以播放您系統上所有的影音文件。通過各種插件擴展KMP可以支持層出不窮的新格式。強大的插件功能,直接從Winamp繼承的插件功能,能夠直接使用winamp的音頻 ,輸入,視覺效果插件,而通過獨有的擴展能力,只要你喜歡,可以選擇使用不同解碼器對各種格式進行解碼。 KMPlayer The Professional Media Player! 它支持 Winamp 2/5 的輸入、常規、DSP、視覺效果、媒體庫插件。無須注冊表支持直接調用 Directshow 濾鏡!FFdshow 的視覺特效系統~超強的 GUI 界面~安裝電視卡後可以直接代替原軟體直接收看電視~支持播放 DVD/VCD 以及絕大多數電腦的媒體文件(AVI 支持 Xvid/DivX/3vid/H264 OGG/OGM/MKV 容器/AC3/DTS 解碼~Monkey Audio 解碼~)強烈推薦!此播放器除了會將自己的配置信息寫入注冊表外絕對綠色~ KMplayer內置目前常見的所有解碼器,包括real,QT等。 另外KMplayer安裝版也是目前很少見的檢查流氓軟體的安裝方式,如果一旦有惡意的漢化小組漢化並捆綁了流氓軟體。該安裝程序自動會識別,並作出提示,建議用戶不要安裝,雖然不是特別准確,但KMplayer的無廣告及第三方插件的特點使其深受好評。 目前韓國官方已經在Kmplayer里自帶了中文字型檔,只要用戶是中文系統,軟體就會自動識別,十分方便。 KMP版本: KMPlayer3.0.0.1439
❻ 講解計算機二進制演算法
你這不是2進制啊。。計算機的二進制是逢2進1。即只有0和1兩個數字組成。就跟平時的十進制是的,所有數字組成是從0到9,而十是用1和0組合表示。
按你1-2-4-8。。後面應該是16-32-64-128。。。這都是2的n次方,
❼ 用遺傳演算法求解配送路線優化問題時,交叉率和變異率怎麼設定
以下是問題的詳細回答,文字有些長,請你耐心看希望對你有幫助。
傳演算法可以很好的解決物流配送路徑優化問題。但是由於遺傳演算法交配運算元操作可能會使最好解遺失,所以將遺傳演算法和模擬退火演算法結合來解決這一問題。實驗結果表明:用這種有記憶功能的遺傳模擬退火演算法求解物流配送路徑優化問題,可以在一定程度上解決上述問題,從而得到較高質量的解。
一 物流系統簡介
物流系統是以客戶滿意為目標,根據顧客的要求條件,從生產地到銷售地,在倉儲、包裝、配送、運輸、裝卸等環節有機整合所形成的實物、服務以及信息的流通過程所組成的一個復雜的系統。
物流配送是現代化物流管理中的一個重要環節。它是指按用戶的定貨要求,在配送中心進行分貨、配貨,並將配好的貨物及時送交收貨人的活動。本文討論物流配送中的路徑優化問題,並且通過結合模擬退火演算法來解決遺傳演算法在解決此類問題時的不足。
二 系統模型設計
物流配送路徑優化問題可以按這樣的情況進行描述:從某物流配送中心用多輛配送車輛向多個客戶送貨。每個客戶的位置和貨物需求量一定,每輛車的載重量一定,配送時間一定,其一次配送的最大行駛距離一定。要求合理安排車輛配送路線,使目標函數得到最優。並滿足以下條件:(1)每條配送路徑上各客戶需求量之和不超過配送車輛的載重量;(2)每條配送路徑的長度不超過配送車輛一次配送的最大行駛距離;(3)每次配送的貨物不能超過客 戶要求的時間; (4)每個客戶的需求必須滿足,且只能由一輛配送車送貨。設配送中心需要向k個客戶送貨,每個客戶的貨物需求量是g (i=1,2,…..k),每輛配送車的載重量是q,且g 下面建立此問題的數學模型:c 表示點i到點j的運輸成本,t 表示從i到s所允許的最大時間。配送中心編號為0,各客戶編號為i(i=1,2,….,k),定義變數如下:
x = 1 或 0(其中,當x 等於1時表示車s由i駛向j;0表示沒有該路徑。)。
y = 1 或 0(其中,當y 等於1時表示點i的貨運任務由s車完成;0表示沒有。)。
根據上述變數定義可得到的數學模型如下所示:
min Z = ; (1) ;(2)
= 1或 m(其中,當 i = 1,2,……,k時為1,否則為0。);(3)
= y ,j = 1,2,……,k;s = 1,2,……,m; (4)
= y ,i = 0,1,……,k;s = 1,2,……,m; (5)
t > 0;且t t , j = 1,2……,s-1; (6)
上述模型中,式(2)為汽車容量約束;式(3)保證了每個客戶的運輸任務僅由一輛車完成,而所有運輸任務則由m輛車協同完成;式(4)和式(5)限制了到達和離開某一客戶的汽車有且僅有一輛。式(6)對配送時間做了約束,即物品到達指定地點的時間不能大於其最大允許時間。
上述模型中還要考慮時間問題,即每個客戶對所送物品的時間要求各不相同,故需加入一個時間參數t 。對每個運輸路徑都加上時間參數t (t 的值可由客戶需求中得知,並記錄到資料庫。),在每個規定的時間內(如一個月),優先配送t 值小的物品,每次在用遺傳演算法求解前,遍歷規定時間內的所有t ,按照t 值由小到大排列染色體,然後再求出最優解,根據最優解制定配送方案。
三 引入退火演算法改進求解過程
針對遺傳演算法的一些不足,將模擬退火演算法與之結合,並加入記憶裝置,從而構造了物流配送路徑優化問題的一種有記憶功能的遺傳模擬退火演算法。該演算法的特點是擴大了原有遺傳演算法的搜索鄰域,在一定概率控制下暫時接受一些惡化解。同時利用記憶裝置保證了在一定終止條件下所得的最終解至少是搜索過程中曾得到所有解中的最優解。該演算法通過在常規的遺傳演算法基礎上加入模擬退火運算元和記憶裝置而得到。下面首先介紹此有記憶功能的遺傳模擬演算法的步驟。根據參考文獻[3],給出下面的演算法實現步驟:
STEP1 給定群體規模maxpop,將初始群體按照t 所指定的值進行分塊, k=0;初始溫度t =t ,產生初始群體pop(k),並且初始群體的每個分塊中都具有t 滿足某一屬性的特徵值;對初始群體計算目標值f(i), 找出使函數f (t )最小的染色體i和這個函數值f,記i =i,f =f;其中,f (t )為狀態i在溫度為t 時的目標值。i∈ pop( k),即當代群體中的一個染色體;
STEP2 若滿足結束條件則停止計算,輸出最優染色體i 和最優解f ;否則,在群體pop(k)的每一個染色體i∈ pop(k)的鄰域中隨機選一狀態j∈N( i ),且t 滿足條件要求, 按模擬退火中的接受概率
接受或拒絕j,其中f (t ), f (t )分別為狀態i,j的目標值。這一階段共需maxpop次迭代以選出新群體newpop1;
STEP3 在newpop1(k+1)中計算適應度函數
其中,f 是newpop1(k+1)中的最小值。由適應度函數決定的概率分布從newpop1中隨機選maxpop個染色體形成種群newpop2;
STEP4 按遺傳演算法的常規方法對newpop2進行交叉得到crosspop,再變異得到mutpop;
STEP5 染色體中的每個元素在滿足t 的情況下,且具有較大t 值的元素完成時沒有破壞具有較小t 值進行計算所需條件的情況下,不必按照由小到大的順序進行排列,
STEP6 令pop(k+1)=mutpop,對pop(k+1)計算f (t ),找出使函數f (t )最小的染色體i和這個函數值f,如果f < f ,則令i = i, f =f, t = d(t ),k = k+1, 返回 STEP2。
出於表示簡單,計算機處理方便的目的,對於VRP問題的遺傳演算法編碼通常都採用自然數編碼。上述數學模型的解向量可編成一條長度為k+m+1的染色體(0,i ,i ,…,i ,0,i ,…i ,0,…0,i ,…,i ,0)。在整條染色體中,自然數 i 表示第 j 個客戶。0的數目為m+1個,代表配送中心,並把自然數編碼分為m段,形成m個子路徑,表示由m輛車完成所有運輸任務。這樣的染色體編碼可以解釋為:第一輛車從配送中心出發,經過i ,i ,…,i 客戶後回到配送中心,形成了子路徑1;第2輛車也從配送中心出發,途徑i ,…i 客戶後回到配送中心,形成子路徑2。m輛車依次出發,完成所有運輸任務,構成m條子路徑。
如染色體0123045067890表示由三輛車完成9個客戶的運輸任務的路徑安排:
子路徑1:配送中心→客戶1→客戶2→客戶3→配送中心
子路徑2:配送中心→客戶4→客戶5→配送中心
子路徑3:配送中心→客戶6→客戶7→客戶8→客戶9→配送中心。
為了使演算法收斂到全局最優,遺傳群體應具有一定的規模。但為了保證計算效率,群體規模也不能太大。一般取群體規模取值在10到100之間。
在初始化染色體時,先生成 k 個客戶的一個全排列,再將 m+1 個 0 隨機插入排列中,其中所選的 k 個客戶所要求的時間必須在某一個特定的時間段內,且完成任何一個客戶配送任務時不能破壞完成其他客戶配送任務的條件。需要注意的是必須有兩個 0 被安排在排列的頭和尾,並且在排列中不能有連續的兩個0。這樣構成一條滿足問題需要的染色體。針對此染色體,隨機選擇兩個位置上的元素進行交換,並用演算法對其調整,使其成為新的滿足要求的染色體。交換若干次,直至生成滿足群體規模數的染色體。
在這里,將容量約束式(2)轉為運輸成本的一部分,運輸成本變為:
其中M為一很大的正數,表示當一輛車的貨運量超過其最大載重量時的懲罰系數。M應趨向於無窮大。考慮到計算機處理的問題,參考文獻[6],取M為1000000為宜。將此運輸成本函數作為我們的目標函數。適應度函數採用一種加速適應度函數:
這種適應度函數加速性能比較好,可以迅速改進適應度的值,縮短演算法運行時間。
將每代種群的染色體中適應度最大的染色體直接復制,進入下一代。種群中其他染色體按其適應度的概率分布,採用輪盤賭的方法,產生子代。這樣既保證了最優者可生存至下一代,又保證了其餘染色體可按生存競爭的方法生成子代,使得演算法可收斂到全局最優。選中的染色體按一定的概率—交叉率,產生子代。交叉率在0.6~0.8之間,演算法進化效果較好。
四 試驗數據與比較
實驗數據取自參考文獻[6]。
實驗1,隨機生成1個有8個門店的VRP問題,初始數據如下:
圖1八個門店的需求量及其位置
根據各倉庫的需求量,計算出需要的汽車數:m=[17.82/(0.85*8)]+1=3。採用傳統的遺傳演算法的各運算元,並對其中的交叉運算元進行了改造,取群體規模為20,進化代數為50,應用此程序他費時3s得到的結果為:
而我們的演算法在上面的演算法中加入了一個模擬退火運算元,取初始退火溫度為10,衰減系數取0.85使用第三節所述演算法步驟,在奔騰四的計算機上計算,耗時2s,得結果如下:
實驗2,隨機生成1個有20個門店的VRP問題,初始數據如下:
圖2 20個門店的需求量及其位置
計算得:需6輛車。用參考文獻[6]中的演算法取群體規模100,進化代數分別設為20,50,100,得到的結果不同:
圖3 普通遺傳演算法的實驗結果
而採用本文的演算法,初始退火溫度取10,衰減系數取0.85,在奔騰四的計算機上計算,則結果如下:
圖4 新型演算法的實驗結果
從以上兩個實驗可以看出:採用本文中所述的演算法,要得到相同的結果可以縮短進化代數,從而節約運算時間。而要增加進化代數必然得到更好的結果。
五 結論
用模擬退火演算法與傳統的遺傳演算法相結合來求解物流系統中車輛路徑問題,可以使演算法所需的進化代數明顯減少,問題解可在最短時間內求出。因此在時間特性上有了比較好的改善,耗時較短,獲得了較好的結果。根據參考資料所記載的數據表明,此演算法在解決諸如車輛路徑問題問題確實可行,並有較好的性能。而且隨著問題規模的增大,這種對時間性能的改善效果將更加明顯。這就非常有助於物流企業根據自己的實際情況科學、有效的指定物流決策,降低風險,降低成本,提高經濟效益和自身的競爭力。
參考文獻
[1] 郭耀煌 李軍著,車輛優化調度,成都:成都科技大學,1994
[2] 邢文訓 謝金星編著,現代優化計算方法,北京:清華大學出版社,1999
[3] 郎茂祥,物流配送車輛調度問題的模型和演算法研究,北京:北方交通大學,2002
[4] 郎茂祥 胡思繼,用混和遺傳演算法求解物流配送路徑優化問題的研究,中國管理科學,2002
[5] 李軍 謝秉磊 郭耀煌,非滿載車輛調度問題的遺傳演算法,系統工程理論與實踐,2000
[6] 唐坤,車輛路徑問題中的遺傳演算法設計,東北大學學報(自然科學版),2002
[7] 姜大立 楊西龍 杜文等,車輛路徑問題的遺傳演算法研究,系統工程理論與實踐,1999
[8] 閻慶 鮑遠律,新型遺傳模擬退火演算法求解物流配送路徑問題,計算機科學與發展,2002
❽ 物質的量的具體演算法.細致通俗的講解一下、不懂.
首先要明確,物質的量只用於微觀物體,比如原子、分子、離子等。
第二,使用時一定要指明對象,就是你說的到底是原子、分子或者是其他的。
第三,6.02*10^23 個對象就是 1mol
例如 6.02*10^23 個水分子 就是 1mol 水
6.02*10^23 這個數就叫做阿弗加德羅常數,用 NA 表示(A是下標)
NA 是一個數;物質的量是一個量,他的單位是 mol (摩爾)
❾ 高中數學書里秦九韶演算法是在哪部分學得 突然找不著了
人教版是在必修三的演算法部分的第三節,演算法案例
29頁
第
❿ 演算法分析與設計這門課程第三章動態規劃的知識點有哪些
演算法分析與設計這門課第三章動態規劃的知識點包含章節導引,第一節動態規劃演算法的概念,第二節動態規劃演算法的基本步驟,第三節動態規劃演算法的基本要素,第四節動態規劃演算法設計策略,課後練習,。