Differences From Artifact [fc45f9bc575c213e]:
- File        
src/solver.d
- 2012-07-16 00:21:59 - part of checkin [c5c6ef71be] on branch trunk - float up replanner. (user: kinaba) [annotate]
 
 
To Artifact [5e89251084030d6c]:
- File        
src/solver.d
- 2012-07-16 00:38:53 - part of checkin [ffac82fc99] on branch trunk - Hopefully the correct way to detect deadly-round-trip. (user: kinaba) [annotate]
 
 
  325          Game      current_game;                                                      325          Game      current_game;
  326          SubSolver sub_solver;                                                        326          SubSolver sub_solver;
  327                                                                                       327  
  328          enum {Tentative, Tentative_Stuck, Fixed};                                    328          enum {Tentative, Tentative_Stuck, Fixed};
  329          string plan;                                                                 329          string plan;
  330          int    plan_state;                                                           330          int    plan_state;
  331          int    replan_limit;                                                         331          int    replan_limit;
                                                                                        >   332          bool   lambda_getter;
  332                                                                                       333  
  333          this(in Game g)                                                              334          this(in Game g)
  334          {                                                                            335          {
  335                  current_game = g.clone();                                            336                  current_game = g.clone();
  336                  plan         = "";                                                   337                  plan         = "";
  337                  plan_state   = Tentative;                                            338                  plan_state   = Tentative;
  338                  replan_limit = PredictFuture;                                        339                  replan_limit = PredictFuture;
................................................................................................................................................................................
  353                          return 'A';                                                  354                          return 'A';
  354                                                                                       355  
  355                  // Make enough prediction.                                           356                  // Make enough prediction.
  356                  while( plan_state==Tentative && plan.length<replan_limit )           357                  while( plan_state==Tentative && plan.length<replan_limit )
  357                          single_step_predict();                                       358                          single_step_predict();
  358                                                                                       359  
  359                  // If the future is bad, correct.                                    360                  // If the future is bad, correct.
  360                  if( plan_state==Tentative_Stuck && plan.length<replan_limit )    |   361                  if( plan_state==Tentative_Stuck && plan.length<replan_limit && !
  361                          replan();                                                    362                          replan();
  362                                                                                       363  
  363                  // Follow the predicted plan.                                        364                  // Follow the predicted plan.
  364                  if( plan.empty )                                                     365                  if( plan.empty )
  365                          return 'A';                                                  366                          return 'A';
  366  stderr.writeln(plan, " ", plan_state);                                               367  stderr.writeln(plan, " ", plan_state);
  367                  char c = plan[0];                                                    368                  char c = plan[0];
  368                  plan = plan[1..$];                                                   369                  plan = plan[1..$];
                                                                                        >   370                  int b_lambda = current_game.map.collected_lambda;
  369                  current_game.command(c);                                             371                  current_game.command(c);
                                                                                        >   372                  int a_lambda = current_game.map.collected_lambda;
                                                                                        >   373                  if(b_lambda < a_lambda) lambda_getter = false;
  370                  return c;                                                            374                  return c;
  371          }                                                                            375          }
  372                                                                                       376  
  373          void force(char c)                                                           377          void force(char c)
  374          {                                                                            378          {
  375                  if(plan.length>0 && plan[0]==c)                                      379                  if(plan.length>0 && plan[0]==c)
  376                  {                                                                    380                  {
................................................................................................................................................................................
  406                                                                                       410  
  407          void replan()                                                                411          void replan()
  408          {                                                                            412          {
  409  stderr.writeln("replan!");                                                           413  stderr.writeln("replan!");
  410                  // Try to replace every step of the plan by another move.            414                  // Try to replace every step of the plan by another move.
  411                  Game g = current_game.clone();                                       415                  Game g = current_game.clone();
  412                  Tuple!(SubSolver, string, int) cand = tuple(sub_solver, plan, Te     416                  Tuple!(SubSolver, string, int) cand = tuple(sub_solver, plan, Te
                                                                                        >   417  writeln(cand, " ", cand[0].g.map.collected_lambda);
  413                  bool tiebreak_by_turn = false;                                       418                  bool tiebreak_by_turn = false;
  414                  for(int i=0; i<plan.length; ++i) {                                   419                  for(int i=0; i<plan.length; ++i) {
  415                          foreach(string prefix; RandomChoicePattern)                  420                          foreach(string prefix; RandomChoicePattern)
  416                                  if(prefix[0] != plan[i]) {                           421                                  if(prefix[0] != plan[i]) {
  417                                          Tuple!(SubSolver, string, int) r = try_p     422                                          Tuple!(SubSolver, string, int) r = try_p
  418                                          r[1] = plan[0..i] ~ prefix ~ r[1];           423                                          r[1] = plan[0..i] ~ prefix ~ r[1];
  419                                          bool better = false, tbt=false;              424                                          bool better = false, tbt=false;
................................................................................................................................................................................
  425                                          else if(!cand[0].g.cleared && !r[0].g.cl     430                                          else if(!cand[0].g.cleared && !r[0].g.cl
  426                                                  if(cand[0].g.map.collected_lambd     431                                                  if(cand[0].g.map.collected_lambd
  427                                                          better = true;               432                                                          better = true;
  428                                                  else if(cand[0].g.map.collected_     433                                                  else if(cand[0].g.map.collected_
  429                                                          if(cand[0].g.dead && !r[     434                                                          if(cand[0].g.dead && !r[
  430                                                                  better = true;       435                                                                  better = true;
  431                                                          else if(cand[0].g.dead =     436                                                          else if(cand[0].g.dead =
  432                                                                  better = (cand[1 |   437                                                                  better = (cand[1
  433                                                                  tbt = true;          438                                                                  tbt = true;
  434                                                          }                            439                                                          }
  435                                                  }                                    440                                                  }
  436                                          }                                            441                                          }
  437                                          if(better) {                                 442                                          if(better) {
  438                                                  cand = r;                            443                                                  cand = r;
  439                                                  tiebreak_by_turn = true;             444                                                  tiebreak_by_turn = true;
  440  writeln(cand);                                                                   |   445  writeln(cand, " ", cand[0].g.map.collected_lambda);
  441  }                                                                                    446  }
  442                                  }                                                    447                                  }
  443                          g.command(plan[i]);                                          448                          g.command(plan[i]);
  444                  }                                                                    449                  }
  445                                                                                       450  
  446                  sub_solver   = cand[0];                                              451                  sub_solver   = cand[0];
  447                  plan         = cand[1];                                              452                  plan         = cand[1];
  448                  plan_state   = (plan.length < PredictFuture ? Fixed : cand[2]);      453                  plan_state   = (plan.length < PredictFuture ? Fixed : cand[2]);
  449                  replan_limit = tiebreak_by_turn ? min(PredictFuture, plan.length     454                  replan_limit = tiebreak_by_turn ? min(PredictFuture, plan.length
                                                                                        >   455                  lambda_getter = current_game.map.collected_lambda < cand[0].g.ma
  450          }                                                                            456          }
  451                                                                                       457  
  452          Tuple!(SubSolver, string, int) try_plan(in Game g, string prefix)            458          Tuple!(SubSolver, string, int) try_plan(in Game g, string prefix)
  453          {                                                                            459          {
  454                  SubSolver s = new SubSolver(g);                                      460                  SubSolver s = new SubSolver(g);
  455                  foreach(char c; prefix)                                              461                  foreach(char c; prefix)
  456                          s.force(c);                                                  462                          s.force(c);