seed parked cars per building, not per spot

This commit is contained in:
Dustin Carlino 2018-10-17 09:50:33 -07:00
parent 7919b0bd8d
commit 299c7bdb2f
3 changed files with 37 additions and 27 deletions

View File

@ -116,7 +116,8 @@ fn edit_scenario(map: &Map, scenario: &mut Scenario, mut wizard: WrappedWizard)
if wizard.choose_string("What kind of edit?", vec![seed_parked, spawn])? == seed_parked { if wizard.choose_string("What kind of edit?", vec![seed_parked, spawn])? == seed_parked {
scenario.seed_parked_cars.push(SeedParkedCars { scenario.seed_parked_cars.push(SeedParkedCars {
neighborhood: choose_neighborhood(map, &mut wizard, "Seed parked cars in what area?")?, neighborhood: choose_neighborhood(map, &mut wizard, "Seed parked cars in what area?")?,
percent_to_fill: wizard.input_percent("What percent of parking spots to populate?")?, percent_buildings_with_car: wizard
.input_percent("What percent of buildings have 1 parked car nearby?")?,
}); });
Some(()) Some(())
} else { } else {

View File

@ -29,7 +29,8 @@ pub struct SpawnOverTime {
#[derive(Clone, Serialize, Deserialize, Debug)] #[derive(Clone, Serialize, Deserialize, Debug)]
pub struct SeedParkedCars { pub struct SeedParkedCars {
pub neighborhood: String, pub neighborhood: String,
pub percent_to_fill: f64, // TODO Ask for more detail -- chances of a building have 0, 1, 2, 3, ... cars
pub percent_buildings_with_car: f64,
} }
#[derive(Clone, Serialize, Deserialize, Debug)] #[derive(Clone, Serialize, Deserialize, Debug)]
@ -98,7 +99,7 @@ impl Scenario {
sim.seed_parked_cars( sim.seed_parked_cars(
neighborhoods[&s.neighborhood].find_matching_lanes(map), neighborhoods[&s.neighborhood].find_matching_lanes(map),
&bldgs_per_neighborhood[&s.neighborhood], &bldgs_per_neighborhood[&s.neighborhood],
s.percent_to_fill, s.percent_buildings_with_car,
); );
} }

View File

@ -209,24 +209,30 @@ impl Spawner {
// This happens immediately; it isn't scheduled. // This happens immediately; it isn't scheduled.
pub fn seed_parked_cars( pub fn seed_parked_cars(
&mut self, &mut self,
percent_capacity_to_fill: f64, percent_buildings_with_one_car: f64,
in_lanes: Vec<LaneID>, in_lanes: Vec<LaneID>,
owner_buildings: &Vec<BuildingID>, owner_buildings: &Vec<BuildingID>,
parking_sim: &mut ParkingSimState, parking_sim: &mut ParkingSimState,
base_rng: &mut XorShiftRng, base_rng: &mut XorShiftRng,
) { ) {
assert!(percent_capacity_to_fill >= 0.0 && percent_capacity_to_fill <= 1.0); assert!(percent_buildings_with_one_car >= 0.0 && percent_buildings_with_one_car <= 1.0);
let mut total_capacity = 0; // TODO This is probably temporary.
let mut new_cars = 0; let mut all_open_spots: Vec<ParkingSpot> = Vec::new();
// Fork a new RNG for each candidate lane. This keeps things more deterministic, invariant
// of lane edits.
for l in in_lanes.into_iter() { for l in in_lanes.into_iter() {
let mut rng = fork_rng(base_rng); all_open_spots.extend(parking_sim.get_free_spots(l));
}
fork_rng(base_rng).shuffle(&mut all_open_spots);
let total_spots = all_open_spots.len();
for spot in parking_sim.get_free_spots(l) { let mut new_cars = 0;
total_capacity += 1; for b in owner_buildings {
if rng.gen_bool(percent_capacity_to_fill) { if base_rng.gen_bool(percent_buildings_with_one_car) {
// Pick a parking spot for this building.
// TODO Prefer spots closer to the building
let spot = all_open_spots
.pop()
.expect("No available parking spots left to seed");
new_cars += 1; new_cars += 1;
let car = CarID(self.car_id_counter); let car = CarID(self.car_id_counter);
// TODO since spawning applies during the next step, lots of stuff breaks without // TODO since spawning applies during the next step, lots of stuff breaks without
@ -234,16 +240,18 @@ impl Spawner {
parking_sim.add_parked_car(ParkedCar::new( parking_sim.add_parked_car(ParkedCar::new(
car, car,
spot, spot,
Vehicle::generate_typical_car(car, &mut rng), Vehicle::generate_typical_car(car, base_rng),
Some(*rng.choose(owner_buildings).unwrap()), Some(*b),
)); ));
self.car_id_counter += 1; self.car_id_counter += 1;
} }
} }
}
info!( info!(
"Seeded {} of {} parking spots with cars", "Seeded {} of {} parking spots with cars, leaving {} buildings without cars",
new_cars, total_capacity new_cars,
total_spots,
owner_buildings.len() - new_cars
); );
} }