@Override
 public double getLinkMinimumTravelDisutility(Link link) {
   if (this.marginalUtlOfDistance == 0.0) {
     return (link.getLength() / link.getFreespeed()) * this.travelCostFactor;
   }
   return (link.getLength() / link.getFreespeed()) * this.travelCostFactor
       - this.marginalUtlOfDistance * link.getLength();
 }
 @Override
 public double getLinkTravelDisutility(
     final Link link, final double time, final Person person, final Vehicle vehicle) {
   if (this.marginalUtlOfDistance == 0.0) {
     return (link.getLength() / link.getFreespeed(time)) * this.travelCostFactor;
   }
   return (link.getLength() / link.getFreespeed(time)) * this.travelCostFactor
       - this.marginalUtlOfDistance * link.getLength();
 }
 private static double calculateFreespeedTravelTimeToNode(Network network, Path path, Node node) {
   double travelTime = 0.0;
   for (Link l : path.links) {
     travelTime += l.getLength() / l.getFreespeed();
   }
   return travelTime;
 }
  private void computeDelays(AfterMobsimEvent event) {

    TravelTime travelTime = event.getServices().getLinkTravelTimes();
    int timeBinSize =
        this.congestionInfo.getScenario().getConfig().travelTimeCalculator().getTraveltimeBinSize();

    for (Link link : this.congestionInfo.getScenario().getNetwork().getLinks().values()) {

      Map<Integer, Double> time2avgDelay = new HashMap<>();
      double freespeedTravelTime = link.getLength() / link.getFreespeed();

      int timeBinCounter = 0;
      for (int endTime = timeBinSize;
          endTime
              <= this.congestionInfo.getScenario().getConfig().travelTimeCalculator().getMaxTime();
          endTime = endTime + timeBinSize) {
        double avgDelay =
            travelTime.getLinkTravelTime(link, (endTime - timeBinSize / 2.), null, null)
                - freespeedTravelTime;
        time2avgDelay.put(timeBinCounter, avgDelay);
        timeBinCounter++;
      }

      if (this.congestionInfo.getlinkInfos().containsKey(link.getId())) {
        this.congestionInfo.getlinkInfos().get(link.getId()).setTime2avgDelay(time2avgDelay);
      } else {
        LinkInfo linkInfo = new LinkInfo(link.getId());
        linkInfo.setTime2avgDelay(time2avgDelay);
        this.congestionInfo.getlinkInfos().put(link.getId(), linkInfo);
      }
    }
  }
