<noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"><delect id="ixm7d"></delect></rt><noframes id="ixm7d"><rt id="ixm7d"><rt id="ixm7d"></rt></rt><rt id="ixm7d"></rt> <noframes id="ixm7d"><rt id="ixm7d"><delect id="ixm7d"></delect></rt><delect id="ixm7d"></delect><bdo id="ixm7d"></bdo><rt id="ixm7d"></rt><bdo id="ixm7d"></bdo><noframes id="ixm7d"><rt id="ixm7d"><rt id="ixm7d"></rt></rt><rt id="ixm7d"><rt id="ixm7d"></rt></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt> <noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d">

遺傳算法java實驗報告

2023-07-01

由于報告格式復雜,內容要求簡要明確,很多人對寫作報告,甚是感到苦惱。非常需要一份正確的報告格式范文。以下是小編精心整理的《遺傳算法java實驗報告》,希望對大家有所幫助。

第一篇:遺傳算法java實驗報告

JAVA實驗報告 心得體會——密碼攻擊、遺傳算法

JAVA實驗報告

JAVA實驗報告

一、 JAVA編程模擬密碼攻擊MimaGongji 1. 模擬密碼攻擊MimaGongji功能需求分析

編程模擬密碼攻擊的過程,實現下述功能:

(1)鍵盤輸入12位密碼,包括字母和數字;

(2)采用窮舉法進行攻擊,直到破解密碼為止;

(3)屏幕輸出試驗的次數,并輸出獲得的密碼。

2. MimaGongji基本設計思路

1) 基于對MimaGongji功能需求的分析,MimaGongji這個類作為主類,實現主要功能,包括密碼的流輸入,密碼的窮舉法破解和破解后密碼的輸出。 2) Java.io.*這個包主要實現數據的流輸入和流輸出。

3) public static void main(String[] args)這個方法是主要的方法,實現密碼的鍵盤輸入,采用窮舉法進行攻擊,并屏幕輸出試驗的次數和獲得的密碼。 4) .length()這個方法主要是計算一個字符串的長度

3. 實驗步驟

1) Java程序代碼(*.java)和詳細的行注釋 //文件名稱為“MimaGongji.java” import java.io.*; //加入java的流輸入和流輸出包 class MimaGongji //定義主類 {

public static void main(String[] args)//引入主要方法 {

String s=""; try{ BufferedReader

mima=

new

BufferedReader(new InputStreamReader(System.in)); //定義密碼的流輸入

- 1

JAVA實驗報告

//統計試驗的次數

}

System.out.print(po);

} //輸出破解之后的密碼

} System.out.println();//換行 System.out.println("試驗次數:"+g); //輸出提示“試驗的次數”

} }//類申明的結束

2)程序的運行(包括運行的過程、界面和結果圖)

首先編寫如上所示的源程序,保存文件名稱為“MimaGongji.java”,然后編譯源程序,編譯完成后,生成一個字節碼文件MimaGongji.class,執行這個程序,得到如下圖所示的窗口:

- 345

JAVA實驗報告

getContentPane().add(pb,BorderLayout.SOUTH);//把面板添加到窗口上

t1=new JTextField(50); //創建文本框

t2=new JTextField(50); //創建文本框

t3=new JTextField(50); //創建文本框 t4=new JTextField(5); //創建文本框 t5=new JTextField(5); //創建文本框 t6=new JTextField(5); //創建文本框

t2.setEditable(false); //定義文本框的不可書寫

t4.setEditable(false); //定義文本框的不可書寫

t5.setEditable(false); //定義文本框的不可書寫

t6.setEditable(false); //定義文本框的不可書寫

p.add(l3,BorderLayout.NORTH); //把標簽添加到面板上 p.add(t3,BorderLayout.CENTER); //把文本框添加到面板上 p.add(l1,BorderLayout.NORTH); //把標簽添加到面板上 p.add(t1,BorderLayout.CENTER); //把文本框添加到面板上 p.add(l2,BorderLayout.NORTH); //把標簽添加到面板上 p.add(t2,BorderLayout.CENTER); //把文本框添加到面板上 p.add(l4,BorderLayout.NORTH); //把標簽添加到面板上 p.add(t4,BorderLayout.CENTER); //把文本框添加到面板上 p.add(l5,BorderLayout.NORTH); //把標簽添加到面板上 p.add(t5,BorderLayout.CENTER); //把文本框添加到面板上 p.add(l6,BorderLayout.NORTH); //把標簽添加到面板上 p.add(t6,BorderLayout.CENTER); //把文本框添加到面板上 b0=new JButton("生成父母基因"); //創建父母基因生成按鈕 pb.add(b0); //添加到面板上

b1=new JButton("100次交叉、變異"); //創建交叉、變異按鈕 pb.add(b1); //添加到面板上 b2=new JButton("200次交叉、變異"); pb.add(b2); b3=new JButton("500次交叉、變異");

- 7

JAVA實驗報告

Object s=e.getSource(); if(s==b0) //監聽器實現功能 {

t3.setText(s1); //t3文本框輸出s1

} t1.setText(s2); t4.setText(String.valueOf(H1)); t5.setText(String.valueOf(H2));

if(s==b1)time(100); //監聽器實現功能

} if(s==b2)time(200); if(s==b3)time(500);

public void time(int r) //定義方法,實現函數的調用

