量子進化演算法程式
這段量子進化演算法程式引數設定:種群大小為30,量子位數目為18.
import java.io.*;
import java.util.Date;
/*
* 始終用全域性最優更新
*
* 種群大小為30
* Max_Generations 最大進化代數為30代
* maxRun 執行次數為30次
*/
public class Main_GlobalPSystemEvolver {
double com=1/Math.sqrt(2.0);//把根號2分之1的值賦給com
double[][] QBits=new double[60][18];//一個量子位元中有一對複數,種群有30代 ,需要60個複數
double aQBit[][]=new double[2][18];//宣告2個二維陣列並初始化,初始值全部為0;
int qbitCode[][]=new int[30][18];//種群大小30,量子位數目18,定義量子位元編碼為整型
int fitness[]=new int[30];//初始化一維陣列,規定陣列大小為30;
int i=0,j=0;
static int maxRun=30;
static int SUCCESS=0;
static int FAIL=0;
static int totalGenerations=0;
int currentGenerations=0;
int Max_Generations=30;
int BestFitness;
int con_fitness;//歷史最優適應值
int con_individual[]=new int[18];
int index;
int randPN;
double rand;
String BestRule;
Quantum_Update update;
PSystem_FitnessFunction psf;
PSystem_Individual psi=new PSystem_Individual();
//PrintStream outputFitness = null;
public Main_GlobalPSystemEvolver(){
}
//量子位初始化
public void Initial(){
for(i=0;i<60;i++){
for(j=0;j<18;j++){
rand=Math.random();//產生隨機數,可返回0到1之間的一個隨機數
if (rand<0.5)
randPN=1;
else
randPN=-1;
QBits[i][j]=randPN*com;//隨機為正負根號2分之1,為量子位元中兩個分量的值
}
}
}
//量子觀測
public void QBitChange(double[][] bits){//定義了二維陣列變數位元位:bits
int k=0;
for(i=0;i<bits.length;i++){//以行進行迴圈
if (i%2==0){
for(j=0;j<bits[i].length;j++){//以每行的列數迴圈
rand=Math.random();//兩個for迴圈取得二維陣列中的每一個值
if(rand<(bits[i][j]*bits[i][j]))
qbitCode[k][j]=0;
else
qbitCode[k][j]=1;//對量子位元進行二進位制編碼
}
k=k+1;
}
else
continue;
}
}
//確定性
public void QBitDeterminate(int[][] qbits){//定義了二維陣列qbits
for(i=0;i<qbits.length;i++){
if(qbits[i][0]+qbits[i][3]==2){//兩個for迴圈取得二維陣列中的每一個值
rand=Math.random();//產生隨機數
if(rand<=0.5)
qbits[i][0]=0;
else
qbits[i][0]=1;//二進位制編碼
qbits[i][3]=1-qbits[i][0];
}
if(qbits[i][1]+qbits[i][14]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][14]=0;
else
qbits[i][14]=1;
qbits[i][1]=1-qbits[i][14];
}
if(qbits[i][2]+qbits[i][15]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][15]=0;
else
qbits[i][15]=1;
qbits[i][2]=1-qbits[i][15];
}
if(qbits[i][4]+qbits[i][8]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][4]=0;
else
qbits[i][4]=1;
qbits[i][8]=1-qbits[i][4];
}
if(qbits[i][5]+qbits[i][6]+qbits[i][9]==3){
rand=Math.random();
if(rand<=1.0/3){
qbits[i][5]=1;
qbits[i][6]=0;
qbits[i][9]=0;
}
else{
if(rand>2.0/3){
qbits[i][5]=0;
qbits[i][6]=0;
qbits[i][9]=1;
}
else{
qbits[i][5]=0;
qbits[i][6]=1;
qbits[i][9]=0;
}
}
}
else{
if(qbits[i][5]+qbits[i][6]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][5]=0;
else
qbits[i][5]=1;
qbits[i][6]=1-qbits[i][5];
}
if(qbits[i][5]+qbits[i][9]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][5]=0;
else
qbits[i][5]=1;
qbits[i][9]=1-qbits[i][5];
}
if(qbits[i][6]+qbits[i][9]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][6]=0;
else
qbits[i][6]=1;
qbits[i][9]=1-qbits[i][6];
}
}
if(qbits[i][7]+qbits[i][10]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][7]=0;
else
qbits[i][7]=1;
qbits[i][10]=1-qbits[i][7];
}
if(qbits[i][11]+qbits[i][16]+qbits[i][17]==3){
rand=Math.random();
if(rand<=1.0/3){
qbits[i][11]=1;
qbits[i][16]=0;
qbits[i][17]=0;
}
else{
if(rand>2.0/3){
qbits[i][11]=0;
qbits[i][16]=0;
qbits[i][17]=1;
}
else{
qbits[i][11]=0;
qbits[i][16]=1;
qbits[i][17]=0;
}
}
}
else{
if(qbits[i][11]+qbits[i][16]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][11]=0;
else
qbits[i][11]=1;
qbits[i][16]=1-qbits[i][11];
}
if(qbits[i][11]+qbits[i][17]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][11]=0;
else
qbits[i][11]=1;
qbits[i][17]=1-qbits[i][11];
}
if(qbits[i][16]+qbits[i][17]==2){
rand=Math.random();
if(rand<=0.5)
qbits[i][16]=0;
else
qbits[i][16]=1;
qbits[i][17]=1-qbits[i][16];
}
}
}
}
//獲得一維陣列arr[]中所有元素的最小值,返回最小值及其索引位置
public int min(int[] arr){
int m=arr[0];
for (i=1; i< arr.length; i++){
if (arr[i]<m){
m=arr[i];
index=i;
}
}
return m;
}
public void Run(){
int iGenerations=0;
Initial();
QBitChange(QBits);
QBitDeterminate(qbitCode);
//獲得各個個體的適應值
for(i=0;i<qbitCode.length;i++){
psf=new PSystem_FitnessFunction(qbitCode[i]);
fitness[i]=psf.fitnessValue;
}
BestFitness=min(fitness);
con_fitness=BestFitness;
for(i=0;i<18;i++){
con_individual[i]=qbitCode[index][i];
}
while(iGenerations<(Max_Generations-1)&&BestFitness>0){
iGenerations=iGenerations+1;
for (j=0; j<30;j++){
aQBit[0]=QBits[2*j];
aQBit[1]=QBits[2*j+1];
//量子更新
update=new Quantum_Update(con_individual,qbitCode[j],aQBit,con_fitness,fitness[j]);
QBits[2*j]=update.newQBit[0];
QBits[2*j+1]=update.newQBit[1];
}
QBitChange(QBits);
QBitDeterminate(qbitCode);
for(i=0;i<qbitCode.length;i++){
//fileLength=fil.length();
psf=new PSystem_FitnessFunction(qbitCode[i]);
fitness[i]=psf.fitnessValue;
}
BestFitness=min(fitness);
if(BestFitness<=con_fitness){
con_fitness=fitness[index];
for(i=0;i<18;i++){
con_individual[i]=qbitCode[index][i];
}
}
}
//獲取最優規則集
BestRule=psi.getRule(con_individual);
currentGenerations=iGenerations;
totalGenerations+=currentGenerations;
}
public static void main(String args[]){
Main_GlobalPSystemEvolver evo=new Main_GlobalPSystemEvolver();
Date d1 = new Date();
System.out.println(d1.toString());
PrintStream outputFile = null;
try {
outputFile = new PrintStream(new FileOutputStream(
"D:\\java\\workspace\\SquareOfFour\\Results.txt", true));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
for(int r=0;r<maxRun;r++){
evo.Run();
if (evo.BestFitness==0)
SUCCESS++;
else
FAIL++;
outputFile.println("===================================");
outputFile.println("BEGIN RUN:\t"+(r+1)+"\nGenerations="+evo.currentGenerations+"\tBestFitness="+
evo.BestFitness+"\nBestRule:\n"+evo.BestRule);
}
Date d2 = new Date();
int seconds = (int) ((d2.getTime() - d1.getTime()) / 1000);
outputFile.println("\nTotalGenerations:"+totalGenerations+"\nSuccess:"+SUCCESS+"\nFail:"+
FAIL+"\nDuration: " + (seconds / 60) + " minutes "+ (seconds % 60) + " seconds \n");
outputFile.close();
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70007877/viewspace-2795296/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 量子計算新進展,騰訊量子實驗室設計新演算法進行量子近似最佳化演算法
- 量子圖形加密演算法的MATLAB程式碼實現加密演算法Matlab
- IBM推進量子計算機商業化,預計年底對公眾開放20量子位處理器IBM計算機
- 簡單的量子演算法(二):Simon's Algorithm演算法Go
- 演算法視覺化:把難懂的程式碼畫進梵高的星空演算法視覺化
- 程式猿的進化史
- 用LEFT JOIN優化標量子查詢優化
- 量子機器學習為傳統的AI演算法注入活力機器學習AI演算法
- 程式設計師的進化程式設計師
- 標量子查詢優化(用group by 代替distinct)優化
- 基於量子隨機遊走的影像加密演算法隨機加密演算法
- 發力量子計算軟體、演算法和應用,阿里AQL聯合學界尋找「量子貓」演算法阿里
- 技術分享| anyRTC回聲消除演算法進化演算法
- Nature子刊,基於量子實驗資料進行機器學習,用於解決量子多體問題機器學習
- 兒童程式語言的進化史
- 程式設計方法的進化 (轉)程式設計
- 進化演算法、遺傳演算法與粒子群演算法之間的比較演算法
- 簡單的量子演算法(一):Hadamard 變換、Parity Problem演算法
- 科學家提出超越傳統機器學習的量子演算法機器學習演算法
- 【大爽python演算法】遞迴演算法進化之回溯演算法(backtracking)Python演算法遞迴
- 讀AI未來進行式筆記07量子計算AI筆記
- 人工智慧導論——智慧計算(進化演算法+群智慧優化)人工智慧演算法優化
- 使用 IoC 容器進行程式碼優化行程優化
- 非同步程式設計方案進化論非同步程式設計
- 程式猿在後IT時代的交流進化
- [C++] 化學方程式的格式化演算法C++演算法
- 新的量子演算法有望破解非線性方程 - Quanta Magazine演算法
- 美國商務部公佈四種抗量子的加密演算法加密演算法
- 如何防止量子計算暴力解密?中國啟動新型演算法研究解密演算法
- 差分進化演算法介紹及matlab實現演算法Matlab
- 學習筆記 -《量子計算與程式設計入門》- 量子計算機硬體基礎筆記程式設計計算機
- 行業看點|趙義博:量子金鑰雲是量子通訊產業化最關鍵的助推劑行業產業
- 工業界| IBM加速量子計算機商業化 20量子位年底將對公眾開放IBM計算機
- 量子科技概念大火,國內現狀如何?國盾量子撐起量子通訊,華為BAT均入局量子計算BAT
- 量子:基礎
- 量子機器學習 (QML)機器學習
- 程式設計師的迴歸式進化程式設計師
- 趣文:程式設計師的進化史程式設計師