Пример #5
0
 private Path convertNodeListtoPath(List<Node> nodelist, List<Link> linklist) {
   double traveltime = 0;
   for (Link l : linklist) {
     traveltime += l.getLength() / l.getFreespeed();
   }
   return new Path(nodelist, linklist, traveltime, 0);
 }
  private SimpleFeature createFeature(
      Link link,
      GeometryFactory geofac,
      PolygonFeatureFactory factory,
      List<CountSimComparison> countSimLinkLeaveComparisonList,
      Double linkDelay1,
      Double linkDelay2) {
    Coordinate[] coords = PolygonFeatureGenerator.createPolygonCoordsForLink(link, 20.0);
    Object[] attribs = new Object[10 + 5 * (numberOfHours + 1) + 1];
    attribs[0] = link.getId().toString();
    attribs[1] = link.getFromNode().getId().toString();
    attribs[2] = link.getToNode().getId().toString();
    attribs[3] = link.getLength();
    attribs[4] = link.getFreespeed();
    attribs[5] = link.getCapacity();
    attribs[6] = link.getNumberOfLanes();
    attribs[7] = link.getNumberOfLanes();
    attribs[8] = ((LinkImpl) link).getType();
    // total delay caused by the link
    attribs[9] = linkDelay1;
    attribs[10] = linkDelay2;

    int i = 11;

    double sumAbsLinkLeaveDif = 0.0;
    double absLinkLeaveDif = 0.0;
    double sumAbsLinkLeaveRun1 = 0.0;
    double sumAbsLinkLeaveRun2 = 0.0;
    for (CountSimComparison csc : countSimLinkLeaveComparisonList) {
      // analyze only the selected time period
      if (csc.getHour() > firstHour && csc.getHour() <= lastHour) {
        // csc contains the number of link leave events in the time period between csc.getHour()-1
        // and csc.getHour()
        absLinkLeaveDif = csc.getSimulationValue() - csc.getCountValue();

        attribs[i] = csc.getCountValue();
        attribs[i + numberOfHours + 1] = csc.getSimulationValue();
        attribs[i + 2 * (numberOfHours + 1)] = absLinkLeaveDif;
        attribs[i + 3 * (numberOfHours + 1)] =
            (absLinkLeaveDif / link.getCapacity()) * 100; // in percent
        attribs[i + 4 * (numberOfHours + 1)] = absLinkLeaveDif * link.getLength();

        sumAbsLinkLeaveDif += absLinkLeaveDif;
        sumAbsLinkLeaveRun1 += csc.getCountValue();
        sumAbsLinkLeaveRun2 += csc.getSimulationValue();
        i++;
      }
    }
    attribs[10 + numberOfHours + 1] = sumAbsLinkLeaveRun1;
    attribs[10 + 2 * (numberOfHours + 1)] = sumAbsLinkLeaveRun2;
    attribs[10 + 3 * (numberOfHours + 1)] =
        sumAbsLinkLeaveDif; // C: meanAbsLinkLeaveDif = sumAbsLinkLeaveDif/5
    // mean (error/capacity) in percent per hour, i.e flow difference of the morning peak divided by
    // the maximal link capacity in this time period
    attribs[10 + 4 * (numberOfHours + 1)] = (sumAbsLinkLeaveDif / (link.getCapacity() * 5)) * 100;
    attribs[10 + 5 * (numberOfHours + 1)] =
        sumAbsLinkLeaveDif * link.getLength(); // alternative: meanAbsLinkLeaveDif*link.getLength();

    return factory.createPolygon(coords, attribs, link.getId().toString());
  }
  private int addStopOnLink(Link link) {
    if (link == null) {
      return 0;
    }

    if (linkToNodeNotInServiceArea(link)) {
      return 0;
    }

    if (linkHasAlreadyAFormalPTStopFromTheGivenSchedule(link)) {
      return 0;
    }

    if (link.getFreespeed() >= this.pConfigGroup.getSpeedLimitForStops()) {
      return 0;
    }

    if (this.linkId2StopFacilityMap.get(link.getId()) != null) {
      log.warn("Link " + link.getId() + " has already a stop. This should not happen. Check code.");
      return 0;
    }

    Id<TransitStopFacility> stopId =
        Id.create(this.pConfigGroup.getPIdentifier() + link.getId(), TransitStopFacility.class);
    TransitStopFacility stop =
        this.transitSchedule
            .getFactory()
            .createTransitStopFacility(stopId, link.getToNode().getCoord(), false);
    stop.setLinkId(link.getId());
    this.transitSchedule.addStopFacility(stop);
    return 1;
  }
  public static void main(String[] args) {
    String path2MATSimNetwork = args[0];
    MutableScenario scenario =
        (MutableScenario) ScenarioUtils.createScenario(ConfigUtils.createConfig());
    MatsimNetworkReader networkReader = new MatsimNetworkReader(scenario.getNetwork());
    networkReader.readFile(path2MATSimNetwork);
    Network network = scenario.getNetwork();
    String speedFactor = args[1];
    String capacityFactor = args[2];
    radius = Integer.parseInt(args[3]);

    final BufferedWriter out = IOUtils.getBufferedWriter(args[4]);
    try {
      // Header
      out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
      out.newLine();
      out.write(
          "<networkChangeEvents xmlns=\"http://www.matsim.org/files/dtd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.matsim.org/files/dtd http://www.matsim.org/files/dtd/networkChangeEvents.xsd\">");
      out.newLine();
      // reduce capacity and speed:
      out.write("    <networkChangeEvent startTime=\"07:00:00\">");
      out.newLine();
      for (Link link : network.getLinks().values()) {
        if (isLinkAffected(link)) {
          out.write("        <link refId=\"" + link.getId().toString() + "\"/>");
          out.newLine();
        }
      }
      out.write("        <flowCapacity type=\"scaleFactor\" value=\"" + capacityFactor + "\"/>");
      out.newLine();
      out.write("        <freespeed type=\"scaleFactor\" value=\"" + speedFactor + "\"/>");
      out.newLine();
      out.write("    </networkChangeEvent>");
      out.newLine();
      // reset capacity and speed:
      for (Link link : network.getLinks().values()) {
        if (isLinkAffected(link)) {
          out.write("    <networkChangeEvent startTime=\"09:00:00\">");
          out.newLine();
          out.write("        <link refId=\"" + link.getId().toString() + "\"/>");
          out.newLine();
          out.write(
              "        <flowCapacity type=\"absolute\" value=\"" + link.getCapacity() + "\"/>");
          out.newLine();
          out.write("        <freespeed type=\"absolute\" value=\"" + link.getFreespeed() + "\"/>");
          out.newLine();
          out.write("    </networkChangeEvent>");
          out.newLine();
        }
      }
      // Footer:
      out.write("</networkChangeEvents>");
      out.newLine();

      out.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
Пример #9
0
  public static void main(String[] args) {
    MutableScenario scenario =
        (MutableScenario) ScenarioUtils.createScenario(ConfigUtils.createConfig());
    MatsimNetworkReader networkReader = new MatsimNetworkReader(scenario.getNetwork());
    networkReader.readFile(args[0]);

    int numberOfLinks = 0;
    double length = 0.0;
    double length1 = 0.0;
    double length2 = 0.0;
    double length3 = 0.0;
    Node previousNode1 = null;
    Node previousNode2 = null;
    for (Link l : scenario.getNetwork().getLinks().values()) {
      if (previousNode1 != null) {

        if (l.getFromNode().getId() != previousNode2.getId()
            && l.getToNode().getId() != previousNode1.getId()) {
          numberOfLinks++;
          length += l.getLength();
          if (l.getFreespeed() > 24.99) {
            length1 += l.getLength();
          } else if (l.getFreespeed() < 13.88) {
            length3 += l.getLength();

          } else length2 += l.getLength();
        }
      } else {
        numberOfLinks++;
        length += l.getLength();
        if (l.getFreespeed() > 24.99) {
          length1 += l.getLength();
        } else if (l.getFreespeed() < 13.88) {
          length3 += l.getLength();

        } else length2 += l.getLength();
      }
      previousNode1 = l.getFromNode();
      previousNode2 = l.getToNode();
    }
    System.out.println(numberOfLinks);
    System.out.println(length / 1000);
    System.out.println(length1 / 1000);
    System.out.println(length2 / 1000);
    System.out.println(length3 / 1000);
  }
Пример #10
0
 public void add() {
   List<Link> links = ((BusLaneAdderPanel) layersPanels.get(PanelIds.ONE)).getLinks();
   Node prevNode = links.get(0).getFromNode();
   for (Link link : links)
     if (!link.getAllowedModes().contains("bus")) {
       exitSave();
       JOptionPane.showMessageDialog(this, "Wrong path, network saved");
     }
   for (int i = 0; i < links.size(); i++) {
     Link link = links.get(i);
     Node node = null;
     if (link.getNumberOfLanes() == 1) {
       Set<String> modes = new HashSet<String>();
       modes.add("bus");
       link.setAllowedModes(modes);
       node = link.getToNode();
     } else {
       Node oldNode = link.getToNode();
       if (i == links.size() - 1 || oldNode.getInLinks().size() + oldNode.getOutLinks().size() > 2)
         node = oldNode;
       else {
         node =
             network
                 .getFactory()
                 .createNode(
                     Id.createNodeId("fl" + oldNode.getId().toString()), oldNode.getCoord());
         network.addNode(node);
       }
       LinkImpl newLink =
           (LinkImpl)
               network
                   .getFactory()
                   .createLink(Id.createLinkId("fl" + link.getId().toString()), prevNode, node);
       Set<String> modes = new HashSet<String>();
       modes.add("car");
       newLink.setAllowedModes(modes);
       newLink.setCapacity(link.getCapacity());
       newLink.setFreespeed(link.getFreespeed());
       newLink.setLength(link.getLength());
       newLink.setNumberOfLanes(link.getNumberOfLanes() - 1);
       newLink.setOrigId(((LinkImpl) link).getOrigId());
       newLink.setType(((LinkImpl) link).getType());
       network.addLink(newLink);
       Set<String> modes2 = new HashSet<String>();
       modes2.add("bus");
       link.setAllowedModes(modes2);
       link.setCapacity(900);
       link.setNumberOfLanes(1);
     }
     prevNode = node;
   }
   ((BusLaneAdderPanel) layersPanels.get(PanelIds.ONE)).clearSelection();
 }
  private TransitRoute createRoute(
      Id<TransitRoute> routeID, TransitStopFacility startStop, TransitStopFacility endStop) {

    FreespeedTravelTimeAndDisutility tC = new FreespeedTravelTimeAndDisutility(-6.0, 0.0, 0.0);
    LeastCostPathCalculator routingAlgo = new Dijkstra(this.net, tC, tC);

    Node startNode = this.net.getLinks().get(startStop.getLinkId()).getToNode();
    Node endNode = this.net.getLinks().get(endStop.getLinkId()).getFromNode();

    int startTime = 0 * 3600;

    // get Route
    Path path = routingAlgo.calcLeastCostPath(startNode, endNode, startTime, null, null);
    NetworkRoute route = new LinkNetworkRouteImpl(startStop.getLinkId(), endStop.getLinkId());
    route.setLinkIds(
        startStop.getLinkId(), NetworkUtils.getLinkIds(path.links), endStop.getLinkId());

    // get stops at Route
    List<TransitRouteStop> stops = new LinkedList<TransitRouteStop>();

    // first stop
    TransitRouteStop routeStop =
        this.tS.getFactory().createTransitRouteStop(startStop, startTime, startTime);
    stops.add(routeStop);

    // additional stops
    for (Link link : path.links) {
      startTime += link.getLength() / link.getFreespeed();
      if (this.tS.getFacilities().get(link.getId()) == null) {
        continue;
      }
      routeStop =
          this.tS
              .getFactory()
              .createTransitRouteStop(
                  this.tS.getFacilities().get(link.getId()), startTime, startTime);
      stops.add(routeStop);
    }

    // last stop
    startTime +=
        this.net.getLinks().get(endStop.getLinkId()).getLength()
            / this.net.getLinks().get(endStop.getLinkId()).getFreespeed();
    routeStop = this.tS.getFactory().createTransitRouteStop(endStop, startTime, startTime);
    stops.add(routeStop);

    // register departure
    TransitRoute transitRoute =
        this.tS.getFactory().createTransitRoute(routeID, route, stops, "pt");

    return transitRoute;
  }
Пример #12
0
 public static void main(String[] args) {
   Scenario scenario = ScenarioUtils.createScenario(ConfigUtils.createConfig());
   String basedir = "C:/Users/Joschka/Documents/shared-svn/projects/vw_rufbus/scenario/input/";
   new MatsimNetworkReader(scenario.getNetwork()).readFile(basedir + "network.xml");
   for (Link link : scenario.getNetwork().getLinks().values()) {
     double speed = link.getFreespeed();
     if (speed < 10) link.setFreespeed(0.75 * speed);
     else if (speed < 20) link.setFreespeed(0.7 * speed);
     else if (speed < 30) {
       if (link.getNumberOfLanes() < 2) link.setFreespeed(0.7 * speed);
       else link.setFreespeed(0.75 * speed);
     } else link.setFreespeed(0.7 * speed);
   }
   new NetworkWriter(scenario.getNetwork()).write(basedir + "networks.xml");
 }
Пример #13
0
  public double getEnergyConsumptionForLinkInJoule(
      Vehicle vehicle, double timeSpentOnLink, Link link) {
    double speedOfVehicleOnLinkInKmPerHour =
        Vehicle.getAverageSpeedOfVehicleOnLinkInMetersPerSecond(timeSpentOnLink, link)
            / 1000
            * 3600;

    if (speedOfVehicleOnLinkInKmPerHour > maxAllowedSpeedInNetworkInKmPerHour) {
      return 0;
    }

    return energyConsumptionTable.getEnergyConsumptionInJoule(
        vehicle.getVehicleClassId(),
        speedOfVehicleOnLinkInKmPerHour,
        link.getFreespeed(),
        link.getLength());
  }
Пример #14
0
  private void assignProps(Collection<Link> links, Link link) {
    double capacity = 0;
    double freespeed = 0;
    double lanes = 0;
    for (Link origLink : links) {
      capacity += origLink.getCapacity();
      freespeed = Math.max(freespeed, origLink.getFreespeed());
      lanes += origLink.getNumberOfLanes();
    }

    link.setCapacity(capacity);
    link.setFreespeed(freespeed);
    link.setNumberOfLanes(lanes);
    link.setLength(
        NetworkUtils.getEuclideanDistance(
            link.getFromNode().getCoord(), link.getToNode().getCoord()));
  }
Пример #15
0
  @Override
  public double getLinkMinimumTravelDisutility(Link link) {
    double constantPerforming = -6.0 / 3600.0; // this is a hack! TODO: take from config
    double marginalUtilityOfTime_util_s =
        params.getScoringParameters(null).modeParams.get(this.mode).marginalUtilityOfTraveling_s
            + constantPerforming;
    double marginalUtilityOfDistance_util_m =
        params.getScoringParameters(null).modeParams.get(this.mode).marginalUtilityOfDistance_m;
    double monetaryDistanceRate =
        params.getScoringParameters(null).modeParams.get(this.mode).monetaryDistanceCostRate;
    double marginalUtilityOfMoney = params.getScoringParameters(null).marginalUtilityOfMoney;
    final double marginalUtilityOfDistanceFromMoney_util_m =
        monetaryDistanceRate * marginalUtilityOfMoney; // [money/m]*[util/money]

    // Needs to be positive:
    return -1.0
        * (marginalUtilityOfTime_util_s * (link.getLength() / link.getFreespeed())
            + (marginalUtilityOfDistance_util_m + marginalUtilityOfDistanceFromMoney_util_m)
                * link.getLength());
  }
Пример #16
0
  public void convertNet2Shape(Network net, String crs, String outputFile) {

    SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
    typeBuilder.setCRS(MGC.getCRS(crs));
    typeBuilder.setName("link feature");
    typeBuilder.add("Line String", LineString.class);
    typeBuilder.add("id", String.class);
    typeBuilder.add("length", Double.class);
    typeBuilder.add("freespeed", Double.class);
    typeBuilder.add("capacity", Double.class);
    SimpleFeatureBuilder builder = new SimpleFeatureBuilder(typeBuilder.buildFeatureType());

    List<SimpleFeature> features = new ArrayList<SimpleFeature>();

    for (Link link : net.getLinks().values()) {

      Coord from = link.getFromNode().getCoord();
      Coord to = link.getToNode().getCoord();

      SimpleFeature feature =
          builder.buildFeature(
              link.getId().toString(),
              new Object[] {
                new GeometryFactory()
                    .createLineString(
                        new Coordinate[] {MGC.coord2Coordinate(from), MGC.coord2Coordinate(to)}),
                link.getId().toString(),
                link.getLength(),
                link.getFreespeed(),
                link.getCapacity()
              });
      features.add(feature);
    }

    ShapeFileWriter.writeGeometries(features, outputFile);
  }
Пример #17
0
  public static void main(String[] args) {
    // Input file
    String networkFile = "D:/Workspace/container/demand/input/iv_counts/network.xml";

    // Get network, which is needed to calculate distances
    Config config = ConfigUtils.createConfig();
    Scenario scenario = ScenarioUtils.createScenario(config);
    MatsimNetworkReader networkReader = new MatsimNetworkReader(scenario);
    networkReader.readFile(networkFile);
    Network network = scenario.getNetwork();

    // Create needed objects
    int numberOfNodes = 0;
    int numberOfLinks = 0;

    Map<Double, Integer> capacityMap = new HashMap<Double, Integer>();

    int capacity0To1000 = 0;
    int capacity1000To2000 = 0;
    int capacity2000To3000 = 0;
    int capacity3000To4000 = 0;
    int capacity4000To5000 = 0;
    int capacity5000ToInf = 0;

    Map<Double, Integer> freeSpeedMap = new HashMap<Double, Integer>();
    Map<Double, Integer> numberOfLanesMap = new HashMap<Double, Integer>();

    int linksWithMoreThanOneMode = 0;

    double maxLength = Integer.MIN_VALUE;
    double minLength = Integer.MAX_VALUE;

    // Do calculations
    for (Node node : network.getNodes().values()) {
      numberOfNodes++;
    }

    for (Link link : network.getLinks().values()) {
      numberOfLinks++;

      double capacity = link.getCapacity();
      if (!capacityMap.containsKey(capacity)) {
        capacityMap.put(capacity, 1);
      } else {
        int quantityCapacity = capacityMap.get(capacity);
        capacityMap.put(capacity, quantityCapacity + 1);
      }
      if (capacity < 1000) {
        capacity0To1000++;
      } else if (capacity >= 1000 && capacity < 2000) {
        capacity1000To2000++;
      } else if (capacity >= 2000 && capacity < 3000) {
        capacity2000To3000++;
      } else if (capacity >= 3000 && capacity < 4000) {
        capacity3000To4000++;
      } else if (capacity >= 4000 && capacity < 5000) {
        capacity4000To5000++;
      } else if (capacity >= 5000) {
        capacity5000ToInf++;
      } else {
        System.err.println("Error!");
      }

      double freeSpeed = link.getFreespeed();
      if (!freeSpeedMap.containsKey(freeSpeed)) {
        freeSpeedMap.put(freeSpeed, 1);
      } else {
        int quantityFreeSpeed = freeSpeedMap.get(freeSpeed);
        freeSpeedMap.put(freeSpeed, quantityFreeSpeed + 1);
      }

      double numberOfLanes = link.getNumberOfLanes();
      if (!numberOfLanesMap.containsKey(numberOfLanes)) {
        numberOfLanesMap.put(numberOfLanes, 1);
      } else {
        int quantityNumberOfLanes = numberOfLanesMap.get(numberOfLanes);
        numberOfLanesMap.put(numberOfLanes, quantityNumberOfLanes + 1);
      }

      if (link.getAllowedModes().size() > 1) {
        linksWithMoreThanOneMode++;
      }

      double length = link.getLength();
      if (length > maxLength) {
        maxLength = length;
      }
      if (length < minLength) {
        minLength = length;
      }
    }

    // Write information to console
    System.out.println("Number of Nodes: " + numberOfNodes);
    System.out.println("Number of Links: " + numberOfLinks);

    for (Double capacity : capacityMap.keySet()) {
      System.out.println(capacityMap.get(capacity) + " links have a capacity of " + capacity + ".");
    }

    System.out.println(capacity0To1000 + " links have a capacity of less than 1000.");
    System.out.println(
        capacity1000To2000 + " links have a capacity of at least 1000 and less than 2000.");
    System.out.println(
        capacity2000To3000 + " links have a capacity of at least 2000 and less than 3000.");
    System.out.println(
        capacity3000To4000 + " links have a capacity of at least 3000 and less than 4000.");
    System.out.println(
        capacity4000To5000 + " links have a capacity of at least 4000 and less than 5000.");
    System.out.println(capacity5000ToInf + " links have a capacity of at least 5000.");

    for (Double freeSpeed : freeSpeedMap.keySet()) {
      System.out.println(
          freeSpeedMap.get(freeSpeed)
              + " links have a free speed of "
              + freeSpeed
              + " / "
              + freeSpeed * 3.6
              + ".");
    }

    for (Double numberOfLanes : numberOfLanesMap.keySet()) {
      System.out.println(
          numberOfLanesMap.get(numberOfLanes) + " links have " + numberOfLanes + " lanes.");
    }

    System.out.println(linksWithMoreThanOneMode + " links allow more than one mode.");

    System.out.println("Maximum link length is: " + maxLength);
    System.out.println("Minimum link length is: " + minLength);
  }
Пример #18
0
  public QSimDensityDrawer(Scenario sc) {
    for (Link l : sc.getNetwork().getLinks().values()) {
      if (l.getId().toString().contains("jps")
          || l.getId().toString().contains("el")
          || l.getAllowedModes().contains("walk2d")
          || l.getCapacity() >= 100000
          || l.getFreespeed() > 100
          || l.getId().toString().contains("el")) {
        continue;
      }

      float width = (float) (l.getCapacity() / sc.getNetwork().getCapacityPeriod() / 1.3);

      boolean isCar = false;
      if (l.getFreespeed() > 1.35) {
        width = (float) (l.getNumberOfLanes() * 3.5);
        isCar = true;
      } else {
        width = (float) (width);
      }

      double dx = l.getToNode().getCoord().getX() - l.getFromNode().getCoord().getX();
      double dy = l.getToNode().getCoord().getY() - l.getFromNode().getCoord().getY();
      double length = Math.sqrt(dx * dx + dy * dy);
      dx /= length;
      dy /= length;
      LinkInfo info = new LinkInfo();

      info.id = l.getId();
      info.cap =
          (l.getLength() / ((NetworkImpl) sc.getNetwork()).getEffectiveCellSize())
              * l.getNumberOfLanes();

      double x0 = l.getFromNode().getCoord().getX();
      double y0 = l.getFromNode().getCoord().getY();

      double x1 = l.getToNode().getCoord().getX();
      double y1 = l.getToNode().getCoord().getY();

      x0 += dy * width / 2;
      x1 += dy * width / 2;
      y0 -= dx * width / 2;
      y1 -= dx * width / 2;

      info.width = width;
      info.x0 = x0;
      info.x1 = x1;
      info.y0 = y0;
      info.y1 = y1;

      double tan = dx / dy;
      double atan = Math.atan(tan);
      if (atan > 0) {
        atan -= Math.PI / 2;
      } else {
        atan += Math.PI / 2;
      }

      double offsetX = dy * .075;
      double offsetY = -dx * .075;
      if (dx > 0) {
        offsetX *= -1;
        offsetY *= -1;
      }

      info.tx = (x0 + x1) / 2 + offsetX;
      info.ty = (y0 + y1) / 2 + offsetY;
      info.text = "0";
      info.atan = atan;
      info.isCar = isCar;
      if (isCar) {
        info.cap = l.getLength() / 7.5 * l.getNumberOfLanes();
      }

      this.links.add(info);
      this.map.put(l.getId(), info);
    }
  }
Пример #19
0
 private static boolean isLinkOfType(
     Link link, double freeSpeed, double capacity, double numLanes) {
   return Math.abs(link.getFreespeed() - freeSpeed) < 0.01
       && Math.abs(link.getCapacity() - capacity) < 0.01
       && link.getNumberOfLanes() == numLanes;
 }
Пример #20
0
  public TransitRouteData(Network network, TransitRoute transitRoute) {

    this.transportMode = transitRoute.getTransportMode();

    this.firstDeparture = Double.MAX_VALUE;
    this.lastDeparture = -Double.MAX_VALUE;
    this.vehIds = new TreeSet<String>();
    this.numberOfDepartures = 0;

    for (Departure departure : transitRoute.getDepartures().values()) {
      this.firstDeparture = Math.min(this.firstDeparture, departure.getDepartureTime());
      this.lastDeparture = Math.max(this.lastDeparture, departure.getDepartureTime());
      this.vehIds.add(departure.getVehicleId().toString());
      this.numberOfDepartures++;
    }

    this.firstStop = transitRoute.getStops().get(0).getStopFacility();
    this.lastStop =
        transitRoute.getStops().get(transitRoute.getStops().size() - 1).getStopFacility();

    if (this.firstStop == this.lastStop) {
      // get the stop location of stop with the largest distance between first and last stop
      TransitStopFacility currentViaStop = null;
      double currentViaDistance = Double.NEGATIVE_INFINITY;
      for (TransitRouteStop stop : transitRoute.getStops()) {
        double distanceFirstPotentialVia =
            CoordUtils.calcDistance(this.firstStop.getCoord(), stop.getStopFacility().getCoord());
        double distanceLastProtenialVia =
            CoordUtils.calcDistance(this.lastStop.getCoord(), stop.getStopFacility().getCoord());
        double newDistance =
            Math.sqrt(
                Math.pow(distanceFirstPotentialVia, 2) + Math.pow(distanceLastProtenialVia, 2));

        if (newDistance > currentViaDistance) {
          // this one is farther away - keep it
          currentViaStop = stop.getStopFacility();
          currentViaDistance = newDistance;
        }
      }
      this.viaStop = currentViaStop;
    } else {
      // get the stop in the middle of the line
      this.viaStop =
          transitRoute.getStops().get((int) (transitRoute.getStops().size() / 2)).getStopFacility();
    }

    // calculate the length of the route
    double distance = 0.0;
    double freeSpeedTravelTime = 0.0;
    for (Id<Link> linkId : transitRoute.getRoute().getLinkIds()) {
      Link link = network.getLinks().get(linkId);
      distance += link.getLength();
      freeSpeedTravelTime += link.getLength() / link.getFreespeed();
    }
    // add last link but not the first link
    Link link = network.getLinks().get(transitRoute.getRoute().getEndLinkId());
    distance += link.getLength();
    freeSpeedTravelTime += link.getLength() / link.getFreespeed();

    this.distance = distance;
    this.freeSpeedTravelTime = freeSpeedTravelTime;

    this.travelTime =
        transitRoute.getStops().get(transitRoute.getStops().size() - 1).getArrivalOffset();

    this.avgSpeed = this.distance / this.travelTime;
  }
Пример #21
0
  @Override
  public void notifyAfterMobsim(AfterMobsimEvent event) {
    Network network = event.getServices().getScenario().getNetwork();
    DescriptiveStatistics error = new DescriptiveStatistics();
    DescriptiveStatistics errorAbs = new DescriptiveStatistics();
    DescriptivePiStatistics errorWeighted = new WSMStatsFactory().newInstance();

    TDoubleArrayList errorVals = new TDoubleArrayList();
    TDoubleArrayList caps = new TDoubleArrayList();
    TDoubleArrayList speeds = new TDoubleArrayList();

    for (Count count : counts.getCounts().values()) {
      if (!count.getId().toString().startsWith(ODCalibrator.VIRTUAL_ID_PREFIX)) {
        double obsVal = 0;
        for (int i = 1; i < 25; i++) {
          obsVal += count.getVolume(i).getValue();
        }

        if (obsVal > 0) {
          double simVal = calculator.getOccupancy(count.getId());
          simVal *= factor;

          double err = (simVal - obsVal) / obsVal;

          error.addValue(err);
          errorAbs.addValue(Math.abs(err));
          errorWeighted.addValue(Math.abs(err), 1 / obsVal);

          Link link = network.getLinks().get(count.getId());
          errorVals.add(Math.abs(err));
          caps.add(link.getCapacity());
          speeds.add(link.getFreespeed());
        }
      }
    }

    logger.info(
        String.format(
            "Relative counts error: mean = %s, var = %s, stderr = %s, min = %s, max = %s",
            error.getMean(),
            error.getVariance(),
            error.getStandardDeviation(),
            error.getMin(),
            error.getMax()));
    logger.info(
        String.format(
            "Absolute relative counts error: mean = %s, var = %s, stderr = %s, min = %s, max = %s",
            errorAbs.getMean(),
            errorAbs.getVariance(),
            errorAbs.getStandardDeviation(),
            errorAbs.getMin(),
            errorAbs.getMax()));
    logger.info(
        String.format(
            "Absolute weigthed relative counts error: mean = %s, var = %s, stderr = %s, min = %s, max = %s",
            errorWeighted.getMean(),
            errorWeighted.getVariance(),
            errorWeighted.getStandardDeviation(),
            errorWeighted.getMin(),
            errorWeighted.getMax()));

    String outdir = event.getServices().getControlerIO().getIterationPath(event.getIteration());

    try {
      TDoubleDoubleHashMap map = Correlations.mean(caps.toArray(), errorVals.toArray());
      StatsWriter.writeHistogram(
          map, "capacity", "counts", String.format("%s/countsError.capacity.txt", outdir));

      map = Correlations.mean(speeds.toArray(), errorVals.toArray());
      StatsWriter.writeHistogram(
          map, "speed", "counts", String.format("%s/countsError.speed.txt", outdir));

      StatsWriter.writeHistogram(
          Histogram.createHistogram(error, new LinearDiscretizer(0.1), false),
          "Error",
          "Frequency",
          String.format("%s/countsError.hist.txt", outdir));
      StatsWriter.writeHistogram(
          Histogram.createHistogram(errorAbs, new LinearDiscretizer(0.1), false),
          "Error (absolute)",
          "Frequency",
          String.format("%s/countsErrorAbs.hist.txt", outdir));
      StatsWriter.writeHistogram(
          Histogram.createHistogram(errorWeighted, new LinearDiscretizer(0.1), true),
          "Error (weighted)",
          "Frequency",
          String.format("%s/countsErrorWeighted.hist.txt", outdir));

      CountsCompare2GeoJSON.write(calculator, counts, factor, network, outdir);
      NetworkLoad2GeoJSON.write(
          event.getServices().getScenario().getNetwork(),
          calculator,
          factor,
          outdir + "/network.json");
    } catch (Exception e) {
      e.printStackTrace();
    }

    String rootOutDir = event.getServices().getControlerIO().getOutputPath();
    boolean append = false;
    if (event.getIteration() > 0) {
      append = true;
    }
    writeErrorFile(error, String.format("%s/countsError.txt", rootOutDir), append);
    writeErrorFile(errorAbs, String.format("%s/countsAbsError.txt", rootOutDir), append);
  }
 @Override
 public double getLinkTravelTime(Link link, double time, Person person, Vehicle vehicle) {
   return link.getLength() / link.getFreespeed(time);
 }