{

int x,y,z,d1=0,d2=0,w,k,H3=0;

c=new int[23]; //定義一個數組

for(int j=1;j<=r;j++) //基因的交叉 {

x=1+(int)(Math.random()*23); //生成一個隨機父親基因位

y=1+(int)(Math.random()*23); //生成一個隨機母親基因位

z=f[x-1];f[x-1]=m[y-1];m[y-1]=z; //兩個基因位的基因調換 }

for(int j=0;j<23;j++) //分別計算父母基因總和

{

d1+=f[j];

- 9

JAVA實驗報告

2)程序的運行(包括運行的過程、界面和結果圖)

首先編寫如上所示的源程序,保存文件名稱為“YichuanSuanfa.java”,然后編譯源程序,編譯完成后,生成一個字節碼文件YichuanSuanfa.class,執行這個程序,得到如下圖所示的窗口:

隨機生成父母基因,得到如下圖示:

- 11

JAVA實驗報告

500次交叉、變異之后,得到如下圖示:

4.實驗心得

.java文件名要與主類名相同,JAVA對字

1.編寫調試程序要注意程序編寫的規則,母的大小寫特別敏感,輸入時要特捏注意大小寫字母的定義,千萬別犯主類名與.java文件名不同的錯誤。

2.在做圖形界面時,注意設置圖形界面的大小以及文本框、標簽和按鈕的位置。創建文本框的時候,可以設置文本框的可寫性,以及文本框的顏色等等。在隨機生成父母基因的時候,注意生成的隨機數是什么范圍,我們實驗要求的范圍是什么。監聽器的響應,在文本框中輸出的是一個基因整體還是一個數,都需要注意,因為這兩種輸出的方法不同。

3.為了簡化程序,我們應該學會調用函數的方法。一開始做程序的時候,我沒有注意到這一點,導致我的程序代碼非常繁雜,而且容易出錯。在同學的建議下,我把100次、200次、500次交叉、變異的實現使用調用函數的方法,這樣我的程序代碼變得簡明多了。因此,在做程序的時候應該考慮到程序代碼的簡明扼要,不但美觀,還能保證

JAVA實驗報告

正確性的要求。

4.特別要注意的是一個變量的使用范圍,在同一個方法中,同一變量是可以通用的,即不用重復定義,可以被系統認識,在不同的方法之間,同一變量是不能被對方所認識的,這就需要我們在定義變量時,注意變量的使用范圍,如果需要在不同的方法中被引用,那就需要我們在所有的方法之外,同一類中進行定義。

第二篇:遺傳算法學習心得體會

遺傳算法

概念

遺傳算法是模仿自然界生物進化機制發展起來的隨機全局搜索和優化方法,它借鑒了達爾文的進化論和孟德爾的遺傳學說。其本質是一種高效、并行、全局搜索的方法,它既能在搜索中自動獲取和積累有關空間知識,并自適應地控制搜索過程以求得最優解遺傳算法操作使用適者生存的原則,在潛在的解決方案種群中逐次產生一個近視最優方案。在遺傳算法的每一代中,根據個體在問題域中的適應度值和從自然遺傳學中借鑒來的再造方法進行個體選擇,產生一個新的近視解。這個過程導致種群中個體的進化,得到的新個體比原個體更適應環境,就像自然界中的改造一樣。

應用

遺傳算法在人工智能的眾多領域具有廣泛應用。例如,機器學習、聚類、控制(如煤氣管道控制)、規劃(如生產任務規劃)、設計(如通信網絡設計、布局設計)、調度(如作業車間調度、機器調度、運輸問題)、配置(機器配置、分配問題)、組合優化(如tsp、背包問題)、函數的最大值以及圖像處理和信號處理等等。遺傳算法多用應與復雜函數的優化問題中。 原理

遺傳算法模擬了自然選擇和遺傳中發生的復制、交叉、和變異等現象,從任一初始種群出發,通過隨機選擇、交叉、變異操作,產生一群更適合環境的個體,使群體進行到搜索空間中越來越好的區域,這樣一代一代地不斷繁衍進化,最后收斂到一群最適合環境的個體求得問題的最優解。

算法流程 1. 編碼:解空間中的解數據x,作為作為遺傳算法的表現型形式。從表現

型到基本型的映射稱為編碼。遺傳算法在進行搜索之前先將解空間的解數據表示成遺傳空間的基本型串結構數據,這些串結構數據的不同的組合就構成了不同的點。 2. 初始種群的形成:隨機產生n個初始串數據,每個串數據稱為一個個體, n個串數據構成了一個群體。遺傳算法以這n個串結構作為初始點開始迭代。設置進化代數計數器t 0;設置最大進行代數t;隨機生成m個個體作為初始群體p(0)。 3. 適應度檢測:適應度就是借鑒生物個體對環境的適應程度,適應度函數 就是對問題中的個體對象所設計的表征其優劣的一種測度。根據具體問題計算p(t)的適應度。

4. 選擇:將選擇算子作用于群體。選擇的目的是把優化的個體直接遺傳到

下一代或通過配對交叉產生新的個體再遺傳到下一代。選擇操作是建立在群體中個體的適應度評估基礎上的。

5. 交叉:將交叉算子作用于群體。所謂交叉是指把兩個父代個體的部分結

構加以替換重組而生成新個體的操作。遺傳算法中起核心作用的就是交叉算子。 6. 變異:將變異算子作用于群體。即是對群體中的個體串的某些基因座上

的基因值作變動。

群體p(t)經過選擇、交叉、變異運算之后得到下一代群體p(t+1)。 7. 終止條件判斷:若t<=t,則t=t+1,轉到第3步,否則以進化過程中所得

到的具有最大適應度個體作為最優解輸出,終止計算。

遺傳算法流程圖如下圖所示: 遺傳算法

下幾種:適應度比例方法、隨機遍歷抽樣法、局部選擇法。

其中輪盤賭選擇法是最簡單也是最常用的選擇方法。在該方法中,各個個體的選擇概率和其適應度值成比例。設群體大小為n,其中個體i的適應度為,則i 被選擇的概率,為遺傳算法

2、交叉:在自然界生物進化過程中起核心作用的是生物遺傳基因的重組(加上變異)。同樣,遺傳算法中起核心作用的是遺傳操作的交叉算子。所謂交叉是指把兩個父代個體的部分結構加以替換重組而生成新個體的操作。通過交叉,遺傳算法的搜索能力得以飛躍提高。

交叉算子根據交叉率將種群中的兩個個體隨機地交換某些基因,能夠產生新的基因組合,期望將有益基因組合在一起。根據編碼表示方法的不同,可以有以下的算法: b)二進制交叉(binary valued crossover) 1)單點交叉(single-point crossover) 2)多點交叉(multiple-point crossover) 3)均勻交叉(uniform crossover) 4)洗牌交叉(shuffle crossover) 5)縮小代理交叉(crossover with reduced surrogate)。

3、變異

變異算子的基本內容是對群體中的個體串的某些基因座上的基因值作變動。依據個體編碼表示方法的不同,可以有以下的算法: a)實值變異 b)二進制變異。

一般來說,變異算子操作的基本步驟如下: a)對群中所有個體以事先設定的編譯概率判斷是否進行變異 b)對進行變異的個體隨機選擇變異位進行變異。

例:簡單一元函數優化

求下面函數的最大值:

f(x)=xsin(10*pi*x)+2.0, -1<=x<=2; 程序: figure(1); fplot(variable.*sin(10*pi*variable)+2.0,[-1,2]); %畫出函數曲線 %定義遺傳算法參數

nind=40; %個體數目(number of individuals) maxgen=25; %最大遺傳代數(maximum number of generations) preci=20; %變量的二進制位數(precision of variables) ggap=0.9; %代溝(generation gap) trace=zeros(2, maxgen); %尋優結果的初始值 fieldd=[20;-1;2;1;0;1;1]; %區域描述器(build field descriptor) chrom=crtbp(nind, preci); %初始種群 gen=0; %代計數器 variable=bs2rv(chrom, fieldd);

%計算初始種群的十進制轉換

objv=variable.*sin(10*pi*variable)+2.0; %計算目標函數值 while gen

基本概念

遺傳算法(genetic algorithms, ga)是一類借鑒生物界自然選擇和自然遺傳機制的隨機化搜索算法。

它模擬自然選擇和自然遺傳過程中發生的繁殖、交叉和基因突變現象,在每次迭代中都保留一組候選解,并按某種指標從解群中選取較優的個體,利用遺傳算子(選擇、交叉和變異)對這些個體進行組合,產生新一代的候選解群,重復此過程,直到滿足某種收斂指標為止。 ga的組成: (1)編碼(產生初始種群)

(2)適應度函數

(3)遺傳算子(選擇、交叉、變異)

(4)運行參數

編碼

基因在一定能夠意義上包含了它所代表的問題的解?;虻木幋a方式有很多,這也取決于要解決的問題本身。常見的編碼方式有:

(1) 二進制編碼,基因用0或1表示(常用于解決01背包問題) 如:基因a:00100011010 (代表一個個體的染色體) (2) 互換編碼(用于解決排序問題,如旅行商問題和調度問題)

如旅行商問題中,一串基因編碼用來表示遍歷的城市順序,如:234517986,表示九個城市中,先經過城市2,再經過城市3,依此類推。

