?? view.htm
字號:
<BR>skip(outfp,1); <BR>} <BR><BR>void writepop() <BR>{ <BR>struct
individual *pind; <BR>int j; <BR>for(j=0; j<POPSIZE; <BR j++)> {
<BR>fprintf(outfp,"%3d) ",j+1); <BR>/* 當前代個體 */ <BR>pind =
&(oldpop[j]); <BR>writechrom(pind->chrom); <BR>fprintf(outfp," %8f
| ", pind->fitness); <BR>/* 新一代個體 */ <BR>pind = &(newpop[j]);
<BR>fprintf(outfp,"(%2d,%2d) %2d ", <BR>pind->parent[0],
pind->parent[1], pind->xsite); <BR>writechrom(pind->chrom);
<BR>fprintf(outfp," %8f\n", pind->fitness); <BR>} <BR>} <BR><BR>void
writechrom(chrom) /* 輸出染色體編碼 */ <BR>unsigned *chrom; <BR>{ <BR>int j, k,
stop; <BR>unsigned mask = 1, tmp; <BR>for(k = 0; k < chromsize; k++)
<BR>{ <BR>tmp = chrom[k]; <BR>if(k == (chromsize-1)) <BR>stop = lchrom -
(k*(8*sizeof(unsigned))); <BR>else <BR>stop =8*sizeof(unsigned); <BR>for(j
= 0; j < stop; j++) <BR>{ <BR>if(tmp&mask) <BR>fprintf(outfp,"1");
<BR>else <BR>fprintf(outfp,"0"); <BR>tmp = tmp>>1; <BR>} <BR>} <BR>}
<BR><BR>void preselect() <BR>{ <BR>int j; <BR>sumfitness = 0; <BR>for(j =
0; j < popsize; j++) sumfitness += oldpop[j].fitness; <BR>} <BR><BR>int
select() /* 輪盤賭選擇*/ <BR>{ <BR>extern float randomperc(); <BR>float sum,
pick; <BR>int i; <BR>pick = randomperc(); <BR>sum = 0; <BR>if(sumfitness
!= 0) <BR>{ <BR>for(i = 0; (sum < pick) && (i < popsize);
i++) <BR>sum += oldpop[i].fitness/sumfitness; <BR>} <BR>else <BR>i =
rnd(1,popsize); <BR>return(i-1); <BR>} <BR><BR>void statistics(pop) /*
計算種群統計數據 */ <BR>struct individual *pop; <BR>{ <BR>int i, j; <BR>sumfitness
= 0.0; <BR>min = pop[0].fitness; <BR>max = pop[0].fitness; <BR>/*
計算最大、最小和累計適應度 */ <BR>for(j = 0; j < popsize; j++) <BR>{ <BR>sumfitness
= sumfitness + pop[j].fitness; <BR>if(pop[j].fitness > max) max =
pop[j].fitness; <BR>if(pop[j].fitness < min) min = pop[j].fitness;
<BR>/* new global best-fit individual */ <BR>if(pop[j].fitness >
bestfit.fitness) <BR>{ <BR>for(i = 0; i < chromsize; i++)
<BR>bestfit.chrom[i] = pop[j].chrom[i]; <BR>bestfit.fitness =
pop[j].fitness; <BR>bestfit.varible = pop[j].varible;
<BR>bestfit.generation = gen; <BR>} <BR>} <BR>/* 計算平均適應度 */ <BR>avg =
sumfitness/popsize; <BR>} <BR><BR>void title() <BR>{
<BR>settextstyle(0,0,4); <BR>gprintf(110,15,4,0,"SGA Optimizer");
<BR>setcolor(9); <BR>disp_hz24("基本遺傳算法",220,60,25); <BR>} <BR><BR>void
repchar (outfp,ch,repcount) <BR>FILE *outfp; <BR>char *ch; <BR>int
repcount; <BR>{ <BR>int j; <BR>for (j = 1; j <= repcount; j++)
fprintf(outfp,"%s", ch); <BR>} <BR><BR>void skip(outfp,skipcount) <BR>FILE
*outfp; <BR>int skipcount; <BR>{ <BR>int j; <BR>for (j = 1; j <=
skipcount; j++) fprintf(outfp,"\n"); <BR>} <BR><BR>void objfunc(critter)
/* 計算適應度函數值 */ <BR>struct individual *critter; <BR>{ <BR>unsigned mask=1;
<BR>unsigned bitpos; <BR>unsigned tp; <BR>double pow(), bitpow ; <BR>int
j, k, stop; <BR>critter->varible = 0.0; <BR>for(k = 0; k <
chromsize; k++) <BR>{ <BR>if(k == (chromsize-1)) <BR>stop =
lchrom-(k*(8*sizeof(unsigned))); <BR>else <BR>stop =8*sizeof(unsigned);
<BR>tp = critter->chrom[k]; <BR>for(j = 0; j < stop; j++) <BR>{
<BR>bitpos = j + (8*sizeof(unsigned))*k; <BR>if((tp&mask) == 1) <BR>{
<BR>bitpow = pow(2.0,(double) bitpos); <BR>critter->varible =
critter->varible + bitpow; <BR>} <BR>tp = tp>>1; <BR>} <BR>}
<BR>critter->varible
=-1+critter->varible*3/(pow(2.0,(double)lchrom)-1);
<BR>critter->fitness
=critter->varible*sin(critter->varible*10*atan(1)*4)+2.0; <BR>}
<BR><BR>void mutation(unsigned *child) /*變異操作*/ <BR>{ <BR>int j, k, stop;
<BR>unsigned mask, temp = 1; <BR>for(k = 0; k < chromsize; k++) <BR>{
<BR>mask = 0; <BR>if(k == (chromsize-1)) <BR>stop = lchrom -
(k*(8*sizeof(unsigned))); <BR>else <BR>stop = 8*sizeof(unsigned);
<BR>for(j = 0; j < stop; j++) <BR>{ <BR>if(flip(pmutation)) <BR>{
<BR>mask = mask|(temp<<J); <BR> nmutation++; <BR>} <BR>} <BR>child[k] =
child[k]^mask; <BR>} <BR>} <BR><BR>int crossover (unsigned *parent1,
unsigned *parent2, unsigned *child1, unsigned *child2) <BR>/*
由兩個父個體交叉產生兩個子個體 */ <BR>{ <BR>int j, jcross, k; <BR>unsigned mask, temp;
<BR>if(flip(pcross)) <BR>{ <BR>jcross = rnd(1 ,(lchrom - 1));/* Cross
between 1 and l-1 */ <BR>ncross++; <BR>for(k = 1; k <= chromsize; k++)
<BR>{ <BR>if(jcross >= (k*(8*sizeof(unsigned)))) <BR>{ <BR>child1[k-1]
= parent1[k-1]; <BR>child2[k-1] = parent2[k-1]; <BR>} <BR>else if((jcross
< (k*(8*sizeof(unsigned)))) && (jcross >
((k-1)*(8*sizeof(unsigned))))) <BR>{ <BR>mask = 1; <BR>for(j = 1; j <=
(jcross-1-((k-1)*(8*sizeof(unsigned)))); j++) <BR>{ <BR>temp = 1; <BR>mask
= mask<<1; <BR>mask = mask|temp; <BR>} <BR>child1[k-1] =
(parent1[k-1]&mask)|(parent2[k-1]&(~mask)); <BR>child2[k-1] =
(parent1[k-1]&(~mask))|(parent2[k-1]&mask); <BR>} <BR>else <BR>{
<BR>child1[k-1] = parent2[k-1]; <BR>child2[k-1] = parent1[k-1]; <BR>}
<BR>} <BR>} <BR>else <BR>{ <BR>for(k = 0; k < chromsize; k++) <BR>{
<BR>child1[k] = parent1[k]; <BR>child2[k] = parent2[k]; <BR>} <BR>jcross =
0; <BR>} <BR>return(jcross); <BR>} <BR><BR>void advance_random() /*
產生55個隨機數 */ <BR>{ <BR>int j1; <BR>double new_random; <BR>for(j1 = 0; j1
< 24; j1++) <BR>{ <BR>new_random = oldrand[j1] - oldrand[j1+31];
<BR>if(new_random < 0.0) new_random = new_random + 1.0; <BR>oldrand[j1]
= new_random; <BR>} <BR>for(j1 = 24; j1 < 55; j1++) <BR>{
<BR>new_random = oldrand [j1] - oldrand [j1-24]; <BR>if(new_random <
0.0) new_random = new_random + 1.0; <BR>oldrand[j1] = new_random; <BR>}
<BR>} <BR><BR>int flip(float prob) /* 以一定概率產生0或1 */ <BR>{ <BR>float
randomperc(); <BR>if(randomperc() <= prob) <BR>return(1); <BR>else
<BR>return(0); <BR>} <BR><BR>void randomize() /* 設定隨機數種子并初始化隨機數發生器 */
<BR>{ <BR>float randomseed; <BR>int j1; <BR>for(j1=0; j1<=54; j1++)
<BR>oldrand[j1] = 0.0; <BR>jrand=0; <BR>do <BR>{ <BR>setcolor(9);
<BR>disp_hz16("隨機數種子[0-1]:",100,330,20); <BR>gscanf(320,330,9,15,4,"%f",
&randomseed); <BR>} <BR>while((randomseed < 0.0) || (randomseed
> 1.0)); <BR>warmup_random(randomseed); <BR>} <BR><BR>double
randomnormaldeviate() /* 產生隨機標準差 */ <BR>{ <BR>double sqrt(), log(), sin(),
cos(); <BR>float randomperc(); <BR>double t, rndx1; <BR>if(rndcalcflag)
<BR>{ rndx1 = sqrt(- 2.0*log((double) randomperc())); <BR>t = 6.2831853072
* (double) randomperc(); <BR>rndx2 = rndx1 * sin(t); <BR>rndcalcflag = 0;
<BR>return(rndx1 * cos(t)); <BR>} <BR>else <BR>{ <BR>rndcalcflag = 1;
<BR>return(rndx2); <BR>} <BR>} <BR><BR>float randomperc()
/*與庫函數random()作用相同, 產生[0,1]之間一個隨機數 */ <BR>{ <BR>jrand++; <BR>if(jrand
>= 55) <BR>{ <BR>jrand = 1; <BR>advance_random(); <BR>}
<BR>return((float) oldrand[jrand]); <BR>} <BR><BR>int rnd(low, high)
/*在整數low和high之間產生一個隨機整數*/ <BR>int low,high; <BR>{ <BR>int i; <BR>float
randomperc(); <BR>if(low >= high) <BR>i = low; <BR>else <BR>{ <BR>i =
(randomperc() * (high - low + 1)) + low; <BR>if(i > high) i = high;
<BR>} <BR>return(i); <BR>} <BR><BR><BR>void warmup_random(float
random_seed) /* 初始化隨機數發生器*/ <BR>{ <BR>int j1, ii; <BR>double new_random,
prev_random; <BR><BR>oldrand[54] = random_seed; <BR>new_random =
0.000000001; <BR>prev_random = random_seed; <BR>for(j1 = 1 ; j1 <= 54;
j1++) <BR>{ <BR>ii = (21*j1)%54; <BR>oldrand[ii] = new_random;
<BR>new_random = prev_random-new_random; <BR>if(new_random<0.0)
new_random = new_random + 1.0; <BR>prev_random = oldrand[ii]; <BR>}
<BR>advance_random(); <BR>advance_random(); <BR>advance_random();
<BR>jrand = 0; <BR>} <BR><BR><BR>main(argc,argv) /* 主程序 */ <BR>int argc;
<BR>char *argv[]; <BR>{ <BR>struct individual *temp; <BR>FILE *fopen();
<BR>void title(); <BR>char *malloc(); <BR>if((outfp = fopen(argv[1],"w"))
== NULL) <BR>{ <BR>fprintf(stderr,"Cannot open output file %s\n",argv[1]);
<BR>exit(-1); <BR>} <BR>g_init(); <BR>setcolor(9); <BR>title();
<BR>disp_hz16("輸入遺傳算法執行次數(1-5):",100,120,20);
<BR>gscanf(320,120,9,15,4,"%d",&maxruns); <BR>for(run=1;
run<=maxruns; run++) <BR>{ <BR>initialize(); <BR>for(gen=0; gen<MAXGEN;
<BR gen++)> { <BR>fprintf(outfp,"\n第 %d / %d 次運行: 當前代為 %d, 共 %d 代\n",
run,maxruns,gen,maxgen); <BR>/* 產生新一代 */ <BR>generation(); <BR>/*
計算新一代種群的適應度統計數據 */ <BR>statistics(newpop); <BR>/* 輸出新一代統計數據 */
<BR>report(); <BR>temp = oldpop; <BR>oldpop = newpop; <BR>newpop = temp;
<BR>} <BR>freeall(); <BR>} <BR>}
<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<BR><BR><BR>[align=right]<FONT color=#000066>[此貼子已經被作者于2003-9-13
22:29:13編輯過]</FONT>[/align] </SPAN><BR><BR>
<DIV align=right></DIV>
<HR color=#000000 noShade SIZE=1>
<BR></TD></TR></TBODY></TABLE><A name=22936></A>
<TABLE cellSpacing=1 cellPadding=4 width="95%" bgColor=#000000 border=0>
<TBODY>
<TR class=head>
<TD align=middle width=150><FONT color=#ffffff><B>作者</B></FONT></TD>
<TD><FONT color=#ffffff><B>Re:基本遺傳算法源程序 [Re:iamqsar] </B></FONT></TD></TR>
<TR class=even>
<TD vAlign=top width=150><B>see_moonlight</B> <BR><IMG
src="view.files/face_p15.gif" border=0> <BR><BR><BR>版主<IMG
src="view.files/37270895.gif" border=0> <BR><BR><B>發貼:</B> 191
<BR><B>技術分:</B> 16 <BR><B>積分:</B>523 <BR><IMG height=1
src="view.files/pixel.gif" width=150 border=0> </TD>
<TD vAlign=top width="100%"><IMG src="view.files/post.gif" align=absMiddle
border=0>于 2003-09-15 12:03 <A
href="http://bbs.matwav.com/user/info?uid=1152"><IMG alt="user profile"
src="view.files/icon_profile.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/user/message?action=WriteMessage&to=see_moonlight&subject=Re%3ARe%3A%BB%F9%B1%BE%D2%C5%B4%AB%CB%E3%B7%A8%D4%B4%B3%CC%D0%F2"
target=_blank><IMG alt="send a private message to user"
src="view.files/icon_pm.gif" align=absMiddle border=0></A><A
href="mailto:see_moonlight@126.com"><IMG alt="send email to see_moonlight"
src="view.files/icon_email.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/post/reply?bid=7&parent=22936&done=%2Fpost%2Fview%3Fbid%3D7%26id%3D22932%26sty%3D1%26tpg%3D1%26age%3D0&quote=1"><IMG
alt="reply to post" src="view.files/icon_quote.gif" align=absMiddle
border=0></A><A
href="http://bbs.matwav.com/post/search?username=see_moonlight&action=Search"><IMG
alt="search all posts by" src="view.files/icon_find.gif" align=absMiddle
border=0></A><A href="javascript:copyText(document.all.text22936);"><IMG
alt="select and copy to clipboard. ie only, sorry for netscape users:-)"
src="view.files/icon_copy.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/user/favorite?action=Add&bid=7&id=22936"
target=_blank><IMG alt="add this post to my favorite list"
src="view.files/icon_favorite.gif" align=absMiddle border=0></A>
<HR color=#000000 noShade SIZE=1>
<SPAN class=javascript id=text22936>go on ! <BR><BR>you'd better give us a
example </SPAN><BR><BR>
<DIV align=right></DIV>
<HR color=#000000 noShade SIZE=1>
臨江仙<BR><BR>陳夕往事益歸去,<BR>古道西風依舊.<BR>人生長河水長東,<BR>春去遇秋來,<BR>天際尋鵠鴻.<BR><BR>日月星移話滄桑,<BR>是非功過何在?<BR>一路風雨兼程行,<BR>唯清風明月,<BR>獨在情懷中.
<BR></TD></TR></TBODY></TABLE><A name=22935></A>
<TABLE cellSpacing=1 cellPadding=4 width="95%" bgColor=#000000 border=0>
<TBODY>
<TR class=head>
<TD align=middle width=150><FONT color=#ffffff><B>作者</B></FONT></TD>
<TD><FONT color=#ffffff><B>Re:基本遺傳算法源程序 [Re:iamqsar] </B></FONT></TD></TR>
<TR class=even>
<TD vAlign=top width=150><B>wgao</B> <BR><IMG src="view.files/none.gif"
border=0> <BR><BR><BR>超級版主<IMG src="view.files/37270895.gif" border=0>
<BR><BR><B>發貼:</B> 508 <BR><B>技術分:</B> 33 <BR><B>積分:</B>792 <BR><IMG
height=1 src="view.files/pixel.gif" width=150 border=0> </TD>
<TD vAlign=top width="100%"><IMG src="view.files/post.gif" align=absMiddle
border=0>于 2003-09-16 11:47 <A
href="http://bbs.matwav.com/user/info?uid=3340"><IMG alt="user profile"
src="view.files/icon_profile.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/user/message?action=WriteMessage&to=wgao&subject=Re%3ARe%3A%BB%F9%B1%BE%D2%C5%B4%AB%CB%E3%B7%A8%D4%B4%B3%CC%D0%F2"
target=_blank><IMG alt="send a private message to user"
src="view.files/icon_pm.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/post/reply?bid=7&parent=22935&done=%2Fpost%2Fview%3Fbid%3D7%26id%3D22932%26sty%3D1%26tpg%3D1%26age%3D0&quote=1"><IMG
alt="reply to post" src="view.files/icon_quote.gif" align=absMiddle
border=0></A><A
href="http://bbs.matwav.com/post/search?username=wgao&action=Search"><IMG
alt="search all posts by" src="view.files/icon_find.gif" align=absMiddle
border=0></A><A href="javascript:copyText(document.all.text22935);"><IMG
alt="select and copy to clipboard. ie only, sorry for netscape users:-)"
src="view.files/icon_copy.gif" align=absMiddle border=0></A><A
href="http://bbs.matwav.com/user/favorite?action=Add&bid=7&id=22935"
target=_blank><IMG alt="add this post to my favorite list"
src="view.files/icon_favorite.gif" align=absMiddle border=0></A>
<HR color=#000000 noShade SIZE=1>
<SPAN class=javascript id=text22935>此種程序網上有很多, 有必要自己來嗎 </SPAN><BR><BR>
<DIV align=right></DIV>
<HR color=#000000 noShade SIZE=1>
<BR></TD></TR></TBODY></TABLE><A name=22934></A>
<TABLE cellSpacing=1 cellPadding=4 width="95%" bgColor=#000000 border=0>
<TBODY>
<TR class=head>
<TD align=middle width=150><FONT color=#ffffff><B>作者</B></FONT></TD>
<TD><FONT color=#ffffff><B>Re:基本遺傳算法源程序 [Re:iamqsar] </B></FONT></TD></TR>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -