Path: blob/main/tests/complex/tutorial/city_mobil/data/createNet.py
169689 views
#!/usr/bin/env python1# -*- coding: utf-8 -*-2# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo3# Copyright (C) 2008-2025 German Aerospace Center (DLR) and others.4# This program and the accompanying materials are made available under the5# terms of the Eclipse Public License 2.0 which is available at6# https://www.eclipse.org/legal/epl-2.0/7# This Source Code may also be made available under the following Secondary8# Licenses when the conditions for such availability set forth in the Eclipse9# Public License 2.0 are satisfied: GNU General Public License, version 210# or later which is available at11# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html12# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later1314# @file createNet.py15# @author Michael Behrisch16# @author Daniel Krajzewicz17# @date 2008-07-041819"""20Create the XML input files for the generation of the SUMO network21of the CityMobil parking lot.22"""23from __future__ import absolute_import24from __future__ import print_function25from __future__ import division26import random27import subprocess28import os29import sys30from constants import PREFIX, DOUBLE_ROWS, ROW_DIST, STOP_POS, SLOTS_PER_ROW, SLOT_WIDTH31from constants import SLOT_LENGTH, SLOT_FOOT_LENGTH, CAR_CAPACITY, CYBER_CAPACITY, BUS_CAPACITY, TOTAL_CAPACITY32from constants import CYBER_SPEED, CYBER_LENGTH, OCCUPATION_PROBABILITY3334if 'SUMO_HOME' in os.environ:35tools = os.path.join(os.environ['SUMO_HOME'], 'tools')36sys.path.append(tools)37else:38sys.exit("please declare environment variable 'SUMO_HOME'")3940import sumolib # noqa4142occupied = 043nodes = open("%s.nod.xml" % PREFIX, "w")44print("<nodes>", file=nodes)45edges = open("%s.edg.xml" % PREFIX, "w")46print("<edges>", file=edges)47connections = open("%s.con.xml" % PREFIX, "w")48print("<connections>", file=connections)49routes = open("%s.rou.xml" % PREFIX, "w")50print(("""<routes>51<vType id="car" length="3" minGap=".5" guiShape="passenger" maxSpeed="50" color="0.7,0.7,0.7"/>52<vType id="person" length=".25" minGap="0" guiShape="pedestrian" width=".25" maxSpeed="5" color="1,0.2,0.2"/>53<vType id="cybercar" length="%s" minGap="1" guiShape="evehicle" maxSpeed="%s" color="0,1,0" \54emissionClass="HBEFA2/P_7_7"/>""") % (CYBER_LENGTH, CYBER_SPEED), file=routes)55# streets56nodeID = "main-0"57print('<node id="in" x="-100" y="0"/>', file=nodes)58print('<node id="%s" x="0" y="0"/>' % nodeID, file=nodes)59print('<edge id="mainin" from="in" to="%s" numLanes="2" spreadType="center"/>' %60nodeID, file=edges)61for row in range(DOUBLE_ROWS):62nextNodeID = "main%s-%s" % (row, row + 1)63if row + 1 == DOUBLE_ROWS:64nextNodeID = "main%s-" % row65x = (row + 1) * ROW_DIST66print('<node id="%s" x="%s" y="0"/>' % (nextNodeID, x), file=nodes)67print('<edge id="main%s" from="%s" to="%s" numLanes="2" spreadType="center"/>' % (68row, nodeID, nextNodeID), file=edges)69nodeID = nextNodeID70print('<node id="out" x="%s" y="0"/>' % (x + 100), file=nodes)71print('<edge id="mainout" from="%s" to="out" numLanes="2" spreadType="center"/>' %72nodeID, file=edges)73roads = ["road-0"]74for row in range(DOUBLE_ROWS - 1):75roads.append("road%s-%s" % (row, row + 1))76roads.append("road%s-" % (row + 1))77for idx, road in enumerate(roads):78nodeID = road.replace("road", "main")79for slot in range(SLOTS_PER_ROW):80partID = "%s-%s" % (road, slot)81print('<node id="%st" x="%s" y="%s"/>' % (82partID, idx * ROW_DIST, (slot + 1) * SLOT_WIDTH), file=nodes)83print('<edge id="%s" from="%s" to="%st" numLanes="2" spreadType="center"/>' % (84partID, nodeID, partID), file=edges)85print('<edge id="-%s" from="%st" to="%s" numLanes="2" spreadType="center"/>' % (86partID, partID, nodeID), file=edges)87nodeID = "%st" % partID88for row in range(DOUBLE_ROWS):89for slot in range(SLOTS_PER_ROW):90slotID = "slot%s-%sl" % (row, slot)91source = "%s-%st" % (roads[row], slot)92print('<node id="%st" x="%s" y="%s"/>' % (93slotID, row * ROW_DIST + SLOT_LENGTH, (slot + 1) * SLOT_WIDTH), file=nodes)94print('<edge id="%s" from="%s" to="%st" spreadType="center"/>' % (95slotID, source, slotID), file=edges)96print('<edge id="-%s" from="%st" to="%s" spreadType="center"/>' % (97slotID, slotID, source), file=edges)98slotID = "slot%s-%sr" % (row, slot)99source = "%s-%st" % (roads[row + 1], slot)100print('<node id="%st" x="%s" y="%s"/>' % (101slotID, (row + 1) * ROW_DIST - SLOT_LENGTH, (slot + 1) * SLOT_WIDTH), file=nodes)102print('<edge id="%s" from="%s" to="%st" spreadType="center"/>' % (103slotID, source, slotID), file=edges)104print('<edge id="-%s" from="%st" to="%s" spreadType="center"/>' % (105slotID, slotID, source), file=edges)106# footpaths107y = (SLOTS_PER_ROW + 1) * SLOT_WIDTH108print('<node id="foot" x="-100" y="%s"/>' % y, file=nodes)109print(110'<edge id="footmainin" from="foot" to="foot0" speed="5" spreadType="center"/>', file=edges)111for row in range(DOUBLE_ROWS):112nodeID = "foot%s" % row113x = row * ROW_DIST + ROW_DIST / 2114print('<node id="%s" x="%s" y="%s"/>' % (nodeID, x, y), file=nodes)115if row > 0:116edgeID = "footmain%sto%s" % (row - 1, row)117print('<edge id="%s" from="foot%s" to="foot%s" speed="5" spreadType="center"/>' % (118edgeID, row - 1, row), file=edges)119for slot in reversed(range(SLOTS_PER_ROW)):120slotID = "foot%s-%s" % (row, slot)121print('<node id="%s" x="%s" y="%s"/>' % (122slotID, x, (slot + 1) * SLOT_WIDTH), file=nodes)123print('<edge id="%sto%s" from="%s" to="%s" speed="5" spreadType="center"/>' % (124nodeID, slot, nodeID, slotID), file=edges)125print('<edge id="-%sto%s" from="%s" to="%s" speed="5" spreadType="center"/>' % (126nodeID, slot, slotID, nodeID), file=edges)127print('<node id="%srt" x="%s" y="%s"/>' % (128slotID, x + SLOT_FOOT_LENGTH, (slot + 1) * SLOT_WIDTH), file=nodes)129print('<edge id="%sr" from="%s" to="%srt" spreadType="center"/>' % (130slotID, slotID, slotID), file=edges)131print('<edge id="-%sr" from="%srt" to="%s" spreadType="center"/>' % (132slotID, slotID, slotID), file=edges)133print('<node id="%slt" x="%s" y="%s"/>' % (134slotID, x - SLOT_FOOT_LENGTH, (slot + 1) * SLOT_WIDTH), file=nodes)135print('<edge id="%sl" from="%s" to="%slt" spreadType="center"/>' % (136slotID, slotID, slotID), file=edges)137print('<edge id="-%sl" from="%slt" to="%s" spreadType="center"/>' % (138slotID, slotID, slotID), file=edges)139nodeID = slotID140vSlot = slotID.replace("foot", "slot")141if random.uniform(0, 1) < OCCUPATION_PROBABILITY:142occupied += 1143print("""\144<vehicle id="v%sr" type="car" depart="0" departPos="0">145<route edges="%sr -%sr"/>146</vehicle>""" % (vSlot, vSlot, vSlot), file=routes)147else:148print("""\149<flow id="p%sr" type="person" begin="0" period="1" number="%s">150<route edges="%sr -%sr"/>151</flow>""" % (slotID, CAR_CAPACITY, slotID, slotID), file=routes)152if random.uniform(0, 1) < OCCUPATION_PROBABILITY:153occupied += 1154print("""\155<vehicle id="v%sl" type="car" depart="0" departPos="0">156<route edges="%sl -%sl"/>157</vehicle>""" % (vSlot, vSlot, vSlot), file=routes)158else:159print("""\160<flow id="p%sl" type="person" begin="0" period="1" number="%s">161<route edges="%sl -%sl"/>162</flow>""" % (slotID, CAR_CAPACITY, slotID, slotID), file=routes)163x = DOUBLE_ROWS * ROW_DIST + ROW_DIST / 2164print('<node id="foot%s" x="%s" y="%s"/>' % (DOUBLE_ROWS, x, y), file=nodes)165edgeID = "footmain%sto%s" % (DOUBLE_ROWS - 1, DOUBLE_ROWS)166print('<edge id="%s" from="foot%s" to="foot%s" speed="5" spreadType="center"/>' % (167edgeID, DOUBLE_ROWS - 1, DOUBLE_ROWS), file=edges)168print('<node id="footend" x="%s" y="%s"/>' % (x + 100, y), file=nodes)169print('<edge id="footmainout" from="foot%s" to="footend" speed="5" spreadType="center"/>' %170DOUBLE_ROWS, file=edges)171print('<node id="fair" x="%s" y="%s"/>' % (x + 100, y - 10), file=nodes)172print('<edge id="footfairin" from="fair" to="foot%s" speed="5" spreadType="center"/>' %173DOUBLE_ROWS, file=edges)174175# cybercar (automated bus)176y = (SLOTS_PER_ROW + 3) * SLOT_WIDTH177print('<node id="cyber" x="-100" y="%s"/>' % y, file=nodes)178print(179'<edge id="cyberin" from="cyber" to="cyber0" numLanes="2" spreadType="center"/>', file=edges)180print(181'<edge id="-cyberin" from="cyber0" to="cyber" numLanes="2" spreadType="center"/>', file=edges)182for row in range(DOUBLE_ROWS + 1):183nodeID = "cyber%s" % row184x = row * ROW_DIST + ROW_DIST / 2185print('<node id="%s" x="%s" y="%s"/>' % (nodeID, x, y), file=nodes)186if row > 0:187edgeID = "cyber%sto%s" % (row - 1, row)188print('<edge id="%s" from="cyber%s" to="cyber%s" numLanes="2" spreadType="center"/>' % (189edgeID, row - 1, row), file=edges)190print('<edge id="-%s" from="cyber%s" to="cyber%s" numLanes="2" spreadType="center"/>' % (191edgeID, row, row - 1), file=edges)192if row < DOUBLE_ROWS:193print('<connection from="%s" to="cyber%sto%s"/>' % (194edgeID, row, row + 1), file=connections)195print('<connection from="-cyber%sto%s" to="-%s"/>' % (196row, row + 1, edgeID), file=connections)197else:198print('<connection from="%s" to="cyberout"/>' %199edgeID, file=connections)200print('<connection from="-cyberout" to="-%s"/>' %201edgeID, file=connections)202print('<node id="cyberend" x="%s" y="%s"/>' % (x + 100, y), file=nodes)203print('<edge id="cyberout" from="cyber%s" to="cyberend" numLanes="2" spreadType="center"/>' %204row, file=edges)205print('<edge id="-cyberout" from="cyberend" to="cyber%s" numLanes="2" spreadType="center"/>' %206row, file=edges)207208209print("</nodes>", file=nodes)210nodes.close()211print("</edges>", file=edges)212edges.close()213print("</connections>", file=connections)214connections.close()215216NETCONVERT = os.environ.get(217"NETCONVERT_BINARY", os.path.join(os.environ["SUMO_HOME"], 'bin', 'netconvert'))218subprocess.call([NETCONVERT,219'--no-internal-links',220'-n', '%s.nod.xml' % PREFIX,221'-e', '%s.edg.xml' % PREFIX,222'-x', '%s.con.xml' % PREFIX,223'-o', '%s.net.xml' % PREFIX])224225numBusses = TOTAL_CAPACITY // BUS_CAPACITY226print(""" <flow id="b" type="cybercar" begin="0" period="100" number="%s">227<route edges="cyberin"/>228</flow>229</routes>""" % numBusses, file=routes)230routes.close()231232routes = open("%s_cyber.rou.xml" % PREFIX, "w")233print("""<routes>234<flow id="c" type="cybercar" begin="50" period="100" number="%s">235<route edges="cyberin"/>236</flow>237</routes>""" % (TOTAL_CAPACITY // CYBER_CAPACITY - numBusses), file=routes)238routes.close()239240stops = open("%s.add.xml" % PREFIX, "w")241print("<additional>", file=stops)242for row in range(DOUBLE_ROWS):243edgeID = "cyber%sto%s" % (row, row + 1)244print(' <busStop id="%sstop" lane="%s_0"' %245(edgeID, edgeID), end=' ', file=stops)246print('startPos="%s" endPos="%s"/>' % (247STOP_POS - 2 * CYBER_LENGTH - 1, STOP_POS), file=stops)248for edge in ["cyberin", "cyberout"]:249print(' <busStop id="%sstop" lane="%s_0"' %250(edge, edge), end=' ', file=stops)251print('startPos="%s" endPos="%s"/>' % (25290 - 2 * CYBER_LENGTH - 1, 90), file=stops)253print(254' <edgeData id="dump" freq="3600" file="aggregated.xml" excludeEmpty="true" type="emissions"/>', file=stops)255print("</additional>", file=stops)256stops.close()257258totalSlots = 2 * DOUBLE_ROWS * SLOTS_PER_ROW259bat = open("%s.bat" % PREFIX, "w")260breakbat = open("%s_break.bat" % PREFIX, "w")261262for period in range(5, 50, 5):263routes = open("%s_demand%02i.rou.xml" % (PREFIX, period), "w")264print("<routes>", file=routes)265if occupied < totalSlots:266print(""" <flow id="v" type="car" begin="10" period="%s" number="%s">267<route edges="mainin"/>268</flow>""" % (period, totalSlots - occupied), file=routes)269if occupied > 0:270print(""" <flow id="p" type="person" begin="10" period="%s" number="%s">271<route edges="footfairin"/>272</flow>""" % (period, occupied * CAR_CAPACITY), file=routes)273print("</routes>", file=routes)274routes.close()275276config = open("%s%02i.sumocfg" % (PREFIX, period), "w")277print("""<configuration>278<input>279<net-file value="%s.net.xml"/>280<route-files value="%s.rou.xml,%s_demand%02i.rou.xml"/>281<additional-files value="%s.add.xml"/>282<no-step-log value="True"/>283<time-to-teleport value="0"/>284</input>285</configuration>""" % (PREFIX, PREFIX, PREFIX, period, PREFIX), file=config)286config.close()287print("simpleManager.py -d %s" % period, file=bat)288print("simpleManager.py -b 120 -d %s" % period, file=breakbat)289290config = open("%s%02i_cyber.sumocfg" % (PREFIX, period), "w")291print("""<configuration>292<input>293<net-file value="%s.net.xml"/>294<route-files value="%s.rou.xml,%s_cyber.rou.xml,%s_demand%02i.rou.xml"/>295<additional-files value="%s.add.xml"/>296<no-step-log value="True"/>297<time-to-teleport value="0"/>298</input>299</configuration>""" % (PREFIX, PREFIX, PREFIX, PREFIX, period, PREFIX), file=config)300config.close()301print("agentManager.py -c -d %s" % period, file=bat)302print("agentManager.py -c -b 120 -d %s" % period, file=breakbat)303bat.close()304breakbat.close()305306307