(3) 樹形編碼(用于遺傳規劃中的演化編程或者表示)

如,問題:給定了很多組輸入和輸出。請你為這些輸入輸出選擇一個函數,使得這個函數把每個輸入盡可能近地映射為輸出。

編碼方法:基因就是樹形結構中的一些函數。

(4) 值編碼 (二進制編碼不好用時,解決復雜的數值問題)

在值編碼中,每個基因就是一串取值。這些取值可以是與問題有關任何值:整數,實數,字符或者其他一些更復雜的東西。

適應度函數

遺傳算法對一個個體(解)的好壞用適應度函數值來評價,適應度函數值越大,解的質量越好。適應度函數是遺傳算法進化過程的驅動力,也是進行自然選擇的唯一標準,它的設計應結合求解問題本身的要求而定。

如tsp問題,遍歷各城市路徑之和越小越好,這樣可以用可能的最大路徑長度減去實際經過的路徑長度,作為該問題的適應度函數。

遺傳算子——選擇

遺傳算法使用選擇運算來實現對群體中的個體進行優勝劣汰操作:適應度高的個體被遺傳到下一代群體中的概率大;適應度低的個體,被遺傳到下一代群體中的概率小。選擇操作的任務就是按某種方法從父代群體中選取一些個體,遺傳到下一代群體。 sga(基本遺傳算法)中采用輪盤賭選擇方法。

輪盤賭選擇又稱比例選擇算子,基本思想:各個個體被選中的概率與其適應度函數值大小成正比。設群體大小為n ,個體i 的適應度為 fi,則個體i 被選中遺傳到下一代群體的概率為:

遺傳算子——交叉

所謂交叉運算,是指對兩個相互配對的染色體依據交叉概率按某種方式相互交換其部分基因,從而形成兩個新的個體。交叉運算在ga中起關鍵作用,是產生新個體的主要方法。 1. 單交叉點法 (用于二進制編碼)

選擇一個交叉點,子代在交叉點前面的基因從一個父代基因那里得到,后面的部分從另外一個父代基因那里得到。

如:交叉前:

00000|01110000000010000 11100|00000111111000101 交叉后:

00000|00000111111000101 11100|01110000000010000 2. 雙交叉點法 (用于二進制編碼)

選擇兩個交叉點,子代基因在兩個交叉點間部分來自一個父代基因,其余部分來自于另外一個父代基因. 如:交叉前: 01 |0010| 11 11 |0111| 01 交叉后: 11 |0010| 01 01 |0111| 11 3. 基于“ 與/或 ”交叉法 (用于二進制編碼) 對父代按位與”邏輯運算產生一子代a;按位”或”邏輯運算產生另一子代b。該交叉策略在解背包問題中效果較好 . 如:交叉前: 01001011 11011101 交叉后: 01001001 11011111 4. 單交叉點法 (用于互換編碼)

選擇一個交叉點,子代的從初始位置出發的部分從一個基因復制,然后在另一個基因中掃描,如果某個位點在子代中沒有,就把它添加進去。 如:交叉前: 87213 | 09546 98356 | 71420 交叉后:

87213 | 95640 98356 | 72104 5. 部分匹配交叉(pmx)法(用于互換編碼) 先隨機產生兩個交叉點,定義這兩點間的區域為匹配區域,并用交換兩個父代的匹配區域。

父代a:872 | 130 | 9546 父代b:983 | 567 | 1420 變為: temp a: 872 | 567 | 9546 temp b: 983 | 130 | 1420 對于 temp a、temp b中匹配區域以外出現的數碼重復,要依據匹配區域內的位置逐一進行替換。匹配關系:1<——>5 3<——>6 7<——>0 子代a:802 | 567 | 9143 子代b:986 | 130 | 5427 6. 順序交叉法(ox) (用于互換編碼)

從父代a隨機選一個編碼子串,放到子代a的對應位置;子代a空余的位置從父代b中按b的順序選取(與己有編碼不重復)。同理可得子代b。 父代a: 872 | 139 | 0546 父代b: 983 | 567 | 1420 交叉后:

子代a: 856 | 139 | 7420 子代b: 821 | 567 | 3904 7. 循環交叉(cx)法(用于互換編碼) cx同ox交叉都是從一個親代中取一些城市,而其它城市來自另外一個親代,但是二者不同之處在于:ox中來自第一個親代的編碼子串是隨機產生的,而cx卻不是,它是根據兩個雙親相應位置的編碼而確定的。

父代a:1 2 3 4 5 6 7 8 9 | | | | | 父代a:5 4 6 9 2 3 7 8 1 可得循環基因:1->5->2->4->9->1 用循環的基因構成子代a,順序與父代a一樣 1 2 4 5 9 用父代b剩余的基因填滿子代a: 1 2 6 4 5 3 7 8 9 子代b的編碼同理。(循環基因 5->1->9->4->2->5)

遺傳算子——變異 變異是指依據變異概率將個體編碼串中的某些基因值用其它基因值來替換,從而形成一個新的個體。ga中的變異運算是產生新個體的輔助方法,它決定了ga的局部搜索能力,同時保持種群的多樣性。交叉運算和變異運算的相互配合,共同完成對搜索空間的全局搜索和局部搜索。

注:變異概率pm不能太小,這樣降低全局搜索能力;也不能太大,pm > 0.5,這時ga退化為隨機搜索。篇三:計算智能學習心得體會

計算智能學習心得體會

本學期我們水利水電專業開了“計算智能概論”這門課,有我們學院的金菊良教授給我們授課,據說這門課相當難理解,我們課下做了充分的準備,借了計算智能和人工智能相關方面的書籍,并提前了解了一點相關知識,我感覺看著有點先進,給我們以往學的課程有很大區別,是一種全新的概念和理論,里面的遺傳算法、模糊集理論、神經網絡更是聞所未聞,由于課前讀了一些書籍,我以為課堂上應該能容易理解一點,想不到課堂上聽著還是相當玄奧,遺傳算法還好一點,因為高中學過生物遺傳,遺傳算法還能理解一點。像模糊集理論神經網絡便不知所云了。雖然金老師講課生動形象,幽默風趣,而且舉了好多實際的例子,但有一些理論有點偏難。

多關于ci的解釋。

雖然有好多計算智能理論還不太清楚,但是我對新知識還是相當渴望的,因為我本身比較愛學習,且喜歡讀書。我感覺學到了許多知識:計算智能是一門經驗科學,它研究自然的或人工的智能行為形成之原理以“推理即計算”為基本假設,開發某種理論、說明某項智能可以算法化,從而可以用機器模擬和實現;尋求和接受自然智能之啟迪,但不企圖完全仿制人類智能,其中心工程目標是研究設計和建立智能計算系統的方法。

由于我們只有16課時,所以我們學的面并不廣,金老師主要教了一些計算智能方面的經典理論,我們所學的計算智能所涉及的領域主要包括以下三方面:遺傳算法、人工神經網絡方法和模糊集理論。

遺傳算法最早由美國michigan大學john h. holland教授提出,

