rparam()

2009/05/22に書いた、0付近の非対称の原因がrparam()にあることを実際に確認した。
Bonanza 4.0.4で、dv==0のときにはistepの更新をしないで、乱数の効果分だけ更新するように書き換える。

static void
rparam( short *pv, float dv, int istep )
{
  int v, r;

  v = *pv;
  r = brand() + brand() - 1;

  if      ( v > 0 ) { dv -= (float)FV_PENALTY; }
  else if ( v < 0 ) { dv += (float)FV_PENALTY; }

  if (dv == 0.0) {
    if (r > 0) {
      if (v <= SHRT_MAX - r) { v += r; }
      else {
      warn:
	out_warning( "A fvcoef parameter is out of bounce.\n" );
      }
    }
    else if (r < 0) {
      if (v >= SHRT_MIN - r) { v += r; }
      else goto warn;
    }
  }
  else {
    istep += r;
    if (dv > 0.0) {
      if (v <= SHRT_MAX - istep ) { v += istep; }
      else goto warn;
    }
    else {
      if (v >= SHRT_MIN + istep ) { v -= istep; }
      else goto warn;
    }
  }

  *pv = (short)v;
}

初期状態から1回iterationした結果は、以下のようになった。(newが書き換えた側)
やはりrparam()が原因だった。

KPP value ratio
valueoriginalnew
-50.15%0.15%
-40.14%0.14%
-30.44%0.46%
-24.52%4.76%
-118.46%22.93%
032.57%37.01%
126.76%22.68%
29.29%4.61%
30.87%0.44%
40.15%0.14%
50.15%0.15%


KKP value ratio
valueoriginalnew
-50.17%0.16%
-40.16%0.16%
-30.46%0.48%
-24.52%4.85%
-118.70%24.61%
033.18%39.11%
127.45%22.06%
29.63%3.37%
30.91%0.35%
40.16%0.16%
50.17%0.17%