
No hace mucho tiempo, comenzaron las discusiones sobre la introducción de una multa por acelerar a más de 10 km / h de lo permitido. Tradicionalmente, se llevan a cabo de manera
no constructiva para Internet, por lo que generalmente no soporto ningún lado de tales holivars.
Los argumentos de los propietarios de automóviles en la masa se reducen a gruñidos "Necesito", que, por supuesto, no son idénticos. Una proporción significativa de personas que se ven obligadas a conducir 50 km para trabajar todos los días a través de lugares que no están cubiertos por el transporte público representan no menos de la proporción de personas que viajan en automóvil a la "panadería", que se puede ver claramente desde estos mismos automóviles que se dejaron en casa el primer día. poca nieve
Los urbanistas a menudo escuchan argumentos bastante unilaterales, ejemplos privados tristes de países europeos, cuya población a veces es completamente comparable al tráfico diario de Moscú, trucos como clichés insultantes sobre el "transporte rápido".
Y cuando ocurre tal situación, no hay nada mejor que dejar caer las emociones de otras personas y llamar a dos asistentes imparciales: Matan y Python.
Debilidad de la posición de los propietarios de automóviles: no proponen formas de resolver sus problemas (en mi opinión, la solución sería abolir el desarrollo espontáneo de cada parcela de tierra libre en las grandes ciudades y desarrollar regiones para que las personas no tengan que lidiar con la migración laboral a la capital en su país natal, pero ¿quién soy yo? como para ofrecer tales cosas?). Los urbanistas siempre tienen un conjunto de argumentos y soluciones llave en mano respaldadas por datos. Pero a veces se trata de estudios de instituciones serias, a veces estadísticas poco inteligibles sin un racionamiento adecuado. Estos datos en la mayoría de los casos impulsan la idea de una disminución general de la velocidad en las ciudades. Y el argumento más común a su favor es:
"De todos modos, debido a los semáforos, no puedes moverte a la velocidad máxima todo el tiempo, tu velocidad promedio será más baja de lo permitido, entonces ¿por qué no bajar la velocidad ligeramente permitida?""Hmmm", siempre pensé en este argumento. Si baja el máximo permitido, el promedio también disminuirá ligeramente. ¿Y qué prueba esto, que puede reducirse nuevamente? ¿Qué tipo de
aporía es esta? Debes comprobar qué tan cierto es esto.
Me gustaría presentarle un artículo adicional con reservas para dirigir sus críticas en los comentarios de una manera constructiva:
- Sí, sé lo feo que está escrito el código, pero es más importante para mí que funcione correctamente, yo mismo no soy un programador, es mejor escribir comentarios sobre el código en PM.
- Sí, sé que la simulación podría hacerse más difícil, más completa y más realista. Solo que no aceptaré reproches de que no haya cambios en la densidad del tráfico durante el día, diferentes dinámicas de diferentes automóviles, condiciones climáticas,
fases de la luna, la madre del autor , pero observaciones sensatas, indicaciones de fallas algorítmicas, modificaciones del modelo para cualquier situación no considerada. Según tengo entendido, es suficiente responder una pregunta simple desde el punto de vista de las matemáticas:
dada la fuerte discreción de movimiento debido a los semáforos, ¿la disminución de la velocidad máxima permitida en secciones individuales afecta significativamente el tiempo de viaje?La esencia de mi modelo es muy simple. Dado que el semáforo es un ciclo de programa listo para usar, la simulación se construye alrededor de una sección de la carretera con un semáforo al final y sus fases. La siguiente iteración es el siguiente tramo de la ruta con su longitud, velocidad permitida y la fase del semáforo al final.
El automóvil tiene tres fases de movimiento: aceleración uniforme, movimiento con la velocidad máxima permitida para una sección determinada, igualmente lento. Se implementan en 9 versiones.
- Si el automóvil se movió a la sección actual con la misma velocidad permitida, entonces se mueve sin cambios;
- Si se movió más lento (o se paró), entonces primero acelera;
- No existe la opción "se movía más rápido", y esta es la razón: si la velocidad permitida es menor en el siguiente segmento, reduce la velocidad en esto. ¿Es lógico?
Se agregan más opciones a estas opciones:
- El automóvil circula mientras circula o desacelera, y llega al final del segmento en rojo. Esto significa que debe detenerse frente a un semáforo. Suponiendo que siempre disminuye la velocidad con la misma aceleración, posponemos el camino necesario para frenar desde el semáforo. Esta es la distancia crítica, por analogía con la velocidad crítica de despegue de los aviones. Ahora, si, de acuerdo con las condiciones, el automóvil pasa por una luz roja, debería comenzar a disminuir a cero, comenzando desde el punto crítico;
- Maldición, ¿o tal vez el segmento es tan corto o el automóvil es tan vegetal que no tiene tiempo para aumentar la velocidad máxima antes del inicio de Skrit? ¿Y el programa baganet, que continúa dispersándose, aunque es hora de que disminuya la velocidad frente a un semáforo? Si esto sucede, lo obligaremos a no aumentar la velocidad por encima de la alcanzada en el punto Scrit, y luego implementaremos una de las opciones. Aquí está el resultado:

Y luego necesitas implementar esto en el código. Así es como lo hice, proporcionando comentarios detallados:
Patrón de hinduismoimport random
import math
# :
redlight = ("100",
"10",
"90",
"1", # "-" . . 1
"1") # 1 , 0. . .
# :
greenlight = ("30",
"120",
"30",
"1",
"1")
# :
distance = ("400",
"400",
"250",
"500",
"500")
#
velocity = ("60",
"60",
"60",
"60",
"40")
#-
r=0
g=0
d=0
v=0
# :
vcurrent=float(0)
# :
t=0
# :
gtime=0
#, 100 / 15 .
# :
accel=float(100/(3.6*15))
#, .
# :
decel = float(accel*2)
# , ( , 0):
while r<=2:
red=float(redlight[r])
grn=float(greenlight[g])
dis=float(distance[d])
vel=float(float(velocity[v])/3.6)
vnext=float(float(velocity[v+1])/3.6)
# accel :
#saccel = float(((vcurrent*vel-vcurrent)/accel) + ((vel-vcurrent)*((vel-vcurrent)/(2*accel)
saccel = float((vcurrent*(vel-vcurrent)/accel) + (vel-vcurrent)*(vel-vcurrent)/(2*accel))
# : , decel:
scrit = float(dis-(vel/decel) - (vel*vel)/(2*decel))
# , .
# :
startingred = random.randint(0, (int(grn)-1))
print ("startingred= ", startingred)
# , __ - :
if vcurrent == vel:
# , , :
if vnext>= vcurrent:
t = int (dis/vel)
# , :
if (t+startingred)%(red+grn)<=red:
t = int (scrit/vel + (vel/decel) + red-((t+startingred)%(red+grn))) ### 2
vcurrent = 0
print (" , ")
# , :
else:
t = int (dis/vel)### 1
vcurrent = vel
print (" , ", " v=", vcurrent)
# , , scrit:
else:
t = int ((scrit/vel) +
(vcurrent - (vnext)/((vcurrent*(vcurrent - (vnext/(dis-scrit))-
((vcurrent - vnext)*(vcurrent - vnext)/(2*(dis-scrit))))))))
# , :
if (t+startingred)%(red+grn)<=red:
t = int (scrit/vel + (vel/decel)+ red-((t+startingred)%(red+grn)))### 2
vcurrent = 0
print (" , ")
# - , , scrit :
else:
t = int (scrit/vel +
(vcurrent - vnext)/((vcurrent*(vcurrent - (vnext/(dis-scrit))-
((vcurrent - vnext)*(vcurrent - vnext)/(2*(dis-scrit)))))))### 3
vcurrent = float(vnext/3.6)
print (" , ", " v=", vcurrent)
# , __ - :
elif vcurrent < vel:
# , scrit:
vcrit=math.sqrt(2*accel*scrit+vcurrent*vcurrent)
# scrit, scrit, vcrit , :
if saccel >= scrit:
# - ,
if vnext >= vcrit:
t = int(((vcrit-vcurrent)/ accel) + (dis-scrit)/vcrit)
# , :
if (t+startingred)%(red+grn)<=red:
t = int(((vcrit-vcurrent)/ accel) + ((dis-scrit)*2/vcrit) + red-((t+startingred)%(red+grn)))### 8
vcurrent = 0
print (" , , ")
# , :
else:
t = int(((vcrit-vcurrent)/ accel) + (dis-scrit)/vcrit) ### 7
vcurrent = vcrit
print (" , , ", " v=", vcurrent)
# -
else:
t = int(((vcrit-vcurrent)/ accel) + (vcrit - vnext)/((vcrit*(vcrit - vnext)/(dis-scrit))-
((vcrit - vnext)*(vcrit - vnext)/(2*(dis-scrit)))))
# , :
if (t+startingred)%(red+grn)<=red:
t = int(((vcrit-vcurrent)/ accel) + ((dis-scrit)*2/vcrit) + red-((t+startingred)%(red+grn)) ) ### 8
vcurrent = 0
print (" , , ")
# - , , scrit :
else:
t = int(((vcrit-vcurrent)/ accel) + (vcrit - vnext)/((vcrit*(vcrit - vnext)/(dis-scrit))-
((vcrit - vnext)*(vcrit - vnext)/(2*(dis-scrit))))) ### 9
vcurrent = vnext
print (" , , ", " v=", vcurrent)
# scrit, , :
else:
# , , :
if vnext>= vel:
t = int(((vel- vcurrent)/accel) + (dis-saccel)/vel)
# , :
if (t+startingred)%(red+grn)<=red:
t = int (((vel- vcurrent)/accel) + (scrit-saccel)/vel + (vel/decel)+ red-((t+startingred)%(red+grn)))### 5
vcurrent = 0
print (" , ")
# , :
else:
t = int (((vel- vcurrent)/accel) + (dis-saccel)/vel)### 4
vcurrent = vel
print (" , ", " v=", vcurrent)
else:
# , :
if (t+startingred)%(red+grn)<=red:
t = int (((vel- vcurrent)/accel) + (scrit-saccel)/vel + (vel/decel)+ red-((t+startingred)%(red+grn)))### 5
vcurrent = 0
print (" , ")
# - , , scrit :
else:
print ("scrit ", scrit)
print ("vcurrent ", vcurrent)
t = int (((vel- vcurrent)/accel) +(scrit-saccel)/vel + (vel - vnext)/((vel*(vel - vnext)/(dis-scrit))-((vel - vnext)*(vel - vnext)/(2*(dis-scrit))))) ### 6
vcurrent = vnext
print (" , ", " v=", vcurrent)
# , __ - , :
else:
print ("ERROR: v current > v next")
print (t)
r+=1
g+=1
d+=1
v+=1
gtime+=t
print (gtime)
.
0 100 15 , . , — , .
, , , . , — , . , 3-5 . , , — , . …
, . , . . — .
, . , , , . , : , . — ( ). , , :
t = int (scrit/vel + (vel/decel) + red-((t+startingred)%(red+grn)) <b>+ (red+grn)</b>)
- ? , , , . . , , / .
, , ? .
, . , . , , , , .
. , , , , 10000 :
import random
import math
n=0
overalltime=0
while n<=10000:
redlight = ("100",
"10",
"90",
"20",
"60",
"20",
"20",
"20",
"20",
"60",
"20",
"20",
"90",
"90",
"100",
"60",
"100",
"80",
"80",
"60",
"90",
"60",
"120",
"60",
"80",
"60",
"1",
"1")
greenlight = ("30",
"120",
"30",
"120",
"40",
"120",
"120",
"120",
"120",
"40",
"120",
"120",
"40",
"15",
"20",
"20",
"20",
"20",
"20",
"40",
"30",
"20",
"40",
"40",
"20",
"40",
"1",
"1")
distance = ("400",
"400",
"250",
"250",
"250",
"450",
"300",
"650",
"1000",
"450",
"500",
"900",
"450",
"400",
"1100",
"900",
"600",
"1000",
"450",
"450",
"400",
"450",
"200",
"500",
"350",
"400",
"500",
"500")
velocity = ("80",
"80",
"80",
"80",
"80",
"80",
"60",
"80",
"80",
"80",
"80",
"80",
"80",
"80",
"80",
"80",
"80",
"60",
"80",
"80",
"80",
"80",
"80",
"60",
"80",
"80",
"80",
"40")
r=0
g=0
d=0
v=0
vcurrent=float(0)
t=0
gtime=0
accel=float(100/(3.6*15))
decel = float(accel*2)
while r<=26:
red=float(redlight[r])
grn=float(greenlight[g])
dis=float(distance[d])
vel=float(float(velocity[v])/3.6)
vnext=float(float(velocity[v+1])/3.6)
saccel = float((vcurrent*(vel-vcurrent)/accel) + (vel-vcurrent)*(vel-vcurrent)/(2*accel))
scrit = float(dis-(vel/decel) - (vel*vel)/(2*decel))
startingred = random.randint(0, (int(grn)-1))
if vcurrent == vel:
if vnext>= vcurrent:
t = int (dis/vel)
if (t+startingred)%(red+grn)<=red:
t = int (scrit/vel + (vel/decel) + red-((t+startingred)%(red+grn))) ### 2
vcurrent = 0
else:
t = int (dis/vel)### 1
vcurrent = vel
else:
t = int ((scrit/vel) +
(vcurrent - (vnext)/((vcurrent*(vcurrent - (vnext/(dis-scrit))-
((vcurrent - vnext)*(vcurrent - vnext)/(2*(dis-scrit))))))))
if (t+startingred)%(red+grn)<=red:
t = int (scrit/vel + (vel/decel)+ red-((t+startingred)%(red+grn)))### 2
vcurrent = 0
else:
t = int (scrit/vel +
(vcurrent - vnext)/((vcurrent*(vcurrent - (vnext/(dis-scrit))-
((vcurrent - vnext)*(vcurrent - vnext)/(2*(dis-scrit)))))))### 3
vcurrent = float(vnext/3.6)
elif vcurrent < vel:
vcrit=math.sqrt(2*accel*scrit+vcurrent*vcurrent)
if saccel >= scrit:
if vnext >= vcrit:
t = int(((vcrit-vcurrent)/ accel) + (dis-scrit)/vcrit)
if (t+startingred)%(red+grn)<=red:
t = int(((vcrit-vcurrent)/ accel) + ((dis-scrit)*2/vcrit) + red-((t+startingred)%(red+grn)))### 8
vcurrent = 0
else:
t = int(((vcrit-vcurrent)/ accel) + (dis-scrit)/vcrit) ### 7
vcurrent = vcrit
else:
t = int(((vcrit-vcurrent)/ accel) + (vcrit - vnext)/((vcrit*(vcrit - vnext)/(dis-scrit))-
((vcrit - vnext)*(vcrit - vnext)/(2*(dis-scrit)))))
if (t+startingred)%(red+grn)<=red:
t = int(((vcrit-vcurrent)/ accel) + ((dis-scrit)*2/vcrit) + red-((t+startingred)%(red+grn)) ) ### 8
vcurrent = 0
else:
t = int(((vcrit-vcurrent)/ accel) + (vcrit - vnext)/((vcrit*(vcrit - vnext)/(dis-scrit))-
((vcrit - vnext)*(vcrit - vnext)/(2*(dis-scrit))))) ### 9
vcurrent = vnext
else:
if vnext>= vel:
t = int(((vel- vcurrent)/accel) + (dis-saccel)/vel)
if (t+startingred)%(red+grn)<=red:
t = int (((vel- vcurrent)/accel) + (scrit-saccel)/vel + (vel/decel)+ red-((t+startingred)%(red+grn)))### 5
vcurrent = 0
else:
t = int (((vel- vcurrent)/accel) + (dis-saccel)/vel)### 4
vcurrent = vel
else:
if (t+startingred)%(red+grn)<=red:
t = int (((vel- vcurrent)/accel) + (scrit-saccel)/vel + (vel/decel)+ red-((t+startingred)%(red+grn)))### 5
vcurrent = 0
else:
t = int (((vel- vcurrent)/accel) +(scrit-saccel)/vel + (vel - vnext)/((vel*(vel - vnext)/(dis-scrit))-((vel - vnext)*(vel - vnext)/(2*(dis-scrit))))) ### 6
vcurrent = vnext
else:
print ("ERROR: v current > v next")
#print (t)
r+=1
g+=1
d+=1
v+=1
gtime+=t
dev=(1476-gtime)*(1476-gtime)
#print (gtime)
n+=1
dev+=dev
overalltime+=gtime
print ("mean= ", overalltime/n)
print ("deviation= ", math.sqrt(dev/n))
« » — , .
: 10 /, , 50 /.
10 000 , raw data:
(, /; , ; ):
90 1466,6 0,5
80 1475,6 0,4
70 1479,7 0,9
60 1593,7 0,8
50 1701,3 0,5
40 1869,8 0,6

. , , Y , .
. -,
. - 70 / . -, , 8% 13% « ». ,
, , . , , «» 10% .
, (, ), — .