按照生物進化過程中的自然選擇(selection)、父代雜交(crossover)和子代變異(mutation)的自然進化(natural evolution)方式,編制的計算機程序,能夠解決許多復雜的優化問題,這類新的優化方法稱之為遺傳算法(genetic algorithm,ga)[7]。ga模擬生物進化過程中的主要特征有:(1)生物個體的染色體(chromosomes)的結構特征,即基因碼序列(series of genetic code)決定了該個體對其生存環境的適應能力。(2)自然選擇在生物群體(population)進化過程中起著主導作用,它決定了群體中那些適應能力(adaptability)強的個體能夠生存下來并傳宗接代,體現了“優勝劣汰”的進化規律。(3)個體繁殖(雜交)是通過父代個體間交換基因材料來實現的,生成的子代個體的染色體特征可能與父代的相似,也可能與父代的有顯著差異,從而有可能改變個體適應環境的能力。

(4)變異使子代個體的染色體有別于其父代個體的染色體,從而也改變了子代個體對其環境的適應能力。(5)生物的進化過程,從微觀上看是生物個體的染色體特征不斷改善的過程,從宏觀上看則是生物個體的適應能力不斷提高的過程。 作為利用自然選擇和群體遺傳機制進行高維非線性空間尋優的一類通用方法,遺傳算法(ga)不一定能尋得最優(optimal)點,但是它可以找到更優(superior)點,這種思路與人類行為中成功的標志是相似的。例如不必要求某個圍棋高手是最優的,要戰勝對手只需他(她)比其對手更強即可。因此,ga可能會暫時停留在某些非最優點上,直到變異發生使它遷移到另一更優點上。遺傳算法隨編碼

方式、遺傳操作算子的不同而表現為不同形式,因此難以象傳統的共軛梯度法那樣從形式上給以明確定義,它的識別標志在于它是否具有模擬生物的自然選擇和群體遺傳機理這一內在特征。目前國內外普遍應用的實施方案是標準遺傳算法(simple genetic algorithm,sga)。 bp神經網絡 bp神經網絡是用反向傳播學習算法(back-propagation algorithm,bp算法)訓練的一種多層前饋型非線性映射網絡,網絡中各神經元接受前一級的輸入,并輸出到下一級,網絡中沒有反饋聯接。bp神經網絡通??梢苑譃椴煌膶?級),第j層的輸入僅與第j–1層的輸出聯接。由于輸入層節點和輸出層節點可與外界相連,直接接受環境的影響,所以稱為可見層,而其它中間層則稱為隱層(hidden layer)。決定一個bp神經網絡性質的要素有三個:網絡結構、神經元作用函數和學習算法,對這三個要素的研究構成了豐富多彩的內容,尤其是后者被研究得最多。bp算法是目前應用最為廣泛且較成功的一種算法,它解決了多層前饋網絡的學習問題,從而使該網絡在各方面獲得了廣泛應用。它利用梯度搜索技術(gradient search technique)使代價函數(cost function)最小化。 bp算法把一組樣本的輸入輸出問題歸納為一非線性優化問題,它使用了最優化方法中最常用的負梯度下降算法。用迭代運算求解網絡權重和閾值對應于網絡的學習記憶過程,加入隱層節點使得優化問題的可調參數增加,從而可得到更精確的解。

模糊集理論

模糊集理論(又稱模糊數學,fuzzy mathematics)就是應用模糊集這一模擬人腦模糊思維的數學工具,來描述、分析、識別、分類、判斷、推理、決策和控制各種模糊事物所形成的一門現代應用數學分支學科。經典數學僅考慮現實世界的數量而拋棄現實世界的質量,而模糊集理論則反映了現實世界數量與質量的統一性,是對經典數學的一種補充和完善。定義模糊集、模糊關系的不同運算(目前主要是代數運算),就可得到相應的不同模糊數學方法。目前已研究成熟并廣為應用的模糊數學方法主要有模糊模式識別、模糊聚類分析、模糊綜合評價、模糊推理、模糊控制等方法。在現代科學技術體系中定性因素和主觀因素定量化處理的方法至今仍很少,而模糊數學方法正是其中的典型代表,目前已在各科學和工程領域得到了廣泛的成功應用,其主要原因在于它異于其它方法的一些顯著特點:(1)模糊集的引入改善了二值邏輯中硬性的分類方法,是普通集合的推廣,使模糊數學方法更加接近于廣泛存在模糊性和不精確性的現實世界,也更加接近于人類思維方式。這些真實性使得模糊數學方法能很好地平衡系統的復雜性與描述系統的精確性,也有助于模糊數學方法充分提取各種專家經驗信息和其它人類語言信息。(2)當系統為多輸入多輸出、強非線性、定性信息與定量信息混雜的動態系統時,系統的數學模型非常復雜或根本就不存在確定性數學模型,常規方法難以或不能有效處理這樣的復雜系統,而模糊數學方法可以用建立在語言型經驗之上的模糊集及其運算就可以簡便有效地處理,有時甚至不需要輔以確定的數學模型。(3)模糊數學方法可以直接利用人類語言型概念及其運算,篇四:遺傳算法總結

遺傳算法總結

遺傳算法是借鑒生物的自然選擇和遺傳進化機制而開發出的一種全局自適應概率搜索算法。

一、遺傳算法流程圖

圖1 遺傳算法流程圖

二、遺傳算法的原理和方法 1) 染色體編碼

把一個問題的可行解從其解空間轉換到遺傳算法所能處理的搜索空間的轉換方法就稱為編碼。 de jong曾提出了兩條操作性較強的實用編碼原則:編碼原則一:應使用能易于產生與所求問題相關的且具有低階、短定義長度模式的編碼方案;編碼原則二:應使用能使問題得到自然表示或描述的具有最小編碼字符集的編碼方案。

編碼方法主要有以下幾種:二進制編碼方法、格雷碼編碼方法、浮點數編碼方法、符號編碼方法、參數級聯編碼方法、多參數交叉編碼方法。 2) 適應值計算

由解空間中某一點的目標函數值f(x)到搜索空間中對應個體的適應度函數值 fit(f(x))的轉換方法基本上有一下三種: a. 直接以待解的目標函數值f(x)轉化為適應度函數值fit(f(x)),令 ?f(x) 目標函數為最大化函數 fit(fx())= ? ??f(x)目標函數為最小化函數 ?cmax?f(x) f(x)?cmax b. 對于最小值的問題,做下列轉化fit(f(x))??,其中cmax是 0 其他? f(x)的最大輸入值。

c. 若目標函數為最小值問題,fit(f(x))? 1 , c?0, c?f(x)?0 1?c?f(x) 1 , c?0, c?f(x)?0 1?c?f(x) 若目標函數為最大值問題,fit(f(x))?3) 選擇、交叉、變異

遺傳算法使用選擇算子來對群體中的個體進行優勝劣汰操作:根據每個個體的適應度值大小選擇。適應度較高的個體被遺傳到下一代群體中的概率較大;適應度較低的個體的被遺傳到下一代群體中的概率較小。其中選擇的方法有:輪盤賭選擇、隨機競爭選擇、最佳保留選擇、無回放隨機選擇、確定式選擇等。

遺傳算法中的所謂交叉運算,是指對兩個相互配對的染色體按某種方式相互交換其部分基因,從而形成兩個新的個體。交叉操作主要有單點交叉、兩點交叉與多點交叉、均勻交叉和算數交叉四種。

遺傳算法中的變異運算,是指將個體染色體編碼串中的某些基因座上的基因值用該基因座的其他基因來替換,從而形成一個新的個體。主要有基本位變異、均勻變異、邊界變異等幾種變異操作方法。 4) 控制參數選擇

