白砂様の以前の選手権出場記を読み返していて、ふと気になった事がありましたので メールさせていただきました。 http://www.hakusa.net/shogi/computer/wcsc22_1.html の4月30日のバグなのですが、 ひょっとしたらマクロがらみの現象の可能性があるのではないかと。 もともとのコードは下記のようになっているとの事でした。 > return max(v, > EvalMin(AtackS+1,NumAtackS-1,AtackE,NumAtackE)); ここで、仮に「maxがマクロ定義されている」かつ「EvalMinの呼び出しが副作用を伴う」 場合は上手く動かない(バグが発生する)のではないかと。 たとえばmaxが下記のようになっていれば、EvalMinが2回呼び出されてしまう事があり、 バグの原因になるかと思います。 #define max(X,Y) (((X) > (Y)) ? (X) : (Y)) 外している可能性もありますが、何かの参考になれば幸いです。 |
error C3861: 'min'識別子が見つかりませんでした
|
SemegomaValueS KomagumiBonus SemegomaBonus MamorigomaBonus 末端 13歩(14) v: -1414 value: -1225 E: -1209 B: -205 SS: -2 SE: -49 MS: 49 ME: 10 K0: 9 K1: 7 S0: -200 S1: 145 M0: 125 M1: -92 終▲:-2 終△:-2 末端 13歩成(14)v: -1429 value: -125 E: -124 B: -1305 SS: -2 SE: -49 MS: 49 ME: 10 K0: -6 K1: 7 S0: -202 S1: 145 M0: 76 M1: -92 終▲:-2 終△: 0 |
for(suji=0x10;suji<=0x90;suji+=0x10) { for(dan=1;dan<=9;dan++) { value-=KomagumiValue[ban[suji+dan]][suji+dan]; for(koma=SFU;koma<=ERY;koma++) { if (koma==SGI) { JosekiKomagumi[Senkei][koma][suji+dan]=JosekiKomagumiSGI[Senkei][dan-1][9-(suji/0x10)]; } else if (koma==EGI) { JosekiKomagumi[Senkei][koma][suji+dan]=-JosekiKomagumiSGI[GyakuSenkei][9-dan][suji/0x10-1]; } else if (koma==SKI) { JosekiKomagumi[Senkei][koma][suji+dan]=JosekiKomagumiSKI[Senkei][dan-1][9-(suji/0x10)]; } else if (koma==EKI) { JosekiKomagumi[Senkei][koma][suji+dan]=-JosekiKomagumiSKI[GyakuSenkei][9-dan][suji/0x10-1]; } else if (koma==SOU) { JosekiKomagumi[Senkei][koma][suji+dan]=JosekiKomagumiSOU[Senkei][dan-1][9-(suji/0x10)]; } else if (koma==EOU) { JosekiKomagumi[Senkei][koma][suji+dan]=-JosekiKomagumiSOU[GyakuSenkei][9-dan][suji/0x10-1]; } else { JosekiKomagumi[Senkei][koma][suji+dan]=DanValue[koma][dan];←←←←←←←←←←←←その他の駒はここでカウント } KomagumiValue[koma][suji+dan]=JosekiKomagumi[Senkei][koma][suji+dan]; } if (ban[suji+dan] & SELF) { KomagumiBonus[0]+=KomagumiValue[ban[suji+dan]][suji+dan];←←←←←←←←←←←←←←←←←先手の駒の時はここに入る。 } else if (ban[suji+dan] & ENEMY) { KomagumiBonus[1]+=KomagumiValue[ban[suji+dan]][suji+dan]; } } } |
//歩 1 2 3 4 5 6 7 8 9 { 0, 0,15,15,15,3,1, 0, 0, 0}, //と 1 2 3 4 5 6 7 8 9 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
void Kyokumen::MoveTo(int SorE,int &teNum,Te *teTop,int to,int* pin) { int p; KomaInf koma; for(int i=0;i<12;i++) { if ((koma=ban[to-Direct[i]]) == EMPTY) { p=search(to,-Direct[i]); if ((ban[p]&SorE) && CanJump[i][ban[p]]) { AddMove(SorE,teNum,teTop,p,to-p,pin[p]); } } else { ↓↓↓↓↓↓↓↓…………………………………ここが問題? if ((koma&~SorE)!=OU && (koma&SorE) && (CanMove[i][koma]||CanJump[i][koma])) { AddMove(SorE,teNum,teTop,to-Direct[i],Direct[i],pin[to-Direct[i]]); } } } } |
//生成した指し手について処理する for(i=0;i<teNum;i++) { KyokumenKomagumi kk(k); Stack[depth]=teBuf[i]; kk.Move(SorE,teBuf[i]); int v=-qsearch(SorE==SELF?ENEMY:SELF,k,-beta,-max(retval,alpha),depth+1,depthMax); //1手深く読む |
// 移動したことで、別の駒の飛び利きを通す(かも知れない) if (te[i].from>OU) { //駒移動なら、 for(dir=0;dir<8;dir++) { //周囲8方向を調べる(飛駒があるかどうかを調べたいので) if ((_nowControlS[te[i].from]& (1<<(dir+16))) !=0) { //移動前の駒位置にdir方向からの自分の駒の利きがあったら int p=_new.search(te[i].from,Direct[dir]); //現在の駒がなくなったものとして、利きの先を調べる if (_new.ban[p]!=WALL) { //その場所pの駒が壁ではない // 飛び利きの通った先での交換値の再計算 if (IsEnemy(SorE,_new.ban[p])) { //その場所pの駒が相手の駒であるなら LossE+=_new.Eval(p); //その場所pの交換値を相手の失点とする } else if (IsSelf(SorE,_new.ban[p])) { //その場所pの駒が自分の駒であるなら GainS+=Eval(p)-_new.Eval(p); //その場所pの、手を指す前と指した後の交換値の差分を自分の得点とする } } } } } |
// 移動したことで、別の駒の飛び利きを通す(かも知れない) if (te[i].from>OU) { for(dir=0;dir<8;dir++) { //自分の駒の利きが通った場合 if ((_nowControlS[te[i].from]& (1<<(dir+16))) !=0) { int p=_new.search(te[i].from,Direct[dir]); if (_new.ban[p]!=WALL) { // 飛び利きの通った先での交換値の再計算 if (IsEnemy(SorE,_new.ban[p])) { LossE+=_new.Eval(p); } else if (IsSelf(SorE,_new.ban[p])) { GainS+=Eval(p)-_new.Eval(p); } } } //相手の駒の利きが通った場合 if ((_nowControlE[te[i].from]& (1<<(dir+16))) !=0) { int p=_new.search(te[i].from,Direct[dir]); if (_new.ban[p]!=WALL) { // 飛び利きの通った先での交換値の再計算 if (IsEnemy(SorE,_new.ban[p])) { GainE-=Eval(p)-_new.Eval(p); } else if (IsSelf(SorE,_new.ban[p])) { LossS-=Eval(p); } } } } } |
45金(55) v:-166 d 0: d 1: d 2: d 3: d 4: d 5: CE:2097152 from:55 dir: 15 p:73 k:v銀 GainE v:-2135←←←←←ちゃんと後手の銀を救済している。 d 6: CS:12582912 from:55 dir: -1 p:53 k: 桂 GainS v: 1435 d 7: CS:12582912 from:55 dir:-17 p:33 k:v飛 LossE v: 3070 45金(55) val: 1726 LossS: 0 LossE: 3070 GainS: 1435 GainE:-2135 |
45金(55) v:-186 d 0: d 1: d 2: d 3: d 4: d 5: CE:2097152 from:55 dir: 15 p:73 k: 銀 LossS v: -115←←←←←ちゃんと先手の銀取りを評価している。 d 6: CS:12582912 from:55 dir: -1 p:53 k: 桂 GainS v: 1435 d 7: CS:12582912 from:55 dir:-17 p:33 k:v飛 LossE v: 3070 45金(55) val: 1839 LossS: -115 LossE: 3070 GainS: 1435 GainE: 0 |
モーニング娘。’14 道重さゆみに関するお知らせ私、道重さゆみは、今年2014年のモーニング娘。'14の秋ツアーの最終日をもって、モーニング娘。を卒業します。 私は、約二年前にリーダーになった時から「モーニング娘。に恩返しがしたい」と言ってきました。 そんな中、私の力だけではないですが、シングルで5作連続1位をいただけたり、 いろんな活動を通して、少しずつ、少しずつ、恩返しができたかな、と感じています。 そこで、つんく♂さんや事務所の方と相談して、今年の秋ツアーのタイミングで卒業という事にさせていただきました。 ですが、まだまだ時間はあるし、もっともっと後輩たちに伝えたい事や、 みせたいと思っている事もあります。 ファンのみなさまとも、たくさんの思い出を作りたいと思っています。 そして、ここからが本当の「恩返し」だと思っています。 超超超いい感じのモーニング娘。に仕上げてから卒業し、 次の世代にバトンタッチしたいと思っています。 秋までよろしくお願い致します。 |
その他、いろんな情報、例えばNPSなんかも表示できるようにしてみたり(←エラーがあまりにも多いんでねorz)、いろいろやっていた。 |
また、探索局面で王手がかかっている場合、王手の応手を生成すべきなので、 MakeMoveFirst に入らずにすぐにM(の中のAntiCheck)を呼ぶようにした。 (少し上の文章ですorz) |