Add an option to merge first before moving single houses
(seems to be fairly useless and it's slower)
This commit is contained in:
parent
c6676c6681
commit
4b19801594
3 changed files with 28 additions and 19 deletions
|
@ -52,7 +52,7 @@ fn main() {
|
|||
//populate_from_saved_layout(&mut layout, &best_layout);
|
||||
//eprintln!("Finished loading DB layout ID {}, price: {}, houses: {}", best_layout.id(), layout.price(), layout.houses().len());
|
||||
|
||||
optimization::iterate_improvements(&mut layout, &mut rng, true);
|
||||
optimization::iterate_improvements(&mut layout, &mut rng, true, START_WITH_MERGE);
|
||||
dump_layout(&layout, &mut best_price, seed);
|
||||
db.add_layout(&layout.houses(), true).expect("Failed to insert into DB");
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ pub enum RectangleSearchError {
|
|||
Unsatisfiable,
|
||||
}
|
||||
|
||||
pub fn iterate_improvements(mut layout: &mut HouseLayout, mut rng: &mut StdRng, print_progress: bool) {
|
||||
pub fn iterate_improvements(mut layout: &mut HouseLayout, mut rng: &mut StdRng, print_progress: bool, merge_first: bool) -> bool {
|
||||
#[derive(Eq, PartialEq)]
|
||||
enum LastStep {
|
||||
None,
|
||||
|
@ -16,17 +16,25 @@ pub fn iterate_improvements(mut layout: &mut HouseLayout, mut rng: &mut StdRng,
|
|||
MergingPairs,
|
||||
}
|
||||
|
||||
let mut improved = false;
|
||||
|
||||
let mut first_iteration = true;
|
||||
let mut last_improved_step = LastStep::None;
|
||||
loop {
|
||||
if last_improved_step == LastStep::MovingIndividual { break; }
|
||||
if print_progress {
|
||||
eprintln!("Starting moving individual houses...");
|
||||
}
|
||||
if improve_move_individual_houses(&mut layout, &mut rng) {
|
||||
last_improved_step = LastStep::MovingIndividual;
|
||||
}
|
||||
if print_progress {
|
||||
eprintln!("Finished moving individual houses...");
|
||||
if merge_first && first_iteration {
|
||||
first_iteration = false;
|
||||
} else {
|
||||
if last_improved_step == LastStep::MovingIndividual { break; }
|
||||
if print_progress {
|
||||
eprintln!("Starting moving individual houses...");
|
||||
}
|
||||
if improve_move_individual_houses(&mut layout, &mut rng) {
|
||||
last_improved_step = LastStep::MovingIndividual;
|
||||
improved = true;
|
||||
}
|
||||
if print_progress {
|
||||
eprintln!("Finished moving individual houses...");
|
||||
}
|
||||
}
|
||||
|
||||
if last_improved_step == LastStep::MergingPairs { break; }
|
||||
|
@ -35,18 +43,15 @@ pub fn iterate_improvements(mut layout: &mut HouseLayout, mut rng: &mut StdRng,
|
|||
}
|
||||
if improve_merge_pairwise(&mut layout, print_progress) {
|
||||
last_improved_step = LastStep::MergingPairs;
|
||||
improved = true;
|
||||
}
|
||||
if print_progress {
|
||||
eprintln!("Finished pairwise house merge");
|
||||
}
|
||||
//eprintln!("Starting pairwise house move...");
|
||||
//if optimization::improve_move_houses_pairwise(&mut layout) {
|
||||
// dump_layout(&layout, &mut best_price, seed);
|
||||
// improved = true;
|
||||
//}
|
||||
//eprintln!("Finished pairwise house move");
|
||||
if last_improved_step == LastStep::None { break; }
|
||||
}
|
||||
|
||||
improved
|
||||
}
|
||||
|
||||
fn get_valid_move_rectangle_multiple(layout: &HouseLayout, houses: &Vec<House>) -> Result<Rectangle, RectangleSearchError> {
|
||||
|
@ -229,6 +234,8 @@ pub fn improve_merge_pairwise(layout: &mut HouseLayout, print_progress: bool) ->
|
|||
// We instead go through the houses repeatedly and remember which pairs we have already
|
||||
// tried by hashing their values because they can and do move throughout the layout Vec
|
||||
// as it's being modified.
|
||||
// TODO: This may lead to some pairs still being mergeable thanks to another merge
|
||||
// that happened before.
|
||||
let mut checked = HashSet::new();
|
||||
|
||||
let mut loop_improved = false;
|
||||
|
@ -277,7 +284,9 @@ pub fn improve_merge_pairwise(layout: &mut HouseLayout, print_progress: bool) ->
|
|||
}
|
||||
}
|
||||
}
|
||||
Err(RectangleSearchError::Useless) => eprintln!("Found useless pair of houses, not solving!"),
|
||||
Err(RectangleSearchError::Useless) => {
|
||||
//eprintln!("Found useless pair of houses, not solving!")
|
||||
},
|
||||
Err(RectangleSearchError::Unsatisfiable) => {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -113,7 +113,7 @@ fn main() {
|
|||
//eprintln!("Starting random population {}", i);
|
||||
population::populate_random(&mut layout, &mut rng);
|
||||
//eprintln!("Finished random init {}, price: {}, houses: {}", i, layout.price(), layout.houses().len());
|
||||
optimization::iterate_improvements(&mut layout, &mut rng, false);
|
||||
optimization::iterate_improvements(&mut layout, &mut rng, false, false);
|
||||
//eprintln!("Finished iterated improvements {}, price: {}, houses: {}", i, layout.price(), layout.houses().len());
|
||||
layout.houses().clone()
|
||||
}));
|
||||
|
|
Loading…
Reference in a new issue