Gather data
This commit is contained in:
@@ -50,7 +50,7 @@ public record SwedishGenerator(int[] buff) {
|
||||
public SwedishGenerator() { this(new int[8124]); }
|
||||
|
||||
// Directions for '1'..'6'
|
||||
static final nbrs_16[] OFFSETS = new nbrs_16[]{
|
||||
static final nbrs_16[] OFFSETS = new nbrs_16[]{
|
||||
null,
|
||||
// 1: up
|
||||
new nbrs_16(-1, 0, -1, 0),
|
||||
@@ -65,7 +65,7 @@ public record SwedishGenerator(int[] buff) {
|
||||
// 6: vertical down, clue is on the left of the first letter
|
||||
new nbrs_16(0, 1, 1, 0)
|
||||
};
|
||||
final static nbrs_8[] nbrs8 = new nbrs_8[]{
|
||||
final static nbrs_8[] nbrs8 = new nbrs_8[]{
|
||||
new nbrs_8(-1, -1),
|
||||
new nbrs_8(-1, 0),
|
||||
new nbrs_8(-1, 1),
|
||||
@@ -75,7 +75,7 @@ public record SwedishGenerator(int[] buff) {
|
||||
new nbrs_8(1, 0),
|
||||
new nbrs_8(1, 1)
|
||||
};
|
||||
static final SwedishGenerator.nbrs_8[] nbrs4 = new nbrs_8[]{
|
||||
static final nbrs_8[] nbrs4 = new nbrs_8[]{
|
||||
new nbrs_8(-1, 0),
|
||||
new nbrs_8(1, 0),
|
||||
new nbrs_8(0, -1),
|
||||
@@ -91,7 +91,10 @@ public record SwedishGenerator(int[] buff) {
|
||||
IntList[] intListBuffer,
|
||||
long[] undoBuffer) {
|
||||
|
||||
public Context() { this(new int[SIZE], new int[SIZE], new int[SIZE], new int[SIZE], new BitSet(128), new char[MAX_WORD_LENGTH], new IntList[MAX_WORD_LENGTH], new long[2048]); }
|
||||
public Context() {
|
||||
this(new int[SIZE], new int[SIZE], new int[SIZE], new int[SIZE], new BitSet(128), new char[MAX_WORD_LENGTH], new IntList[MAX_WORD_LENGTH],
|
||||
new long[2048]);
|
||||
}
|
||||
void setPatter(char[] chars) { System.arraycopy(chars, 0, this.pattern, 0, chars.length); }
|
||||
}
|
||||
|
||||
@@ -284,7 +287,7 @@ public record SwedishGenerator(int[] buff) {
|
||||
return Arrays.copyOf(buff, k);
|
||||
}
|
||||
|
||||
SwedishGenerator.CandidateInfo candidateInfoForPattern(Context ctx, DictEntry entry, int len) {
|
||||
CandidateInfo candidateInfoForPattern(Context ctx, DictEntry entry, int len) {
|
||||
var pattern = ctx.pattern;
|
||||
var listBuffer = ctx.intListBuffer;
|
||||
var listCount = 0;
|
||||
@@ -591,6 +594,61 @@ public record SwedishGenerator(int[] buff) {
|
||||
}
|
||||
|
||||
public Grid generateMask(Rng rng, int[] lenCounts, int popSize, int gens, boolean verbose) {
|
||||
class GridAndFit {
|
||||
|
||||
Grid grid;
|
||||
Long fite;
|
||||
GridAndFit(Grid grid) { this.grid = grid; }
|
||||
long fit() {
|
||||
if (fite == null) this.fite = maskFitness(grid, lenCounts);
|
||||
return this.fite;
|
||||
}
|
||||
}
|
||||
if (verbose) System.out.println("generateMask init pop: " + popSize);
|
||||
var pop = new ArrayList<GridAndFit>();
|
||||
for (var i = 0; i < popSize; i++) {
|
||||
pop.add(new GridAndFit(hillclimb(rng, randomMask(rng), lenCounts, 180)));
|
||||
}
|
||||
|
||||
for (var gen = 0; gen < gens; gen++) {
|
||||
if (Thread.currentThread().isInterrupted()) break;
|
||||
var children = new ArrayList<GridAndFit>();
|
||||
var pairs = Math.max(popSize, (int) Math.floor(popSize * 1.5));
|
||||
|
||||
for (var k = 0; k < pairs; k++) {
|
||||
var p1 = pop.get(rng.randint(0, pop.size() - 1));
|
||||
var p2 = pop.get(rng.randint(0, pop.size() - 1));
|
||||
var child = crossover(rng, p1.grid, p2.grid);
|
||||
children.add(new GridAndFit(hillclimb(rng, child, lenCounts, 70)));
|
||||
}
|
||||
|
||||
pop.addAll(children);
|
||||
pop.sort(Comparator.comparingLong(GridAndFit::fit));
|
||||
|
||||
var next = new ArrayList<GridAndFit>();
|
||||
for (var cand : pop) {
|
||||
if (next.size() >= popSize) break;
|
||||
var ok = true;
|
||||
for (var kept : next) {
|
||||
if (cand.grid.similarity(kept.grid) > 0.92) {
|
||||
ok = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ok) next.add(cand);
|
||||
}
|
||||
pop = next;
|
||||
|
||||
if (verbose && gen % 10 == 0) {
|
||||
var bestF = pop.get(0).fit();
|
||||
System.out.println(" gen " + gen + "/" + gens + " bestFitness=" + bestF);
|
||||
}
|
||||
}
|
||||
|
||||
pop.sort(Comparator.comparingLong(GridAndFit::fit));
|
||||
return pop.get(0).grid;
|
||||
}
|
||||
public Grid generateMask2(Rng rng, int[] lenCounts, int popSize, int gens, boolean verbose) {
|
||||
if (verbose) System.out.println("generateMask init pop: " + popSize);
|
||||
var pop = new ArrayList<Grid>();
|
||||
|
||||
@@ -709,7 +767,7 @@ public record SwedishGenerator(int[] buff) {
|
||||
var grid = mask.deepCopyGrid();
|
||||
var slots = extractSlots(grid);
|
||||
|
||||
var used = new BitSet();
|
||||
var used = new BitSet(SIZE << 1);
|
||||
var assigned = new HashMap<Integer, Lemma>();
|
||||
|
||||
var ctx = CTX.get();
|
||||
|
||||
Reference in New Issue
Block a user