anchor.diff:      for (int i = 0; i < size; i++) {
         pool[i] = new _Gene();
         pool[i].letters = new List<int>(NFACES);
  +      pool[i].reorder = new List<int>(NFACES);
       }
       return pool;
     }
  
positive.code:       prevPool = pool;
        pool = tmp;
        
        for (int i = 0; i < BEST_SELECTION; i++) {
          pool[i].letters = prevPool[i].letters;
        }
        for (int i = BEST_SELECTION; i < POOL_SIZE; i++) {
          initGene(pool[i]);
        }
        epoch++;
      }
      return new Boggle(getString(pool[0].letters), BOARD_W, BOARD_H);
    }
    
    initGene(_Gene g) {
      for (int i = 0; i < NFACES; i++) {
        var d = dice[i];
        g.letters[i] = d[random.nextInt(d.length)];
      }
      g.letters.shuffle(random);
    }
  }
  
negative.code: import 'dawg.dart';
  import 'boggle.dart';
  
  const POOL_SIZE = 500;
  const int MAX_PARENTS = 5;
  const int MAX_FLIPS = 10;
  final int NUM_PROPAGATE = min(1, (POOL_SIZE*0.01).floor());
  final int NUM_CROSSOVER = (POOL_SIZE*0.5).floor();
  final int NUM_MUTATE = (POOL_SIZE*0.3).floor();
  
  
  class _Gene {
    List<int> letters;
    List<int> reorder;
    int score;
    
    get orderedLetters => reorder.map((t) => letters[t]).toList();
  }
  
  class Grinder {
    final int BOARD_W, BOARD_H, NFACES;
  
    List<List<int>> dice;
    Dawg dawg;
  