交叉概率pcpm

三、算例

min f(x1,x2)?(x1?3)2?(x2?2)2 2 ?g1(x1,x2)?x12?x2?5? s.t.?h1(x1,x2)?x1?2x2?4?0?x,x?10,x?n 121? (1) 1)三種不同的遺傳方法

方法一:原模型中x

1、x2均為決策變量,操作如下。 a. 采用混合整數編碼,對x1進行十進制編碼,x2進行二進制編碼; b. 適應度函數值采用fit(f(x1,x2))? 1 計算,其中 c?f(x1,x2) c???max{0,g1(x1,x2)?5}???max{0,|h1(x1,x2)?4|},?=?=10000; c. 采用賭輪盤選擇、單點交叉和基本位變異; d. pc=0.8,pm=0.1,遺傳代數為200,種群中個體數100; e. 終止條件為連續十次最優個體保持不變或遺傳代數到達200。 方法二:已知等式約束h1(x1,x2),可得x2?(4?x1)/2,則原問題可化為 min f(x1)?(x1?3)2?(( 4?x1 )?2)22 (2) 4?x12?2 g(x)?x?()?5111? 2?s..t?0?x1?10,x1?n?4?x1?0??10 2? x min f(x1)?(x1?3)2?(1)2 2 即等式約束簡化后的模型為 4?x12?2 g(x)?x?()?5?1 s..t?112??0?x1?4,x1?n 其中a~b的操作如下,而c~e的操作同方法一。 a. 對x1進行十進制編碼; b. 適應度函數值采用fit(f(x1,x2))? (3) 1 計算,其中 c?f(x1,x2) c???max{0,g1(x1,x2)?5},?=10000 方法三:在方法二的基礎上,改變x1的編碼方法,對x1進行二進制編碼。由于0?x1?4,且為自然數,則二進制編碼至少為3位,但3位的二進制可以表示0~7的整數,所以存在冗余編碼。則通過懲罰來排除冗余編碼,即適應度函數值采用 fit(f(x1,x2))? 1 計算。 c?f(x1,x2) 其中c???max{0,g1(x1,x2)?5}???max{0,x1(i)?4},?=10000。x1(i)表示個體解碼后的x1。

2)三種方法的計算結果

方法一可得到三個不同的解:

解1:x1?2,x2?1, fit(f(x1,x2))?0.4646, f(x)?2.0000,適應度趨勢圖如下: 圖2 方法一解1的適應度趨勢圖

解2:x1?0,x2?2, fit(f(x1,x2))?0.1075, f(x)?9.0000,適應度趨勢圖如下: 篇五:遺傳算法學習作業

遺傳算法學習總結 1.1 概述 遺傳算法是一類借鑒生物界的進化規律(適者生存,優勝劣汰遺傳機制)演化而來的自適應概率性隨機化迭代搜索算法。1962年霍蘭德(holland)教授首次提出了ga算法的思想,它的基本思想是基于darwin進化論和mendel的遺傳演說。darwin進化論最重要的是適者生存的原理,它認為每一代種群總是向著前進方向發展,越來越適應環境。每一個個體都有繼承前代的特性,但不是完全繼承,會產生一些新特性。最終只有適應環境的特征才能被保留下來。mendel遺傳學說最重要的是基因遺傳原理,它認為遺傳以密碼方式存在細胞中,并以基因形式包含在染色體內。一條染色體中存在很多基因,每個基因有自己的位置并控制著外部特征;基因的產生和變異直接影響到個體的特性是否能適應環境。經過存優去劣的自然淘汰,適應性高的基因結構得以保存下來。

遺傳算法正是借用了仿真生物遺傳學和自然選擇機理,通過自然選擇、遺傳、變異等作用機制,實現各個個體的適應性的提高。

與自然界相似,遺傳算法對求解問題的本身一無所知,從代表問題可能潛在解集的一個種群(population)開始,每一個種群則由經過基因(gene)編碼(coding)的一定數目的個體 (individual)構成。每個個體實際上是染色體(chromosome)帶有特征的實體。把問題的解表示成染色體,并基于適應值來選擇染色體,遺傳算法所需要的僅是對算法所產生的每個染色體進行評價,使適應性好的染色體有更多的繁殖機會。在算法中也就是以二進制編碼的串。并且,在執行遺傳算法之前,給出一群染色體,也就是假設解。然后,把這些假設解置于問題的“環境”中,也即在一個適應度函數中來評價。并按適者生存的原則,從中選擇出較適應環境的染色體進行復制,淘汰低適應度的個體,再通過交叉,變異過程產生更適應環境的新一代染色體群。對這個新種群進行下一輪進化,直到最適合環境的值。 1.2遺傳算法的基本原理和特點 1.2.1 算法原理

在遺傳算法中,通過隨機方式產生若干個所求解問題的數字編碼,即染色體,形成初始種群;通過適應度函數給每個個體一個數值評價,淘汰低適應度的個體,選擇高適應度的個體參加遺傳操作,經過遺傳操作后的個體集合形成下一代新的種群,再對這個新種群進行下一輪進化,這就是遺傳算法的基本原理。

遺傳算法的主要步驟如下: 1)隨機產生一個由確定長度的特征串組成的初始群體; 2)對串群體迭代地執行步驟(1)和(2),直到滿足停止準則: (1)計算群體中每個個體的適應值。 (2)應用復制、雜交和變異算子產生下一代群體。 3)把在任一代中出現的最好的個體串指定為遺傳算法的執行結果。這個結果可以表示問題的一個解(或近似解)。 基本遺傳算法的流程圖如圖 1-1,其中gen是當前代數,m為每代種群中最大個體數。

圖1-1 基本遺傳算法的流程圖 1.2.2 算法特點

遺傳算法的特點如下: 1) 遺傳算法中不包含待解決問題所持有的形態。它是從改變基因的配置來實現問題的整體優化的,因而屬于自下而上的優化方法; 2) 類似于生物的進化過程,遺傳算法處理的是變量集合的編碼而非變量本身。它直接 對結構對象進行操作,不存在求導和函數連續性的限定; 3) 遺傳算法具有內在的隱并行性和更好的全局尋優能力; 4) 遺傳算法采用概率化的尋優方法,能自動獲取和指導優化的搜索空間,自適應地調整搜索方向,不需要確定的規則。

遺傳算法的這些特點已被人們廣泛地應用于組合優化、機器學習、信號處理、自適應控制和人工生命等領域。它是現代有關智能計算中的關鍵技術之一。 1.3 基本遺傳算法的步驟

1.3.1 染色體編碼(chromosome coding)與解碼(decode) 基本遺傳算法使用固定長度的二進制符號串來表示群體中的個體,其等位基因由二值{0,1}所組成。初始群體中各個個體的基因可用均勻分布的隨機數來生成。例如:x=100111001000101101就可表示一個個體,該個體的染色體長度是n=18。 (1)編碼:變量x作為實數,可以視為遺傳算法的表現型形式。從表現型到基因型的映射稱為編碼。設某一參數的取值范圍為[u1,u2],我們用長度為k的

二進制編碼符號來表示該參數,則它總共產生2k種不同的編碼,可使參數編碼時的對應關系為:

