Java遗传算法并行多机调度程序
程序有兩部分組成,分別是gen和DNA程序。其中gen用來生成50條原始鏈,作為DNA初始化數據。DNA程序在gen生成的50條鏈的基礎上完成交叉,變異直到找到最優答案。
d:/工業/hk/bestLength.csv
d:/工業/hk/aaa.csv
d:/工業/hk/規劃1.csv? 初始化數據,30個工件和每個工件的耗時
d:/工業/hk/組合.csv
d:/工業/hk/矩陣.csv
d:/工業/hk/遺傳.csv
這個程序中有6個本地路徑,其中d:/工業/hk/規劃1.csv是初始數據,其余保存的都是中間數據。
使用方法
1.在d:/工業/hk/規劃1.csv這個位置手工制作規劃1.csv文件,格式為序數,序數,工時。
2.調用gen程序,生成50條鏈,保存在矩陣.csv文件中
3.調用DNA程序
第一部分gen代碼
第二部分DNA代碼
第三部分 規劃1.csv文件
第一部分gen代碼
package tree1;import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.text.ParseException; import java.util.Random;public class gen {//用于實現遺傳算法,生成50條鏈//種群數量 50 交叉概率 0.75 變異概率0.05 最大迭代數200static int cityNum=30; //工件static int ant=10; //機器static int iter=1000 ;static int tiao=50;private static double alpha=0.0001; //信息素重要程度的參數 1private static double beta=14; //啟發式因子重要程度的參數 5private static double rho=0.5; //信息素蒸發系數 0.5static double bestLength=Integer.MAX_VALUE; //最佳長度static double[][] pheromone= new double[cityNum][cityNum]; //信息素矩陣static double[][] distance= new double[cityNum][cityNum]; //距離矩陣static double[][] pher= new double[cityNum][cityNum]; //信息素矩陣static double[][] bestTour =new double[cityNum+1][1]; //最佳路徑static double [][] tabu=new double[cityNum][1];static int [][] allowedCities=new int[cityNum][1];static double[][] delta = new double[cityNum][cityNum];; //信息素變化矩陣static int firstCity; //起始城市static int currentCity; //當前城市static int[] x= new int[cityNum]; static int[] y= new int[cityNum]; static int [][]ta=new int[ant][cityNum];// static int [][][]dgen=new int[tiao][cityNum][1];static int count1;static int flag;public static void maco(String filename) throws IOException, ParseException {//初始化距離矩陣//初始化信息素矩陣String strbuff; BufferedReader data = new BufferedReader(new InputStreamReader(new FileInputStream(filename))); for (int i = 0; i < cityNum; i++) { strbuff = data.readLine(); String[] strcol = strbuff.split(","); x[i] = Integer.valueOf(strcol[1]); y[i] = Integer.valueOf(strcol[2]); // System.out.println(x[i]+" "+ y[i]);} for (int i = 0; i < cityNum ; i++) { distance[i][i] = 0; //對角線為0for (int j = 0; j < cityNum; j++) { if(i!=j){distance[i][j] =y[j] ; }if(i==j){distance[i][j] =0 ; } }} for(int i=0;i<cityNum;i++) { for(int j=0;j<cityNum;j++){pheromone[i][j]=0.1; // System.out.println(distance[i][j]+" "+i+" "+j);}} solve();}public static void push(int td ,int [][] tad , int js) throws IOException, ParseException{int t=td;int [][]tta=tad;int t1=0;int tem1=0;int max1=0;for(int a=0 ;a<cityNum ;a++){ if(tta[js][a]!=0){max1++;}}// System.out.println(" *************** ");for(int a=0 ;a<max1 ;a++){// System.out.println( tta[js][a]+" "+a );tem1=tem1+tta[js][a]; }t1=t-tem1;// System.out.println(t+" "+max1+" "+tem1+" "+t1+" *t1 ");if(t1-tta[js][max1]==0){count1++;// System.out.println( count1 +" 和 " ); tta[js][max1]=selectNextCity( count1 );//System.out.println(tta[max1]+" **** "+ count1 ); }}public static void solve() throws IOException, ParseException{for(int gen=0 ;gen<iter ;gen++){count1=ant-1;// System.out.println(" 迭代開始 "+count1);ta=new int[ant][cityNum];tabu=new double[cityNum][1];for (int i = 0; i < cityNum; i++) {allowedCities[i][0]=0; //允許搜索城市列表}for (int i = 0; i < cityNum; i++) {for (int j = 0; j < cityNum; j++) { delta[i][j] = 0.0; //信息素矩陣列表 都是0}}ta[0][0]=init( );for(int a=1 ;a<ant ;a++){ta[a][0]=selectNextCity( a ); }/******************************/ //用于初始化for(int t=0 ;t<100 ;t++) {int pan =0;for(int c=0 ;c<ant ;c++ ){pan=0;push(t ,ta ,c );for(int b=0 ;b<cityNum ;b++){ if(allowedCities[b][0]==1){pan++;}}if(pan==cityNum){break;}}if(pan==cityNum){break;}}int max=0;int [][]rc=new int[ant][1];double ave=0.0;for(int a=0 ;a<ant;a++) {for(int b=0 ;b<cityNum ;b++){ rc[a][0]=rc[a][0]+ta[a][b];ave=ave+ta[a][b];}if(max<rc[a][0]){max=rc[a][0];}// System.out.println(a+" rc[a][0] " +max );}ave=1000*ave/cityNum;// System.out.println(max+" *** "+gen);double disx=0.0;disx=max;if (disx < bestLength) {for (int n = 0; n < cityNum; n++) {for (int m = 0; m < cityNum; m++) {if(tabu[m][0]==n){ bestTour[n][0]=m;}}}bestTour[cityNum][0]=bestTour[0][0];bestLength=disx;flag=gen;}for (int j = 0; j < cityNum-1; j++) {delta[j ][j+1] = (double) (1./disx);delta[j+1][j ] = (double) (1./disx); // delta[j ][j+1] = (double) (1./ave);// delta[j+1][j ] = (double) (1./ave); } for(int i=0;i<cityNum;i++){for(int j=0;j<cityNum;j++){ pher[i][j] += delta[i][j];} }updatePheromone();//printOptimal();}}public static int init( ) {//允許城市列表//選出下一個城市//并將這個城市加入禁忌表//選出的城市被作為current city 返回Random random2 = new Random(System.currentTimeMillis());int s1 = random2.nextInt();Random random1 = new Random( );int s = random1.nextInt();Random random = new Random( (s+s1) );firstCity = random.nextInt(cityNum);//firstCity = 4;// System.out.println( firstCity );for (int i = 0; i < cityNum; i++) {if (i == firstCity) {allowedCities[i][0]=1; //去掉等于i的這項break;}} for (int i = 0; i < cityNum; i++) {if (i == firstCity) {tabu[i][0]=0; //去掉等于i的這項break;}} currentCity = firstCity;// System.out.println( "currentCity "+ currentCity +" "+y[currentCity] );return x[currentCity];}public static int selectNextCity( int time ) throws IOException, ParseException {double [] p = new double[cityNum];double sum = 0.0;//計算分母部分//System.out.println( currentCity +" currentCity " );for (int i = 0; i < cityNum; i++) {if (allowedCities[i][0] != 1 ) {sum += Math.pow(pheromone[currentCity][i], alpha)*Math.pow(1.0/distance[currentCity][i], beta);/*System.out.println( i + " "+ " sum: " + sum +" "+Math.pow(pheromone[currentCity][i], alpha) +" a "+ Math.pow(1.0/distance[currentCity][i], beta)+" b " +distance[currentCity][i] +" d "+pheromone[currentCity][i]+" p "+alpha+" "+beta+" " +currentCity+ " ");*/}} for (int i = 0; i < cityNum; i++) {boolean flag = false;if (allowedCities[i][0] != 1 ) {p[i] = (Math.pow(pheromone[currentCity][i], alpha)*Math.pow(1.0/distance[currentCity][i], beta) ) /sum;flag = true;// System.out.println(p[i]+" * "+i);}if (flag == false) {p[i] = 0.0;}} Random random3 = new Random(System.currentTimeMillis());int s3 = random3.nextInt();Random random4 = new Random( );int s4 = random4.nextInt();Random rand = new Random( (s3+s4) );double slectP = rand.nextDouble( );int selectCity = 0;double ff = 0.0;for (int i = 0; i < cityNum; i++) {ff += p[i];if (ff >= slectP) {selectCity = i;// System.out.println(slectP+" slectP " + ff+" "+i +" ");break;}}// System.out.println(selectCity+" selectCity " );for (int i = 0; i < cityNum; i++) {if (i== selectCity ) {allowedCities[i][0]=1;}} for (int i = 0; i < cityNum; i++) {if (i== selectCity ) {tabu[i][0]=time;// System.out.println( tabu[i][0]+" nant "+nant);}} //將當前城市改為選擇的城市 currentCity = selectCity;return x[currentCity];}private static void updatePheromone(){// System.out.println( " updatePheromone " );for(int i=0;i<cityNum;i++) {for(int j=0;j<cityNum;j++) {pheromone[i][j]=pheromone[i][j]*(1-rho);}}for(int i=0;i<cityNum;i++){for(int j=0;j<cityNum;j++){pheromone[i][j] += pher[i][j];} }}private static void printOptimal() throws IOException{FileWriter fileWriter2=new FileWriter("d:/工業/hk/bestLength.csv"); FileWriter fileWriter1=new FileWriter("d:/工業/hk/aaa.csv"); // System.out.println("The optimal length is: " + bestLength);fileWriter2.write( bestLength +"\r\n ");fileWriter2.flush();for (int i = 0; i < cityNum ; i++) {// System.out.println(bestTour[i][0]+" *** ");fileWriter1.write( (int)bestTour[i][0] +"\r\n ");fileWriter1.flush();}fileWriter1.write( (int)bestTour[0][0] +"\r\n ");fileWriter1.flush();}private static int[][] d3() throws IOException, ParseException{double b=100000;int count=-1;// while(b>=48 && count < 100 ) while(b> 52 ) {// System.out.println( count+ " count**** "+ tiao+" "+b);maco("d:/工業/hk/規劃1.csv");// maco("d:/工業/hk/zz.csv");printOptimal();String aa= read.conv.read("d:/工業/hk/bestLength.csv" );aa=aa.replaceAll(",","");b= Double.parseDouble(aa.trim());// System.out.println( " count "+ b);}return ta;}public static void shellSort(double[] data) {int j = 0;double temp = 0;//每次將步長縮短為原來的一半for (int increment = data.length / 2; increment > 0; increment /= 2){for (int i = increment; i < data.length; i++) {temp = data[i];for (j = i; j >= increment; j -= increment) {if(temp > data[j - increment])//如想從小到大排只需修改這里// if(temp < data[j - increment])//如想從小到大排只需修改這里{ data[j] = data[j - increment];}else{break;}} data[j] = temp;}}}private static int[][] cd() throws IOException, ParseException{//產生用于 交叉 變異的數組int count=0;int [][]tem=new int[ant][cityNum];int [][]dgen=new int[cityNum][tiao];for(int a=0 ;a<tiao ;a++){tem=d3();// static int [][]ta=new int[ant][cityNum];int [] dant=new int[cityNum];for(int d=1 ;d<cityNum+1 ;d++){for (int b = 0; b < ant; b++) {for (int c = 0; c < 5; c++) {//System.out.println(tem[b][c]+" "+b+" "+c);if(tem[b][c]==d){//System.out.println(tem[b][c]+" "+b+" " +d+" ");dant[d-1]=b;}}} }/*****************/for(int d=0 ;d<cityNum ;d++){System.out.println(dant[d]+" "+d+" *"+a); dgen[d][a]=dant[d];}}/******************************************/System.out.println( "*********************"); for(int a=0 ;a<tiao ;a++){ for(int d=0 ;d<cityNum ;d++){ System.out.println(dgen[d][a]+" "+a+" "+d); //機器編號 列 行}}return dgen; }public static void main(String[] args) throws IOException, ParseException {FileWriter fileWriter1=new FileWriter("d:/工業/hk/組合.csv"); FileWriter fileWriter2=new FileWriter("d:/工業/hk/矩陣.csv"); int [][]dgen=cd();System.out.println( "*********************"); for(int a=0 ;a<tiao ;a++){ for(int d=0 ;d<cityNum ;d++){ System.out.println(dgen[d][a]+" "+a+" "+d); //機器編號 列 行 fileWriter2.write( dgen[d][a] +"\r\n ");fileWriter2.flush();}} int bei=2;int [] s1=new int[tiao*bei];int [] s2=new int[tiao*bei];for(int a=0 ; a< tiao*bei ;a++){Random rand1 =new Random();int ti1=rand1.nextInt(tiao);Random rand2 =new Random();int ti2=rand2.nextInt(tiao);System.out.println(ti1+" "+ti2);s1[a]=ti1;s2[a]=ti2;}System.out.println("****************");for(int a=0 ; a< tiao*bei ;a++){for(int b=a+1 ; b< tiao*bei ;b++){if(s1[a]==s1[b]&&s2[a]==s2[b]){s1[a]=0;s2[a]=0;System.out.println(a+" ** 相同 "+b);} }for(int b=0 ; b< cityNum*bei ;b++){if(s1[a]==s2[b]&&s2[a]==s1[b]){s1[a]=0;s2[a]=0;System.out.println(a+" ** 反向 "+b);} }}//s1 s2 里面的就是沒有重復 沒有相同 沒有反向相同 的組合int count=0;for(int a=0 ; a< tiao*bei ;a++){if( (s1[a]!=0|| s2[a]!=0) && count<50){System.out.println(s1[a]+" "+s2[a]+" " +count );fileWriter1.write( s1[a]+" , "+s2[a] +"\r\n ");fileWriter1.flush();count++;}}}}第二部分
package tree1;import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.text.ParseException; import java.util.Random; import java.util.regex.Pattern;public class DNA {//需要用gen 得到初始數組//遺傳算法用于多機并行調度/** 400 11 12 18 22 1 23 25 16 23 2 2 13 27 6 11 18 3 1 8 18 28 2 4 17 15 4 0 9 10 16 3 12 10 14 5 5 15 17 7 26 6 6 19 29 27 13 7 20 22 11 26 8 3 4 6 7 24 4 5 9 13 79 14 21 26 8 17 15 */static int tiao=50;static int cityNum=30;static int [][] dgen2=new int[cityNum][tiao];public static void shellSort(int[] data) {int j = 0;int temp = 0;//每次將步長縮短為原來的一半for (int increment = data.length / 2; increment > 0; increment /= 2){for (int i = increment; i < data.length; i++) {temp = data[i];for (j = i; j >= increment; j -= increment) {// if(temp > data[j - increment])//如想從小到大排只需修改這里if(temp < data[j - increment])//如想從小到大排只需修改這里{ data[j] = data[j - increment];}else{break;}} data[j] = temp;}}}private static int cross( int [][]xgen ) throws IOException, ParseException{int ant=10;int changerate=3; //變異概率 這個是 4% double droprate=0.25; //按照時間 淘汰的概率 這個就是 小數int bei=100; //0.85 bei>3 要隨著droprate 的增加變大 因為 去掉 90%以后要用10 個隨機出50個這個重復概率加大int [][] dgen=xgen;int [] mina=new int[tiao];for(int a=0 ;a<tiao ;a++){ int [] tem= new int[cityNum];for(int d=0 ;d<cityNum ;d++){ // System.out.println(dgen [d][a]+" "+a+" "+d+" dgen2 后 "); tem[d]=dgen [d][a];}int tem1=value( tem);mina[a]=tem1; //計算時間數組}shellSort( mina ); //將時間按大小排序 進行 淘汰/****************************************/int [][] dgenorder=new int[cityNum][tiao];int count=0;for(int b=0 ;b<tiao ;b++){int tem1=0;for(int a=0 ;a<tiao ;a++){ int [] tem=new int[cityNum];for(int d=0 ;d<cityNum ;d++){ tem[d]=dgen [d][a];} tem1=value( tem); //System.out.println(tem1+" "+mina[b]+" "+count+ " b "+b);if(tem1==mina[b]){// System.out.println(tem1+" "+mina[b]+" "+count+ " ****** b "+b);for(int d=0 ;d<cityNum ;d++){ dgenorder[d][count]=dgen [d][a];}count++;break;}}}//System.out.println("**************** "+ (int)(tiao*(1-droprate))*bei );int [] s1=new int[(int)(tiao*(1-droprate))*bei];int [] s2=new int[(int)(tiao*(1-droprate))*bei];for(int a=0 ; a< (int)(tiao*(1-droprate))*bei ;a++){Random rand1 =new Random();int ti1=rand1.nextInt((int)(tiao*(1-droprate)));Random rand2 =new Random();int ti2=rand2.nextInt((int)(tiao*(1-droprate)));// System.out.println(ti1+" "+ti2+" "+ (int)(tiao*(1-droprate))*bei +" "+a );s1[a]=ti1;s2[a]=ti2;}for(int a=0 ; a< (int)(tiao*(1-droprate))*bei ;a++){for(int b=a+1 ; b< (int)(tiao*(1-droprate))*bei ;b++){if(s1[a]==s1[b]&&s2[a]==s2[b]){s1[a]=0;s2[a]=0;// System.out.println(a+" ** 相同 "+b);}}//System.out.println("****************");for(int b=0 ; b< (int)(tiao*(1-droprate))*bei ;b++){if(s1[a]==s2[b]&&s2[a]==s1[b]){s1[a]=0;s2[a]=0;// System.out.println(a+" ** 反向 "+b);}}}//s1 s2 里面的就是沒有重復 沒有相同 沒有反向相同 的組合int count1=0;for(int a=0 ; a< (int)(tiao*(1-droprate))*bei ;a++){if( (s1[a]!=0|| s2[a]!=0) && count1< tiao ){// System.out.println(s1[a]+" "+s2[a]+" *** " +count1 );count1++;}}/*************************************///int [][] dgen2=new int[cityNum][tiao];for(int n=0 ;n<tiao;n++)//for(int n=0 ;n<1 ;n++){//s1[n]=Integer.parseInt( as1[2*n] );//s2[n]=Integer.parseInt( as1[2*n+1] );//System.out.println(s1[n]+" "+s2[n]+" " +n);int [] t1=new int[cityNum];int [] t2=new int[cityNum];int [] t3=new int[cityNum];int [] t4=new int[cityNum];for(int a=0 ;a<tiao ;a++){ for(int d=0 ;d<cityNum ;d++){ //System.out.println(dgen[d][a]+" "+a+" "+d); //機器編號 列 行 if(a==s1[n]){t1[d]=dgenorder[d][a];}if(a==s2[n]){t2[d]=dgenorder[d][a];}}}Random rand1 =new Random();int ti1=rand1.nextInt(cityNum);for(int d=0 ;d<cityNum ;d++){t3[d]=t1[d];t4[d]=t2[d];}//中繼數組for(int d=0 ;d<cityNum ;d++){if(d>ti1){t1[d]=t4[d];}}for(int d=0 ;d<cityNum ;d++){if(d>ti1){t2[d]=t3[d];}}//t1 t2 完成交叉的數組/**********************************************/for(int d=0 ;d<cityNum ;d++){//System.out.println(n+" "+ n*2+" "+ (n*2+1) );dgen2[d][n*2]=t1[d];dgen2[d][n*2+1]=t2[d];}if(n*2+1 ==tiao-1 ){break;}//將交叉后的結果寫入 dgen2}//s1 s2里面就是排列組合/************************************************/for(int a=0 ;a<tiao ;a++){ for(int d=0 ;d<cityNum ;d++){ // System.out.println(dgen2[d][a]+" "+a+" "+d+" dgen2 前 "); }}for(int a=0 ;a<tiao ;a++){ for(int d=0 ;d<cityNum ;d++){ // System.out.println(dgen2[d][a]+" "+a+" "+d+" dgen2 "); Random rand1 =new Random();int ti1=rand1.nextInt(99);if(ti1<changerate) //按照指定概率進行變異{Random rand2 =new Random();int ti2=rand2.nextInt(ant);//System.out.println(dgen2[d][a]+" "+a+" "+d+" "+ ti2); dgen2[d][a]=ti2; }}}/*********************************/for(int a=0 ;a<tiao ;a++){ for(int d=0 ;d<cityNum ;d++){ // System.out.println(dgen2[d][a]+" "+a+" "+d+" dgen2 后 "); }}//dgen2[d][a] 里面存放的就是經過 交叉 變異 后數組/****************************************/int min=100000;for(int a=0 ;a<tiao ;a++){ int [] tem= new int[cityNum];for(int d=0 ;d<cityNum ;d++){ // System.out.println(dgen2[d][a]+" "+a+" "+d+" dgen2 后 "); tem[d]=dgen2[d][a];}int tem1=value( tem);if(tem1<min){min=tem1;}}//用于計算最小值// System.out.println(min+ " max " );return min;}private static int value( int [] test) throws IOException, ParseException{int cityNum=30;int ant=10;int[] x= new int[cityNum]; int[] y= new int[cityNum]; int [] ar=test;String strbuff; BufferedReader data = new BufferedReader(new InputStreamReader(new FileInputStream("d:/工業/hk/規劃1.csv"))); for (int i = 0; i < cityNum; i++) { strbuff = data.readLine(); String[] strcol = strbuff.split(","); x[i] = Integer.valueOf(strcol[1]); y[i] = Integer.valueOf(strcol[2]); // System.out.println(x[i]+" "+ y[i]);}int max=0;int min=100000;// System.out.println( y[15]+" * y[15] * ");for(int c=0 ;c<ant ;c++){int tem=0;for(int b=0 ; b<cityNum ;b++){ if(ar[b]==c){// System.out.println( y[b]+" "+c+" * "+b);tem=tem+y[b];}}// System.out.println(tem+" tem ");if(tem>max){max=tem;// System.out.println(max+" max ");}if(tem<min){min=tem;// System.out.println(min+" min ");}}// System.out.println(max+" max "+ min +" min ");return max;}public static void main(String[] args) throws IOException, ParseException {int ww=100;int cityNum=30;// int tiao=50;FileWriter fileWriter1=new FileWriter("d:/工業/hk/遺傳.csv"); int [][] dgen=new int[cityNum][tiao];String aw=read.conv.read("d:/工業/hk/矩陣.csv");String[] as =Pattern.compile(",").split(aw); for(int n=0 ;n<as.length;n++){//System.out.println(as[n]+" "+n);dgen[n-cityNum*(n/cityNum)][n/cityNum]=Integer.parseInt( as[n].trim() );}int count=0;// while (ww >41 && count<200)int find=40;while (ww >find ){long sysDate1 = System.currentTimeMillis();ww= cross(dgen);long sysDate2 = System.currentTimeMillis();for(int a=0 ;a<tiao ;a++){ for(int d=0 ;d<cityNum ;d++){ dgen[d][a]= dgen2[d][a] ;}}count++;System.out.println(ww+ " max "+count );fileWriter1.write( ww+","+ (sysDate2-sysDate1 ) +"\r\n ");fileWriter1.flush();}//查看最優解for(int a=0 ;a<tiao ;a++){ int [] tem= new int[cityNum];for(int d=0 ;d<cityNum ;d++){ // System.out.println(dgen2[d][a]+" "+a+" "+d+" dgen2 后 "); //dgen2[d][a] 30個工件對應的機器編號tem[d]=dgen2[d][a];}int tem1=value( tem); //最優值工時if(tem1==find){System.out.println(tem1+" tem1 "); for(int d=0 ;d<cityNum ;d++){ System.out.println(dgen2[d][a]+" "+a+" "+d ); //最優解}break;}}}}程序中出現的read.conv.read( string );
public static String read(String a) throws IOException{String as;{ String tops="";BufferedReader ins=new BufferedReader(new FileReader(a));String ss;List<String> nns=new LinkedList<String>();while((ss=ins.readLine())!=null)nns.add(ss);String kps = nns.toString();kps = kps.substring(1,kps.length()-1);//System.out.println(kp+"*-*");tops=kps;// System.out.println(top+"*-*");ins.close();as=tops;}as=as.trim();return as;}第三部分
文中規劃1.csv如下,用10臺機器加工30個工件
| 1 | 1 | 3 |
| 2 | 2 | 2 |
| 3 | 3 | 6 |
| 4 | 4 | 4 |
| 5 | 5 | 5 |
| 6 | 6 | 7 |
| 7 | 7 | 9 |
| 8 | 8 | 13 |
| 9 | 9 | 4 |
| 10 | 10 | 12 |
| 11 | 11 | 10 |
| 12 | 12 | 18 |
| 13 | 13 | 22 |
| 14 | 14 | 11 |
| 15 | 15 | 8 |
| 16 | 16 | 26 |
| 17 | 17 | 14 |
| 18 | 18 | 6 |
| 19 | 19 | 17 |
| 20 | 20 | 27 |
| 21 | 21 | 11 |
| 22 | 22 | 17 |
| 23 | 23 | 26 |
| 24 | 24 | 16 |
| 25 | 25 | 7 |
| 26 | 26 | 23 |
| 27 | 27 | 15 |
| 28 | 28 | 18 |
| 29 | 29 | 15 |
| 30 | 30 | 13 |
總結
以上是生活随笔為你收集整理的Java遗传算法并行多机调度程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 参数迁移表达的第三种形态相互作用
- 下一篇: 对神经网络分类行为的认识二则