int select()
" a0 c' d. a( J' u" r: L/ k{6 ?3 n% j4 k- U; j
double rand1,partsum;
% x/ w! A% k+ V D int i;, v' x, o" N; @6 Z
partsum=0.0;i=0;! [' f; n* D+ n
rand1=((float)(MY_RANDOM%16384)/16383.0);
. q: Y. \/ b2 a& K rand1*=sum_of_fitness;/ t1 `& q1 r$ [0 M1 W/ E
do{
* ]- c, r, ~7 @. [. {. \ partsum+=gold_pop->fitness;. k, G4 J. K" C) r9 o& \& D' [ t
i=i+1;/ I3 I& T4 C: H/ R* g
}while((partsum<rand1)&&(i<popsize)); t6 z% R9 k4 o7 L+ B$ ^- Y* z
return (i-1);
2 X( P& L+ G) s9 W& \; B}
0 q' q0 r4 B9 s7 b6 Y. A
; ^% `7 Z! _2 t2 Uvoid generation(State *start_state,State *end_state)# z3 B2 s! P+ z+ \
{
! Q3 T! X5 J [( z, r. q) ^ unsigned int k,j,mate1,mate2;% m! @6 @! k% Z, X8 o
j=0;7 H( o$ K: f) \: }5 K5 C
do{, h- X. a$ o6 J
mate1=select();
Q. Q8 d& _4 E' u9 ]repeat_select1:mate2=select();- P; Q0 k" [/ [+ ~3 r, F
if(mate1==mate2)
+ y4 }% [! K! N! x% i3 H goto repeat_select1;
$ I% h. C5 k$ C% {0 a" k crossover(gold_pop[mate1],gold_pop[mate2],j);0 n2 v4 T- p4 x' z7 o; t2 R
gnew_pop[j]->num_of_inconsistents=num_of_inconsistents(start_state,end_state,gnew_pop[j]);
0 t' X" ~+ o* \5 V- T- U gnew_pop[j]->parent1=mate1;+ o' B# U, A3 B5 E: q
gnew_pop[j]->parent2=mate2;" K. n" @( J$ ?" v& X& R9 f7 e3 Z/ S
gnew_pop[j+1]->num_of_inconsistents=num_of_inconsistents(start_state,end_state,gnew_pop[j+1]);
4 i- \, t$ p9 [ gnew_pop[j+1]->parent1=mate1;7 D3 e: v# \# ?7 Z% [- o' ?
gnew_pop[j+1]->parent2=mate2;0 X; s( ]" P4 U) A+ C
if(gnew_pop[j]->fitness>min)
0 _/ f; p8 Y: ~+ p1 v) l& Z: ~$ d' k {8 ~; d7 l0 @, H3 C+ t: C
for(k=0;k<gnew_pop[j]->num_of_actions;k++)
A/ B( x2 T0 c0 e if(k>=gold_pop[minpp]->num_of_actions)
( u2 J/ }; P3 ?5 [! E- p& \ gold_pop[minpp]->actions[gold_pop[minpp]->num_of_actions++]=gnew_pop[j]->actions[k];
7 |" m- |& |" I$ P. S5 f, [' s else7 g( h8 [, n9 o( [% u+ `* N
gold_pop[minpp]->actions[k]=gnew_pop[j]->actions[k];
1 c; I! ~. g+ b/ w: q$ X gold_pop[minpp]->num_of_actions=k+1;
* z8 I" E3 c1 r v/ Y gold_pop[minpp]->num_of_inconsistents=gnew_pop[j]->num_of_inconsistents;
* ]3 K) y6 x% o; @; f6 Y' y9 ^ }
4 ]* G# O/ C7 s; n7 b$ w4 J4 U if(gnew_pop[j+1]->fitness>min)
$ |9 V, Y z N: Z9 S* y {
" J5 T* n- t. ^5 g; d6 c for(k=0;k<gnew_pop[j+1]->num_of_actions;k++)
2 o3 _. v3 ]& Y if(k>=gold_pop[minpp]->num_of_actions)
- Q9 L2 _9 p* Z" ?& D gold_pop[minpp]->actions[gold_pop[minpp]->num_of_actions++]=gnew_pop[j+1]->actions[k];
8 W8 I$ e6 J- x( C$ E* S else2 z) @# l0 l# S
gold_pop[minpp]->actions[k]=gnew_pop[j+1]->actions[k];
5 p# r$ B) b) y0 g- Y, x3 w gold_pop[minpp]->num_of_actions=k+1;) L6 j& L( }7 o, T/ x# c S
gold_pop[minpp]->num_of_inconsistents=gnew_pop[j+1]->num_of_inconsistents;
1 T2 R6 R b# C& U J }
2 d# O8 \$ d8 y9 V& H j=j+2;" @: ~) P9 f, A" A
}while(j<popsize);
! e t, l8 |9 o; Z2 c}
: x/ m4 H( t r! _. W% q% n- q就是generation()函数调用select()函数时# A' B, R+ I! B5 o0 ?* |
问题1:当单步执行程序进入函数generation()后,我用info locals查看函数generation()的局部变量,结果只能看到变量j,k的取值,看不到变量mate1,mate2的取值,用print mate1或print mate2查看mate1或mate2时显示"no sumbol "mate1" in current context。
7 `3 T) W, r) z* N$ r问题2:当函数generation()调用select()时,进入函数select()时,用backtrace查看函数调用栈时,在栈顶看不到select()。按常理函数调用栈里应该能看到select()才对,不知是何原因。
" _7 g: o0 r5 ?) U$ w4 m4 a问题3:当函数generation()调用select(),执行函数select()中代码时,本来select()中的局部变量l跟generation()中的局部变量没有任何关系,结果单步跟踪程序执行时却发现select()中的变量i与generation()中的变量k却保持同步变化。1 }4 Z; h2 w# ?3 \+ V8 o
问题4:在函数select()执行过程中,在执行完函数select()中的一个循环,跳出select()中的do-while循环体后,本来应该执行函数select()中的return (i-1)直接返回,但在单步跟踪程序执行过程中,程序却跳到函数generation()中去执行其中一个语句,然后又返回函数select(),重新执行select()。程序最终会出现Sementation Fault的提示