000000?0000=0→u1 000000?0001=1→u1+? 000000?0010=2→u1+2? ? 111111?1111=2k-1→u2 u?u其中,?=2 k1。 2?1 (2)解碼:假設某一個體的編碼為bkbk-1bk-2?b2b1,則對應的解碼公式為 x?u1?(?bi?2i?1)? i?1ku2?u1 ① k2?1 例如:設有參數x∈[2,4],現用5位二進制編碼對x進行編碼,得25=32個二進制串(染色體):

00000,00001,00010,00011,00100,00101,00110,00111 01000,01001,01010,01011,01100,01101,01110,01111 10000,10001,10010,10011,10100,10101,10110,10111 11000,11001,11010,11011,11100,11101,11110,11111 對于任一個二進制串,只要代入公式①,就可得到相應的解碼,如x22=10101,它對應的十進制為?bi?2i?1=1+0*2+1*22+0*23+1*24=21,則對應參數 i?15 x的值為2+21*(4-2)/(25-1)=3.3548。 1.3.2 個體適應度的檢測評估

基本遺傳算法按與個體適應度成正比的概率來決定當前群體中各個個體遺傳到下一代群體中的機會多少。為了正確估計這個概率,要求所有個體的適應度

必須為非負數。所以,根據不同種類的問題,需要預先確定好由目標函數值到個體適應度之間的轉換規律,特別是要預先確定好當目標函數值為負數時的處理方法。例如,可選取一個適當大的正數c,使個體的適應度為目標函數值加上正數c。 1.3.3 遺傳算子

基本遺傳算法使用下列三種遺傳算子:

(1)選擇運算使用比例選擇算子。比例選擇因子是利用比例于各個個體適應度的概率決定其子孫的遺傳可能性。若設種群數為m,個體i的適應度為fi,則個體i被選取的概率為 pi?fi/?fk k?1m 當個體選擇的概率給定后,產生[0,1]之間的均勻隨機數來決定哪個個體參加交配。若個體的選擇概率大,則能被多次選中,它的遺傳基因就會在種群中擴大;若個體的選擇概率小,則被淘汰。

我們經常采用的是輪盤賭的原理,個體的選擇概率是基于它們的性能進行的一些計算。實值范圍——總和是所有個體期望的選擇概率的總和或當前種群中所有個體原始適應度值的總和。個體采用一對一方式

映像到范圍[0,sum]的一連續區間,每一個體區間的 大小與對應個體的適應度值相匹配。如圖1所示,輪

盤賭輪的周長是6個個體適應度值的總和,個體5 是最大適應度個體,它占有最大的區間。選擇一個個

體,用在[0,sum]間產生隨機數,看此隨機數在哪個

個體的區間上,則此個體被選中。重復此過程,直到

所需數量個體被選中為止。

(2)交叉運算使用單點交叉算子。只有一個交叉點位置,任意挑選經過選擇操作后種群中兩個個體作為交叉對象,隨機產生一個交叉點位置,兩個個體在交叉點位置互換部分基因碼,形成兩個子個體,如圖2所示。

父個體1 父個體2 110 11 011 00 單點交叉 子個體1 子個體2 圖2 單點交叉示意圖

(3)變異運算使用基本位變異算子或均勻變異算子。為了避免問題 過早收斂,對于二進制的基因碼組成的個體種群,實現基因碼的小概率翻轉,即0變為1,而1變為0,如圖3所示。

變異

圖3 變異操作示意圖 1.3.4 基本遺傳算法的運行參數 基本遺傳算法有下列4個運行參數需要預先設定,即m,t,pc,pm。 m為群體大小,即群體中所含個體的數量,一般取為20~100; t為遺傳算法的終止進化代數,一般取為100~500; pc為交叉概率,一般取為0.4~0.99; pm為變異概率,一般取為0.0001~0.1。 1.4遺傳算法的應用 進入90年代后,遺傳算法迎來了興盛發展時期,無論是理論研究還是應用研究都成了十分熱門的課題。尤其是遺傳算法的應用研究顯得格外活躍,不但它的應用領域擴大,而且利用遺傳進行優化和規則學習的能力也顯著提高,同時產業應用方面的研究也在摸索之中。

遺傳算法提供了一種求解復雜系統問題的通用框架,它不依賴于問題的具體領域,對問題的種類有很強的魯棒性,所以廣泛應用于很多學科。如工程結構優化、計算數學、制造系統、航空航天、交通、計算機科學、通信、電子學、材料科學等。 1)ga在數值優化上的應用

最優化問題是遺傳算法經典應用領域,但采用常規方法對于大規模、多峰態函數、含離散變量等問題的有效解決往往存在許多障礙。對全局變化問題,目前存在確定性和非確定性兩類方法。前者以brianin的下降軌線法、levy的隧道法和r.ge的填充函數為代表。該類方法雖然收斂快、計算效率高,但算法復雜,求得全局極值的概率不大。 遺傳算法作為現代最優化的手段,實踐證明,它應用于大規模、多峰多態函數、含離散變量等情況下的全局優化問題是合適的,在求解速度和質量上遠遠超過常規方法。 2)ga 在組合優化中的應用

3)遺傳算法在機器學習中的應用

機器學習系統實際上是對人的學習機制的一種抽象和模擬,是一種理想的學習模型?;诜枌W習的機器學習系統如監督型學習系統、條件反射學習系統、類比式學習系統、推理學習系統等,只具備一些較初級的學習能力。近年來,由于遺傳算法的發展,基于進化機制遺傳學習成為一種新的機器學習方法,它將知識表達為另一種符號形式—遺傳基因型,通過模擬生物的進化過程,實現專門領域知識的合理增長型學習。 4)遺傳算法在并行處理中的應用 遺傳算法固有的并行性和大規模并行機的快速發展,促使許多研究者開始研究遺傳算法的并行化問題,研究數量更加接近自然界的軟件群體將成為可能。遺傳算法與并行計算的結合,能把并行機的高速性和遺傳算法固有的并行性兩者的長處彼此結合起來,從而也促進了并行遺傳算法的研究與發展。

第三篇:RSA算法實驗報告

信息安全實驗報告

題 目 RSA算法 姓 名 學 號

專業年級 計算機科學與技術2014級(1)班 指導教師

2016年 12 月 10日

一、 實驗目的

了解非對稱加密機制 理解RSA算法的加解密原理

熟悉Java的學習以及運用Java實現RSA算法的加解密過程

二、 實驗背景

鑰密碼體制中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。加密算法E和解密算法D也都是公開的。雖然秘密密鑰SK是由公開密鑰PK決定的,但卻不能根據PK計算出SK。正是基于這種理論,1978年出現了著名的RSA算法,它通常是先生成一對RSA 密鑰,其中之一是保密密鑰,由用戶保存;另一個為公開密鑰,可對外公開,甚至可在網絡服務器中注冊。為提高保密強度,RSA密鑰至少為500位長,一般推薦使用1024位。這就使加密的計算量很大。為減少計算量,在傳送信息時,常采用傳統加密方法與公開密鑰加密方法相結合的方式,即信息采用改進的DES或IDEA對話密鑰加密,然后使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息后,用不同的密鑰解密并可核對信息摘要。 RSA算法是第一個能同時用于加密和數字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現在的這么多年里,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。

三、 實驗原理

1. 非對稱密鑰加解密概述

