function improve(input, color) {
let changed = false;
let precincts = _.cloneDeep(input.precincts);
for (let i = 0; i < random(16, 32)(); i++) {
let precincts0 = _.cloneDeep(precincts);
let districts0 = d3.group(precincts0, (p) => p.district);
let choice1 = random(1, 9)();
let district1 = districts0.get(choice1);
let choice2 = random(choice1 + 1, 10)();
let district2 = districts0.get(choice2);
let border12 = get_border(choice1, choice2, precincts0);
if (border12.length > 0) {
let border21 = get_border(choice2, choice1, precincts0);
let p1 = border12[random(0, border12.length)()];
p1.district = choice2;
let p2 = border21[random(0, border21.length)()];
p2.district = choice1;
let new_district1 = precincts0.filter((o) => o.district == choice1);
let rest1 = set_difference(precincts0, new_district1);
let test1;
try {
test1 = get15([new_district1[0]], rest1, precincts0).length == 15;
} catch {
test1 = false;
}
let new_district2 = precincts0.filter((o) => o.district == choice2);
let rest2 = set_difference(precincts0, new_district2);
let test2;
try {
test2 = get15([new_district2[0]], rest2, precincts0).length == 15;
} catch {
test2 = false;
}
if (test1 && test2) {
precincts = precincts0;
// atry.push(precincts);
}
}
}
let groups = d3.group(precincts, (p) => p.district);
let purple_cnt = 0;
let yellow_cnt = 0;
let minority_cnt = 0;
groups.forEach(function (g) {
if (g.filter((p) => p.minority).length > 7) {
minority_cnt++;
}
let gg = d3.group(g, (p) => p.color);
let p = gg.get("purple");
let y = gg.get("yellow");
if (!y) {
purple_cnt++;
} else if (p && p.length > y.length) {
purple_cnt++;
} else {
yellow_cnt++;
}
});
let original_score, new_score;
// let idx = color == "purple" ? 1 : 2;
if (minority_cnt >= 2) {
// original_score = score(results[idx].precincts, color);
// new_score = score(precincts, color);
// if (original_score < new_score) {
let indicator1 = color == "purple" ? input.purple_cnt : input.yellow_cnt;
let indicator2 = color == "purple" ? purple_cnt : yellow_cnt;
if (indicator1 < indicator2) {
// results[idx].precincts = precincts;
// results[idx].purple_cnt = purple_cnt;
// results[idx].yellow_cnt = yellow_cnt;
// results[idx].minority_cnt = minority_cnt;
changed = true;
}
}
if (changed) {
return {
purple_cnt,
yellow_cnt,
minority_cnt,
precincts
};
} else {
return input;
}
// return [choice1, choice2, district1, district2];
function get_border(i, j, precints_in) {
let groups = d3.group(precints_in, (p) => p.district);
let jids = groups.get(j).map((p) => p.id);
return groups
.get(i)
.filter((p) => _.intersection(p.neighbors, jids).length > 0);
}
}