基于遺傳算法的蟻群優(yōu)化算法 (2010-10-24 15:35:32)
標(biāo)簽: 遺傳算法 蟻群算法 qos web服務(wù)選擇 混合智能 雜談 分類(lèi): 技術(shù)
遺傳算法有一個(gè)最大的特點(diǎn)就是能狗進(jìn)行快速的全局搜索,所以遺傳算法收斂速度快,進(jìn)化時(shí)間段,但是遺傳算法沒(méi)有正反饋和負(fù)反饋機(jī)制,以至于遺傳算法在進(jìn)行金華市有很長(zhǎng)時(shí)間都只在做無(wú)用的進(jìn)化和驗(yàn)算。蟻群算法具有正反饋機(jī)制,能夠機(jī)制的將進(jìn)化的信息反饋到下一輪的進(jìn)化中,但是缺點(diǎn)就是收斂速度慢,而且全局搜索能力較差,如果將這兩種進(jìn)化算法結(jié)合寄來(lái)既能夠使用遺傳算法的全局搜索能力又能夠使用蟻群算法的正反饋機(jī)制,是否可惜呢?
答案是肯定的。
一般情況下,遺傳和蟻群的混合分為兩種情況,一種是以遺傳為主題的算法,另一種是以蟻群算法為主體的算法,博主正在做Web服務(wù)選擇的問(wèn)題,所以想到了使用這種混合的算法去解決打過(guò)摸得Web服務(wù)選擇問(wèn)題,因?yàn)橄伻核惴ㄖ械腶lpha、beta和rou直接影響到轉(zhuǎn)移galveston和下一步贏得進(jìn)化情況,所以這三個(gè)參數(shù)的選取顯得至關(guān)重要,在傳統(tǒng)的蟻群算法中,這三個(gè)參數(shù)的選區(qū)是依照經(jīng)驗(yàn)的,沒(méi)有什么精確地方法去確定這三個(gè)值,博主使用遺傳算法去優(yōu)化者三個(gè)參數(shù),取得了Web服務(wù)選擇問(wèn)題中的優(yōu)良效果,下面是博主的算法源程序和效果對(duì)比圖:
package gaaca;
import java.text.DecimalFormat;
import java.util.Random;
public class GAACASelect {
public static int var_num=3;//帶求解的變量個(gè)數(shù)
public static double
alpha_Max=2.0;//蟻群算法中啟發(fā)因子alpha的最大值,值區(qū)間(1.0,4.0]
public static double
beta_Max=4.0;//蟻群算法中期望因子beta的最大值,值區(qū)間(1.0,4.0]
public static double
rou_Max=0.01;//蟻群算法中揮發(fā)rou的最大值,值區(qū)間(0.0,1.0)
public static int popution=10;//遺傳算法中,種群大小
public static String []pop=new
String[popution];//存儲(chǔ)染色體的編碼
public static double []var_value=new
double[3];//在解碼時(shí)存儲(chǔ)變量的值
public static double [][]initpop=new
double[var_num][popution];//存儲(chǔ)種群的初始化值
public static double [][]result=new
double[var_num][popution];//種群代表的結(jié)果
public static double []fitness=new
double[popution];//用于存儲(chǔ)染色體的適應(yīng)度值
public static double []best_var=new
double[3];//存儲(chǔ)最優(yōu)組合
public static double pc=0.35;//交叉概率
public static double pm=0.08;//變異概率
public static Random random=new
Random();//程序中所有隨機(jī)數(shù)都由它產(chǎn)生
public
static double[]p=new
double[popution];//輪盤(pán)賭方法個(gè)體適應(yīng)度概率(按比例的適應(yīng)度分配)選擇概率
public
static double[]q=new double[popution];//q[i]是前n項(xiàng)p之和(累積概率)
public static int[][]class1={//服務(wù)類(lèi)1的決策矩陣
{12 ,16 ,12 ,15 ,15 ,11 ,17 ,16 ,20 ,7 },
{6 ,21 ,3 ,16 ,22 ,9 ,9 ,20 ,22 ,4 },
{6 ,9 ,3 ,5 ,15 ,15 ,18 ,11 ,15 ,5 },
{6 ,21 ,16 ,4 ,16 ,19 ,11 ,17 ,19 ,5 },
{8 ,11 ,18 ,18 ,21 ,4 ,15 ,6 ,22 ,6 }
};
public static int[][]class2={//服務(wù)類(lèi)2的決策矩陣
{9 ,9 ,17 ,12 ,21 ,12 ,22 ,9 ,21 ,9 ,7 ,20 ,3 ,14 ,6 ,5 ,21 ,14 ,16 ,19 },
{3 ,21 ,9 ,4 ,3 ,8 ,5 ,6 ,4 ,7 ,8 ,11 ,18 ,8 ,15 ,19 ,17 ,4 ,3 ,7 },
{17 ,6 ,12 ,6 ,19 ,20 ,18 ,19 ,19 ,11 ,4 ,16 ,22 ,3 ,19 ,18 ,6 ,3 ,17 ,11 },
{8 ,15 ,12 ,7 ,5 ,7 ,17 ,16 ,19 ,5 ,18 ,16 ,4 ,8 ,13 ,8 ,17 ,3 ,14 ,21 },
{9 ,21 ,17 ,19 ,12 ,3 ,12 ,11 ,3 ,9 ,20 ,19 ,5 ,6 ,20 ,6 ,8 ,22 ,14 ,6 }
};
public
static int[][] class3={//服務(wù)類(lèi)3的決策矩陣
{8 ,19 ,4 ,3 ,19 ,22 ,11 ,9 ,18 ,11 ,14 ,18 ,14 ,21 ,15 ,13 ,14 ,18 ,19 ,9 ,21 ,16 ,16 ,5 ,21 ,4 ,12 ,22 ,12 ,18 },
{22 ,11 ,11 ,16 ,7 ,13 ,21 ,15 ,16 ,5 ,13 ,7 ,15 ,14 ,9 ,12 ,12 ,7 ,6 ,17 ,7 ,22 ,21 ,6 ,3 ,16 ,13 ,7 ,5 ,5 },
{6 ,6 ,7 ,5 ,10 ,19 ,4 ,21 ,6 ,22 ,22 ,20 ,22 ,18 ,4 ,14 ,7 ,22 ,14 ,22 ,17 ,17 ,6 ,4 ,9 ,4 ,17 ,17 ,3 ,10 },
{3 ,7 ,5 ,4 ,8 ,6 ,17 ,7 ,4 ,13 ,14 ,3 ,9 ,15 ,7 ,16 ,8 ,14 ,16 ,20 ,14 ,5 ,21 ,3 ,18 ,14 ,17 ,22 ,13 ,7 },
{16 ,11 ,6 ,18 ,13 ,15 ,8 ,9 ,4 ,14 ,13 ,16 ,4 ,19 ,4 ,22 ,13 ,12 ,15 ,10 ,20 ,13 ,20 ,21 ,12 ,18 ,10 ,22 ,21 ,8 }
};
public
static int[][]class4={//服務(wù)類(lèi)4的決策矩陣
{14 ,20 ,20 ,18 ,17 ,14 ,8 ,3 ,15 ,12 ,20 ,5 ,18 ,10 ,7 ,3 ,22 ,7 ,12 ,22 ,11 ,15 ,22 ,4 ,7 ,12 ,7 ,7 ,18 ,14 ,19 ,17 ,14 ,10 ,22 ,9 ,10 ,22 ,3 ,16 },
{15 ,7 ,6 ,18 ,14 ,20 ,13 ,16 ,6 ,7 ,3 ,11 ,6 ,18 ,17 ,18 ,3 ,8 ,5 ,4 ,19 ,5 ,22 ,13 ,3 ,16 ,10 ,21 ,15 ,17 ,12 ,4 ,15 ,4 ,9 ,5 ,7 ,13 ,14 ,8 },
{20 ,21 ,20 ,22 ,22 ,9 ,9 ,13 ,13 ,14 ,3 ,21 ,20 ,14 ,9 ,15 ,11 ,3 ,3 ,5 ,4 ,22 ,3 ,11 ,17 ,22 ,3 ,17 ,20 ,6 ,5 ,5 ,19 ,17 ,9 ,19 ,13 ,17 ,3 ,9 },
{11 ,4 ,21 ,21 ,8 ,12 ,5 ,4 ,18 ,18 ,20 ,17 ,14 ,18 ,15 ,17 ,11 ,13 ,6 ,22 ,12 ,11 ,7 ,6 ,8 ,3 ,9 ,7 ,10 ,14 ,21 ,5 ,7 ,13 ,11 ,21 ,8 ,4 ,22 ,14 },
{14 ,20 ,11 ,13 ,4 ,4 ,20 ,5 ,18 ,21 ,4 ,17 ,4 ,11 ,15 ,22 ,11 ,20 ,16 ,10 ,18 ,7 ,11 ,11 ,10 ,21 ,13 ,12 ,22 ,22 ,3 ,17 ,5 ,19 ,3 ,19 ,6 ,17 ,7 ,21 }
};
public
static int antcount=3;//螞蟻數(shù)量
public
static double initpheromone=0.1;//初始信息素濃度素
public
static int
num[]={class1[0].length,class2[0].length,class3[0].length,class4[0].length};//用于簡(jiǎn)化記錄每個(gè)服務(wù)類(lèi)中原子服務(wù)的個(gè)數(shù)
public
static double [][]tao01=new
double[1][num[0]];//開(kāi)始結(jié)點(diǎn)與1#服務(wù)類(lèi)之間的信息素矩陣
public
static double [][]tao12=new
double[num[0]][num[1]];//1#服務(wù)類(lèi)與2#服務(wù)類(lèi)之間的信息素矩陣
public
static double [][]tao23=new
double[num[1]][num[2]];//2#服務(wù)類(lèi)與3#服務(wù)類(lèi)之間的信息素矩陣
public
static double [][]tao34=new
double[num[2]][num[3]];//3#服務(wù)類(lèi)與4#服務(wù)類(lèi)之間的信息素矩陣
public
static Ants []ants=new Ants[antcount];//螞蟻
//public
static double rou=0.001;//信息素?fù)]發(fā)因子
public
static double Q=0.1;//信息素強(qiáng)度
public
static double bestlength;//初始的最優(yōu)路徑長(zhǎng)度
public
static int []bestpath={0,0,0,0};//用于記錄最優(yōu)路徑
public
static int generation;//發(fā)現(xiàn)最優(yōu)解的迭代次數(shù)
public
static long time;//進(jìn)化耗時(shí)
public
static long endtime;
public
static DecimalFormat df=new
DecimalFormat("0.00000");//double型數(shù)據(jù)的精度控制
public static double[][]
initpopution(){//遺傳算法初始化種群,產(chǎn)生隨機(jī)的alph beta和rou
for(int
i=0;i<popution;i++){
initpop[0][i]=Double.parseDouble(df.format(Math.random()*alpha_Max));
initpop[1][i]=Double.parseDouble(df.format(Math.random()*beta_Max));
initpop[2][i]=Double.parseDouble(df.format(Math.random()*rou_Max));
}
return initpop;
}
public GAACASelect(double [][]initpop){
for(int
i=0;i<var_num;i++){
for(int
j=0;j<popution;j++){
result[i][j]=initpop[i][j];
}
}
}
public static void init() {//蟻群算法,參數(shù)初始化
// TODO Auto-generated method
stub
for(int
i=0;i<num[0];i++){
tao01[0][i]=initpheromone;
}
for(int
i=0;i<num[0];i++){
for(int
j=0;j<num[1];j++){
tao12[i][j]=initpheromone;
}
}
for(int
i=0;i<num[1];i++){
for(int
j=0;j<num[2];j++){
tao23[i][j]=initpheromone;
}
}
for(int
i=0;i<num[2];i++){
for(int
j=0;j<num[3];j++){
tao34[i][j]=initpheromone;
}
}
for(int
i=0;i<antcount;i++){
ants[i]=new
Ants();
for(int
j=0;j<5;j++){
ants[i].path[j]=0;
}
}
bestlength=Integer.MAX_VALUE;
generation=0;
time=0;
}
public static void fitness(int evolutionnum)
{//蟻群主體程序運(yùn)行
System.out.println("第"+evolutionnum+"代--->");
for(int
i=0;i<popution;i++){
double
localbestpathlength=100000.0;
for(int
j=0;j<antcount;j++){
//每一只螞蟻的移動(dòng)
ants[j].path[0]=0;
ants[j].path[1]=ants[j].selectNextService(1,tao01,0,result[0][i],result[1][i]);//從第1個(gè)服務(wù)類(lèi)中選擇選擇
ants[j].path[2]=ants[j].selectNextService(2,tao12,ants[j].path[1],result[0][i],result[1][i]);//從第2個(gè)服務(wù)類(lèi)中選擇選擇
ants[j].path[3]=ants[j].selectNextService(3,tao23,ants[j].path[2],result[0][i],result[1][i]);//從第3個(gè)服務(wù)類(lèi)中選擇選擇
ants[j].path[4]=ants[j].selectNextService(4,tao34,ants[j].path[3],result[0][i],result[1][i]);//從第4個(gè)服務(wù)類(lèi)中選擇選擇
//計(jì)算該螞蟻?zhàn)哌^(guò)的路徑長(zhǎng)度
//System.out.println(ants[j].path[1]+"\t"+ants[j].path[2]+"\t"+ants[j].path[3]+"\t"+ants[j].path[4]+"\t");
double
pathlength=ants[j].caculatePathlength(ants[j].path);
//System.out.println(pathlength);
//和當(dāng)前最優(yōu)值比較
if(pathlength<localbestpathlength){
localbestpathlength=pathlength;
}
if(pathlength<bestlength){
bestlength=pathlength;//用于記錄最短路徑長(zhǎng)度
best_var[0]=result[0][i];//保存最優(yōu)的alpha、beta、rou組合
best_var[1]=result[1][i];
best_var[2]=result[2][i];
if(evolutionnum>generation){
generation=evolutionnum;
}
//System.out.println("第"+i+"代第"
+ j + "只螞蟻發(fā)現(xiàn)最優(yōu)解:"+bestlength);
for(int
k=0;k<bestpath.length;k++){
bestpath[k]=ants[j].path[k+1];//用于記錄最優(yōu)路徑
}
endtime=System.currentTimeMillis();
}
//updatepheromone(j);
}
fitness[i]=localbestpathlength;
//System.out.println(fitness[i]);
updatepheromone(result[2][i]);
}
}
public static void updatepheromone(double rou)
{//跟新蟻群算法中的路徑上的信息素濃度
for(int
i=0;i<num[0];i++){//原有信息素的剩余部分
tao01[0][i]*=(1-rou);
}
for(int
i=0;i<num[0];i++){
for(int
j=0;j<num[1];j++){
tao12[i][j]*=(1-rou);
}
}
for(int
i=0;i<num[1];i++){
for(int
j=0;j<num[2];j++){
tao23[i][j]*=(1-rou);
}
}
for(int
i=0;i<num[2];i++){
for(int
j=0;j<num[3];j++){
tao34[i][j]*=(1-rou);
}
}
for(int
k=0;k<antcount;k++){
tao01[0][ants[k].path[1]]+=Q/ants[k].caculatePathlength(ants[k].path);//信息素增加
tao12[ants[k].path[1]][ants[k].path[2]]+=Q/ants[k].caculatePathlength(ants[k].path);
tao23[ants[k].path[2]][ants[k].path[3]]+=Q/ants[k].caculatePathlength(ants[k].path);
tao34[ants[k].path[3]][ants[k].path[4]]+=Q/ants[k].caculatePathlength(ants[k].path);
}
}
public static void printResult() {//打印程序結(jié)果
//System.out.print("開(kāi)始結(jié)點(diǎn)
--->");
for(int
i=0;i<bestpath.length;i++){
System.out.print(bestpath[i]+"
--->");
}
//System.out.println("結(jié)束結(jié)點(diǎn)");
//System.out.println("最優(yōu)解為:"+bestlength);
System.out.println(best_var[0]+"\t"+best_var[1]+"\t"+best_var[2]);
System.out.println(bestlength+"\t"+generation+"\t"+(endtime-time));
}
public static String[]
encode(){//十進(jìn)制轉(zhuǎn)化為二進(jìn)制,編碼過(guò)程
for(int
i=0;i<popution;i++){
String
result1="",result2="",result3="";
int
media_data1=(int)Math.floor((result[0][i]/alpha_Max)*((Math.pow(2,
20)-1)));
result1=Integer.toBinaryString(media_data1);
if(result1.length()<20){//補(bǔ)位操作,便于解碼
int
addition=20-result1.length();
for(int
j=0;j<addition;j++){
result1="0"+result1;
}
}
//System.out.print(result1);
int
media_data2=(int)Math.floor((result[1][i]/beta_Max)*((Math.pow(2,
20)-1)));
result2=Integer.toBinaryString(media_data2);
if(result2.length()<20){//補(bǔ)位操作,便于解碼
int
addition=20-result2.length();
for(int
j=0;j<addition;j++){
result2="0"+result2;
}
}
//System.out.print(result2);
int
media_data3=(int)Math.floor((result[2][i]/rou_Max)*((Math.pow(2,
10)-1)));
result3=Integer.toBinaryString(media_data3);
if(result3.length()<10){//補(bǔ)位操作,便于解碼
int
addition=10-result3.length();
for(int
j=0;j<addition;j++){
result3="0"+result3;
}
}
//System.out.println(result3);
pop[i]=result1+result2+result3;
//System.out.println(pop[i]+"\t"+pop[i].length());
}
return pop;
}
public static double[][]
dencode(){//二進(jìn)制字符串轉(zhuǎn)化為十進(jìn)制實(shí)數(shù),解碼過(guò)程
for(int
k=0;k<popution;k++){
String
src=pop[k];
String
alpha_subString=src.substring(0, 20);//截取染色體中alpha片段
String
beta_subString=src.substring(20, 40);//截取染色體中beta片段
String
rou_subString=src.substring(40, 50);//截取染色體中rou片段
char
[]decode_alpha_temp=alpha_subString.toCharArray();//講染色體片段轉(zhuǎn)化為單個(gè)字符數(shù)組,便于求值
char
[]decode_beta_temp=beta_subString.toCharArray();
char
[]decode_rou_temp=rou_subString.toCharArray();
int
[]decode_alpha=new
int[decode_alpha_temp.length];//將上述字符值轉(zhuǎn)化為可以計(jì)算的整數(shù)值存儲(chǔ)
int
[]decode_beta=new int[decode_beta_temp.length];
int
[]decode_rou=new int[decode_rou_temp.length];
int
alpha_media=0;//解碼前的中間值
int
beta_media=0;
int
rou_media=0;
for(int
i=0;i<decode_alpha_temp.length;i++){
decode_alpha[i]=Integer.parseInt(String.valueOf(decode_alpha_temp[i]));
decode_beta[i]=Integer.parseInt(String.valueOf(decode_beta_temp[i]));
alpha_media+=decode_alpha[i]*Math.pow(2,
(decode_alpha.length-i-1));
beta_media+=decode_beta[i]*Math.pow(2,
(decode_beta.length-1-i));
}
for(int
i=0;i<decode_rou_temp.length;i++){
decode_rou[i]=Integer.parseInt(String.valueOf(decode_rou_temp[i]));
rou_media+=decode_rou[i]*Math.pow(2,
(decode_rou.length-1-i));
}
result[0][k]=Double.valueOf(df.format(((alpha_media/(Math.pow(2,
alpha_subString.length())-1))*alpha_Max)));
result[1][k]=Double.valueOf(df.format(((beta_media/(Math.pow(2,
beta_subString.length())-1))*beta_Max)));
result[2][k]=Double.valueOf(df.format(((rou_media/(Math.pow(2,
rou_subString.length())-1))*rou_Max)));
}
return result;
}
public static void crossover(){//交叉操作,多點(diǎn)交叉
for(int
i=0;i<popution;i++){
double
d=random.nextDouble();
if(d<pc){
int
k1=random.nextInt(popution);//選擇要交叉的兩條染色體
int
k2=random.nextInt(popution);
int position1=random.nextInt(20);//第一個(gè)交叉點(diǎn),alpha的交叉
int
position2=random.nextInt(20);//第二個(gè)交叉點(diǎn),beta的交叉
int
position3=random.nextInt(10);//第三個(gè)交叉點(diǎn),rou的交叉
String
alpha1=pop[k1].substring(0, 20);//獲取需要交叉的alpha字符串
String
alpha2=pop[k2].substring(0, 20);
String
beta1=pop[k1].substring(20, 40);//獲取需要交叉的beta字符串
String
beta2=pop[k2].substring(20, 40);
String
rou1=pop[k1].substring(40, 50);//獲取需要交叉的rou字符串
String
rou2=pop[k2].substring(40, 50);
pop[k1]=alpha1.substring(0,
position1)+alpha2.substring(position1, 20)+beta1.substring(0,
position2)+beta2.substring(position2, 20)+rou1.substring(0,
position3)+rou2.substring(position3, 10);
pop[k2]=alpha2.substring(0, position1)+alpha1.substring(position1,
20)+beta2.substring(0, position2)+beta1.substring(position2,
20)+rou2.substring(0, position3)+rou1.substring(position3,
10);
}
}
}
public static void mutation(){
for(int
i=0;i<popution;i++){
int
mutation_alpha=random.nextInt(20);//alpha變異位置
int
mutation_beta=random.nextInt(20)+20;//beta變異位置
int
mutation_rou=random.nextInt(10)+40;//rou變異位置
mutation(i,mutation_alpha,mutation_beta,mutation_rou);
}
}
public static void mutation(int popnum,int
position1,int position2,int
position3){//按照alpha、beta、rou進(jìn)行多點(diǎn)變異
String temp=pop[popnum];
StringBuffer sb=new
StringBuffer(temp);
if(sb.charAt(position1)=='0'){
sb.setCharAt(position1,
'1');
}else{
sb.setCharAt(position1,
'0');
}
if(sb.charAt(position2)=='0'){
sb.setCharAt(position2,
'1');
}else{
sb.setCharAt(position2,
'0');
}
if(sb.charAt(position3)=='0'){
sb.setCharAt(position3,
'1');
}else{
sb.setCharAt(position3,
'0');
}
pop[popnum]=sb.toString();
}
public static void
roulettwheel(){//使用輪盤(pán)賭進(jìn)行染色體選擇
double sum=0.0;
for(int
i=0;i<popution;i++){
sum+=fitness[i];
}
for(int
i=0;i<popution;i++){
p[i]=fitness[i]/sum;
q[i]=0.0;
}
for(int
i=0;i<popution;i++){
for(int
j=0;j<=i;j++){
q[i]+=p[j];
}
}
double []ran=new
double[popution];
String[] tempPop=new
String[popution];
for (int i = 0; i
< ran.length; i++) {
ran[i]=random.nextDouble();
}
for (int i = 0; i
< ran.length; i++) {
int k = 0;
for (int j = 0; j < q.length; j++) {
if(ran[i]<=q[j])
{
k=j;
break;
}
else continue;
}
tempPop[i]=pop[k];
}
for (int i = 0; i < tempPop.length; i++) {
pop[i]=tempPop[i];
}
}
public static void run(int
totalevolutiongeneration){
for(int i=0;i<
totalevolutiongeneration;i++){
//System.out.println("第"+i+"代--->");
evolution(i);
}
}
public static void evolution(int
generation){
encode();
crossover();
mutation();
dencode();
fitness(generation);
roulettwheel();
}
public static void main(String[] args) {
// TODO Auto-generated method
stub
System.out.println("程序開(kāi)始運(yùn)行...");
System.out.println("遺傳算法開(kāi)始初始化...");
initpopution();
GAACASelect gaaca=new
GAACASelect(initpop);
System.out.println("遺傳算法初始化完成!");
System.out.println("蟻群算法開(kāi)始初始化...");
init();
time=System.currentTimeMillis();
System.out.println("蟻群算法初始化完成!");
System.out.println("程序進(jìn)化中...");
run(100);
System.out.println("程序進(jìn)化完成!");
GAACASelect.printResult();
System.out.println("程序運(yùn)行耗時(shí):"+(System.currentTimeMillis()-time));
System.out.println(gaaca.getClass());
}
}
分享
頂
閱讀┊ ┊ ┊┊ ┊打印┊
已投稿到:
排行榜 圈子
加載中,請(qǐng)稍候......
前一篇:java中double型數(shù)據(jù)精度控制
后一篇:用java實(shí)現(xiàn)excel數(shù)據(jù)批量導(dǎo)入數(shù)據(jù)庫(kù)
評(píng)論 重要提示:警惕虛假中獎(jiǎng)信息 在插畫(huà)中找尋曾經(jīng)的美好 關(guān)注每日最熱門(mén)博客
發(fā)評(píng)論 旅游行攝,輕品日本 是誰(shuí)改變了你的博客? 關(guān)注每日最熱門(mén)博客
登錄名: 密碼: 找回密碼 注冊(cè)
昵 稱:
驗(yàn)證碼: 請(qǐng)點(diǎn)擊后輸入驗(yàn)證碼
以上網(wǎng)友發(fā)言只代表其個(gè)人觀點(diǎn),不代表新浪網(wǎng)的觀點(diǎn)或立場(chǎng)。
< 前一篇java中double型數(shù)據(jù)精度控制
后一篇 >用java實(shí)現(xiàn)excel數(shù)據(jù)批量導(dǎo)入數(shù)據(jù)庫(kù)