使用對稱密鑰加密體制進行保密通信時,任意不同的兩個用戶之間都應該使用互不相同的密鑰。這樣,如果一個網絡中有n個用戶,他們之間彼此都可能進行秘密通信,這時網絡中將需要n(n-1)/2個密鑰(其中,每個用戶都需要保存n-1個密鑰),這樣巨大的密鑰量給密鑰分配和管理帶來了極大的困難。另外,隨著計算機網絡,特別是因特網的發展,網絡上互不相識的用戶可能需要進行保密的會話(例如,如果用戶在進行電子商務活動時,需要保密的連接,這時的客戶對象可能根本不是固定的對象)。最后,對稱密鑰加密機制難以解決簽名驗證問題。

非對稱密鑰加密也稱為公開密鑰加密,或者叫做公鑰加密算法。使用公開密鑰密碼的每一個用戶都分別擁有兩個密鑰:加密密鑰和解密密鑰,它們兩者并不相同,并且由加密密鑰得到解密密鑰在計算機上是不可行的。每一個用戶的加密密鑰都是公開的。因此,加密密鑰也稱為公開密鑰。所有用戶的公開密鑰都將記錄在作用類似于電話號碼薄的密鑰本上,而它可以被所有用戶訪問,這樣每一個用戶都可以得到其他所有用戶的公開密鑰。同時,每一個用戶的解密密鑰將由用戶保存并嚴格保密。因此,解密密鑰也稱為私有密鑰。

非對稱密碼算法解決了對稱密碼體制中密鑰管理的難題,并提供了對信息發送人的身份進行驗證的手段,是現代密碼學最重要的發明。公鑰加密算法一般是將對密鑰的求解轉化為對數學上的困難問題的求解,例如RSA算法的安全性是建立在“大數分解和素性檢測”這個數論難題的基礎上,已知兩個大素數a和b,求出a*b是容易計算的,而已知a*b,想知道其是哪兩個大素數的乘積目前還沒有好的計算方法,另外也有一些非對稱加密算法(如ELGamal算法)的安全性是基于求“離散對數”這個數學難題上的。

在公鑰密碼系統中每個實體都有自己的公鑰和相應的私鑰。公鑰密碼系統的加密變換和解密變換分別用E和D表示。任何實體B要向實體A發送信息m的步驟如下:實體B首先獲得實體A的真實公鑰的拷貝(eA),實體B使用eA計算密文c=E(m)并發送給實體A,實體A使用自己的私鑰dA,計算m=D(c)解密密文,恢復出明文m。這里公鑰不需要保密,但要保證它的真實性,即eA確實是實體A掌握的私鑰dA所對應的公鑰。提供真實的公鑰比安全地分配密鑰實現起來要容易得多。這也是公鑰密碼系統的主要優點之一。

公鑰密碼系統的主要目的是提供保密性,它不能提供數據源認證(data origin authentication)和數據完整性(data integrity)。數據源認證是指:指定的數據是在以前的某個時間確實是由真正的源創建的。數據完整性是指:真正的源創建該數據后經過傳輸后存儲沒有發生改變。數據源認證和數據完整性要由其他技術來提供(如消息認證碼技術、數字簽名技術等)。

從本質上來看,公鑰密碼比對稱密鑰密碼加密的速度要慢,粗略的說,公鑰加密算法RSA硬件實現比分組加密算法DES硬件實現的速度慢1500倍,而軟件實現的速度要慢100倍。

公鑰解密也可以提供認證保證(如:在實體認證協議、帶認證的密鑰建立協議等)。公鑰加密中必須有頒發讓發送消息的人得到想要發送到的那個人的公鑰的真實拷貝,否則就會受到偽裝攻擊。在實踐中有很多方法分發真實的公鑰,如:使用可信的公共文件,使用在線可信服務器,使用離線服務器和認證。

2. 公鑰加解密的優缺點:

1) 大型網絡中的每個用戶需要的密鑰數量少。

2) 對管理公鑰的可信第三方的信任程度要求不高而且是離線的。 3) 只有私鑰是保密的,而公鑰只要保證它的真實性。 4) 多數公鑰加密比對稱密鑰加密的速度要慢幾個數量級。 5) 公鑰加密方案的密鑰長度比對稱加密的密鑰要長。 6) 公鑰加密方案沒有被證明是安全的。

公鑰密碼的概念本身就被公認為是密碼學上的一塊里程碑。三十多年來的研究表明,公鑰密碼成功地解決了計算機網絡安全中的密鑰管理,身份認證和數字簽名等問題,已經成為信息安全技術中的重大核心技術。

四、 RSA算法 1. 概述

RSA加密算法于1977年由美國麻省理工學院的Ronal Rivest,Adi Shamir和Len Adleman三位年輕教授提出,并以三人的姓氏Rivest,Shamir和Adleman命名為RSA算法。這三位科學家榮獲2002圖靈獎,以表彰他們在算法方面的突出貢獻。該算法利用了數論領域的一個事實,那就是雖然把兩個大質數相乘生成一個合數是件十分容易的事情,但要把一個合數分解為兩個質數的乘積卻十分困難。合數分解問題目前仍然是數學領域尚未解決的一大難題,至今沒有任何高效的分解方法。它無須收發雙方同時參與加密過程,既可以用于保密也可以用于簽名,因而非常適合于電子郵件系統的加密,互連網和信用卡安全系統。

算法概述:找兩素數p和q,取n=p*q,取t=(p-1)*(q-1),取任何一個數e,要求滿足e

2. 算法設計

1) publicstaticvoid GetPrime() 說明:利用Java語言的中的java.math.BigInteger類的方法中隨機產生大數。

2) public static boolean MillerRobin(BigInteger num) 參數說明:num是由GetPrime方法產生的大數。

說明:這個方法判斷GetPrime方法傳過來的是否是一個素數,是就返回true,否就返回false。

3) public static BigInteger powmod( BigIntegera,BigIntegert,BigInteger num ) 說明:這個方法對傳入的大數進行冪運算。

4) public static BigInteger invmod(BigInteger a, BigInteger b) 說明:這個方法對大數進行取模運算。

5) public static String Encode(String inStr,BigInteger PrimeP,BigInteger PrimeQ,BigInteger n,int nLen,int m,JTextFieldd) 方法名稱:加密算法。 參數說明:

inStr是從界面輸入的明文。

PrimeP和PrimeQ是由GetPrime方法產生的兩個大素數。 n是由PrimeP和PrimeQ得到的值。 nLen為n的長度。 d為公鑰。

6) publicstatic String Decode(String inStr,BigInteger PrimeP,BigInteger PrimeQ, BigInteger n,int nLen,int m,JTextField e) 方法名稱:解密算法。 參數說明:

inStr是從界面輸入的明文。

PrimeP和PrimeQ是由GetPrime方法產生的兩個大素數。 n是由PrimeP和PrimeQ得到的值。 nLen為n的長度。 e為私鑰。

在對稱加密中:n,d兩個數構成公鑰,可以告訴別人;n,e兩個數構成私鑰,e自己保留,不讓任何人知道。給別人發送的信息使用e加密,只要別人能用d解開就證明信息是由你發送的,構成了簽名機制。別人給你發送信息時使用d加密,這樣只有擁有e的你能夠對其解密。

