@Override public PlanAlgorithm getPlanAlgoInstance() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(this.availableModes, MatsimRandom.getLocalInstance(), this.allowSwitchFromListedModesOnly ); algo.setIgnoreCarAvailability(this.ignoreCarAvailability); return algo; }
private void setRandomLegMode(final Leg leg, final boolean forbidCar) { leg.setMode(chooseModeOtherThan(leg.getMode(), forbidCar)); Route route = leg.getRoute() ; if ( route != null && route instanceof NetworkRoute) { ((NetworkRoute)route).setVehicleId(null); } }
setRandomLegMode(legs.get(rndIdx), forbidCar);
@Test public void testHandleEmptyPlan() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt, TransportMode.walk}, MatsimRandom.getRandom(),false); Plan plan = PopulationUtils.createPlan(PopulationUtils.getFactory().createPerson(Id.create(1, Person.class))); algo.run(plan); // no specific assert, but there should also be no NullPointerException or similar stuff that could theoretically happen }
@Test public void testIgnoreCarAvailability_Always() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt, TransportMode.bike}, new Random(1),false); algo.setIgnoreCarAvailability(false); Person person = PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); PersonUtils.setCarAvail(person, "always"); Plan plan = PopulationUtils.createPlan(person); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); PopulationUtils.createAndAddLeg( plan, TransportMode.pt ); PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 0)); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.car, ((Leg) plan.getPlanElements().get(1)).getMode()); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.pt, ((Leg) plan.getPlanElements().get(1)).getMode()); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.car, ((Leg) plan.getPlanElements().get(1)).getMode()); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.bike, ((Leg) plan.getPlanElements().get(1)).getMode()); }
this.changeSingleLegMode = new ChooseRandomSingleLegMode(possibleModes, rng, true);
this.changeSingleLegMode.run(plan); return;
@Test public void testHandlePlanWithoutLeg() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt, TransportMode.walk}, MatsimRandom.getRandom(),false); Plan plan = PopulationUtils.createPlan(PopulationUtils.getFactory().createPerson(Id.create(1, Person.class))); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord(0, 0)); algo.run(plan); // no specific assert, but there should also be no NullPointerException or similar stuff that could theoretically happen }
@Test public void testIgnoreCarAvailability_Never() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt, TransportMode.bike}, MatsimRandom.getRandom(),false); algo.setIgnoreCarAvailability(false); Person person = PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); PersonUtils.setCarAvail(person, "never"); Plan plan = PopulationUtils.createPlan(person); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); PopulationUtils.createAndAddLeg( plan, TransportMode.pt ); PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 0)); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.bike, ((Leg) plan.getPlanElements().get(1)).getMode()); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.pt, ((Leg) plan.getPlanElements().get(1)).getMode()); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.bike, ((Leg) plan.getPlanElements().get(1)).getMode()); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.pt, ((Leg) plan.getPlanElements().get(1)).getMode()); }
@Test public void testHandlePlan_DifferentThanLastMode() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt, TransportMode.walk}, MatsimRandom.getRandom(),false); Plan plan = PopulationUtils.createPlan(PopulationUtils.getFactory().createPerson(Id.create(1, Person.class))); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); Leg leg = PopulationUtils.createAndAddLeg( plan, TransportMode.car ); PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 0)); String oldMode = leg.getMode(); for (int i = 0; i < 10; i++) { algo.run(plan); String mode = leg.getMode(); assertTrue(!oldMode.equals(mode)); oldMode = mode; } }
@Test public void testIgnoreCarAvailability_Never_noChoice() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt}, MatsimRandom.getRandom(),false); algo.setIgnoreCarAvailability(false); Person person = PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); PersonUtils.setCarAvail(person, "never"); Plan plan = PopulationUtils.createPlan(person); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); PopulationUtils.createAndAddLeg( plan, TransportMode.pt ); PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 0)); algo.run(plan); assertEquals("unexpected leg mode in leg 1.", TransportMode.pt, ((Leg) plan.getPlanElements().get(1)).getMode()); }
@Test public void testRandomChoiceWithListedModesOnlyAndDifferentFromMode() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[]{TransportMode.pt, TransportMode.walk}, MatsimRandom.getRandom(), true); Plan plan = PopulationUtils.createPlan(PopulationUtils.getFactory().createPerson(Id.create(1, Person.class))); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); Leg leg = PopulationUtils.createAndAddLeg(plan, TransportMode.car); PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 0)); algo.run(plan); String mode = leg.getMode(); Assert.assertSame(TransportMode.car, mode); } @Test
@Test public void testRandomChoice() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt, TransportMode.walk}, MatsimRandom.getRandom(),false); Plan plan = PopulationUtils.createPlan(PopulationUtils.getFactory().createPerson(Id.create(1, Person.class))); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); Leg leg = PopulationUtils.createAndAddLeg( plan, TransportMode.car ); PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 0)); boolean foundCarMode = false; boolean foundPtMode = false; boolean foundWalkMode = false; for (int i = 0; i < 10; i++) { algo.run(plan); String mode = leg.getMode(); if (TransportMode.car.equals(mode)) { foundCarMode = true; } else if (TransportMode.pt.equals(mode)) { foundPtMode = true; } else if (TransportMode.walk.equals(mode)) { foundWalkMode = true; } else { fail("unexpected mode: " + mode); } } assertTrue("expected to find car-mode", foundCarMode); assertTrue("expected to find pt-mode", foundPtMode); assertTrue("expected to find walk-mode", foundWalkMode); }
@Test public void testRandomChoiceWithListedModesOnly() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt, TransportMode.walk}, MatsimRandom.getRandom(),true); Plan plan = PopulationUtils.createPlan(PopulationUtils.getFactory().createPerson(Id.create(1, Person.class))); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); Leg leg = PopulationUtils.createAndAddLeg( plan, TransportMode.car ); PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 0)); boolean foundCarMode = false; boolean foundPtMode = false; boolean foundWalkMode = false; for (int i = 0; i < 10; i++) { algo.run(plan); String mode = leg.getMode(); if (TransportMode.car.equals(mode)) { foundCarMode = true; } else if (TransportMode.pt.equals(mode)) { foundPtMode = true; } else if (TransportMode.walk.equals(mode)) { foundWalkMode = true; } else { fail("unexpected mode: " + mode); } } assertTrue("expected to find car-mode", foundCarMode); assertTrue("expected to find pt-mode", foundPtMode); assertTrue("expected to find walk-mode", foundWalkMode); }
@Test public void testHandlePlan_OnlySingleLegChanged() { ChooseRandomSingleLegMode algo = new ChooseRandomSingleLegMode(new String[] {TransportMode.car, TransportMode.pt, TransportMode.walk}, MatsimRandom.getRandom(),false); Plan plan = PopulationUtils.createPlan(PopulationUtils.getFactory().createPerson(Id.create(1, Person.class))); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord(0, 0)); Leg leg1 = PopulationUtils.createAndAddLeg( plan, TransportMode.car ); PopulationUtils.createAndAddActivityFromCoord(plan, "work", new Coord((double) 0, (double) 0)); Leg leg2 = PopulationUtils.createAndAddLeg( plan, TransportMode.car ); PopulationUtils.createAndAddActivityFromCoord(plan, "home", new Coord((double) 0, (double) 0)); String oldMode1 = leg1.getMode(); String oldMode2 = leg2.getMode(); for (int i = 0; i < 10; i++) { algo.run(plan); int cntChanges = 0; String mode1 = leg1.getMode(); String mode2 = leg2.getMode(); if (!mode1.equals(oldMode1)) { cntChanges++; oldMode1 = mode1; } if (!mode2.equals(oldMode2)) { cntChanges++; oldMode2 = mode2; } assertEquals(1, cntChanges); } }