RSA的安全性在于對于一個大數n,沒有有效的方法能夠將其分解從而在已知n,d的情況下無法獲得e;同樣在已知n,e的情況下無法求得d。

五、 實驗結果

實驗結果如下圖所示:

六、 實驗總結

本次實驗對輸入的任意一段明文字母,實現了輸出對應密鑰的密文字母。親手實際編寫RSA密碼算法代碼,更好的了解和掌握了RSA的相關內容。通過用Java對RSA密碼體制進行編程,對RSA密碼體制的加解密過程有了更深入的理解。通過這個實驗更是讓我獲得了很多實際工作中所要具備的能力。

七、 代碼附錄

第四篇:《計算機算法》實驗報告

1. 實驗名稱

本次實驗的名稱。

2. 問題描述

對本次實驗要解決的問題的描述。

例子:處理漢諾塔問題時,描述什么是漢諾塔問題。

3. 解決思路

采用什么方法;為什么可以采用這個方法; 例子:處理棋盤覆蓋問題時,

采用什么方法:采用遞歸分治的方法處理;

為什么可以采用遞歸分治方法的原因(P21頁圖2-6下面一段,理解之后用自己的話表述):由于將棋盤橫、縱各一分為二之后,特殊方格必然位于四個小的棋盤之一,那么剩余的其余三個小棋盤是沒有方格的,如果采用某種L型骨牌覆蓋沒有特殊方格的三個小棋盤的中心相連部分(參見圖2-6的b),則三個小棋盤都各有1個特殊方格所覆蓋。因此,這樣處理之后,原來大棋盤覆蓋的問題,就轉化為四個小棋盤覆蓋的問題,因此可以采用分治策略進行遞歸處理。

4. 算法設計與分析

給出算法設計的基本思想,如:偽算法描述,遞歸方程等。并分析算法的時間復雜度(空間復雜度)。注意,一定要有文字說明。 例子:快速排序 偽算法描述

QuickSort(int a[], int p, int r) { 如果待排序數組a[]中只有一個元素則直接返回; 如果待排序數組a[]中不止一個元素,則進行如下處理 {

對數組a[p:r]進行Partition劃分,使得a[p:r]以a[p]為標準,劃分為三個部分,即:

左半部分a[p:q-1];劃分基準a[q]=a[p];右半部分a[q+1:r];

對左半部分快速排序QuickSort(a, p, q-1);

對右半部分快速排序QuickSort(a, q+1, r); } }

例子:0-1背包問題

遞歸關系或者遞歸方程。

給出P72頁“2.遞歸關系”中的遞歸表達式,并給出文字說明。 注意:偽算法描述,或者遞歸方程不一定全部需要。根據問題的不同,只給出偽算法,或者只給出遞歸方程都可以。兩者同時給出也是可以的。

5. 程序實現

依據第4部分,給出C語言(其他語言亦可)的程序實現,并進行算法時間(空間)復雜度分析。

程序實現部分要包括:程序代碼、程序注釋、程序運行結果(或者截圖)。

例子:快速排序的partition函數 int Partition (Type a[], int p, int r) {

int i=p, j= r+1;

int x = a[p]; //x=a[p]是對數組a進行劃分的標準;

/* 以下循環將數組a[p:r]以a[p]為標準進行劃分,在劃分完畢之后,

* a[p]調整到數組a[p:r]的中間位置q,有a[q]=a[p];q左邊所有的

* 元素均小于a[p],即a[p:q-1]中的任意元素都小于a[p];q右邊

* 所有的元素均大于a[p],即a[q+1:r]中的元素都大于a[p]。

* /

while(true){ /* i用來從數組a[p:r]的左邊向右邊掃描,如果a[++i]中的元素總是 * 小于基準元素的,則是符合劃分標準的,因此,不用額外處理, * 循環一直繼續,直到第一個不滿足劃分標準的a[++i](即a[++i]>=i) * 出現,或者整個數組a[p:r]掃描完畢(即i

while(a[++i]

„„

6. 總結

不用每個實驗寫一個總結,可以在一次課作業的最后寫一個總結。當然,如果需要,在每一個實驗結尾都寫一個總結也是可以的??偨Y的目的是自己知識學習的總結、解決問題的總結、編程的總結等等。

第五篇:用貪心算法求解Prim算法上機實驗報告書

算法分析與設計

實驗報告

班級:學號:姓名:上機時間:

一、實驗目的與要求:

1、熟悉貪心算法的基本原理和適用范圍;

2、使用貪心算法編程,求解最小生成樹問題。

二、實驗題目:

用貪心算法求解Prim算法

三、實驗內容:

任選一種貪心算法(prim或Kruskal),求解最小生成樹。對算法進行

描述和復雜性分析。編程實現。

四、問題描述:

設G=(V,E)是連通帶權圖,V={1,2,…,n}。構造G的最小生成樹的Prim

算法的基本思想是:首先置S={1},然后,只要S是V的真子集,就作如

下的貪心選擇:選取滿足條件i∈s,j∈V-S,且c[i][j]最小的邊,將頂

點j添加到S中。這個過程一直進行到S=V時為止。在這個過程中選取到

的所有邊恰好構成G的一棵最小生成樹。

五、問題分析與算法設計

六、實驗結果及分析

七、實驗總結

八、程序代碼

#include

#include

#include

#include

#include

#define maxint 20

#define inf 700

int AllSelected(int n,int s[])

{

int i;

for(i = 1;i <= n;i++)

{

if(s[i] == 0)

return 0;

}

return 1;

}

void Prim(int n,int **c)

{

int lowcost[maxint];

int closest[maxint];

bools[maxint];s[1]=true;

for(int i=2;i<=n;i++)

{

lowcost[i]=c[1][i];

closest[i]=1;

s[i]=false;

}

for( i=1;i<=n;i++)

{

int min=inf;

int j=1;

for(int k=2;k<=n;k++)

{

if((lowcost[k]

{

min=lowcost[k];

j=k;

}

s[j]=true;

for(int k=2;k<=n;k++)

if((c[j][k]

{

lowcost[k]=c[j][k];closest[k]=j;

}

}

}

}

void main()

{

int n,i,j;

int **k;

printf("請輸入頂點個數:");

scanf("%d",&n);

k= (int **)malloc(sizeof(int *)*(n + 1));

for(i = 1;i <= n;i++)

k[i] = (int *)malloc(sizeof(int)*(n+1));

printf("輸入頂點間的權值(自己到自己為0,沒有路的為大于其他任何值的數): ");for(i=1;i<=n;i++)

for(j=i;j<=n;j++)

{

printf("k[%d][%d]=k[%d][%d]=",i,j,j,i);

scanf("%d",&k[i][j]);

k[j][i]=k[i][j];

}

printf(" ");

printf("頂點 ");

for(i=1;i<=n;i++)

{

printf("%d ",i);

}

printf(" ");

for(i=1;i<=n;i++)

{

printf("%d ",i);

for(j=1;j<=n;j++)

{

printf("%d ",k[i][j]);

}

printf(" ");

}

printf(" ");

Prim(n,k);

}

本文來自 99學術網(www.gaojutz.com),轉載請保留網址和出處

上一篇:試用期個人總結1500字下一篇:win7未能安裝驅動程序

91尤物免费视频-97这里有精品视频-99久久婷婷国产综合亚洲-国产91精品老熟女泄火