1) environment
netedit
구현
netedit 사용해서 7개 node와 20개 edges로 구성된 네트워크를 (.net.xml) 생성한다. 이때 E7, -E7만 제한 속도 10으로 제한하고, 나머지는 agent의 maxSpeed에 맞추어 15로 구성하였다. 추가로, lane위의 vehicle수를 구하기 위해 모든 edge에 laneAreaDetector을 설치하였다. *dqn.add.xml에 lanedetector를 명시하며 pos와 endPos생략시 lane전체를 의미하며 freq 또는 tl은 필수로 입력해야한다.
laneAreaDetector예시) <laneAreaDetector id="-D0" lane="-E0_0" length="100.00" freq ="1" file="dqn_addfile.out"/>
목표 : agent는 dynamic traffic상황에서 0번 노드부터 6번 노드까지 최단 시간안에 도착하는 것이다.
2) Traffic with random routes
truck : 빨강색 normal_car : 파랑색 dqnAgent : 노랑
vTtype | Length | Accel | Decel | maxSpeed | sigma | Probability |
normal_car | 5.0 | 2.0 | 5.0 | 12.0 | 0.5 | 0.7 |
truck | 8.0 | 1.0 | 5.0 | 5.0 | 0.5 | 0.3 |
agent | 5.0 | 2.0 | 5.0 | 15.0 | 0.5 | 1대 |
Random Route 생성 방법 (for truck & normal_car)
매 에피소드마다 정해진 양의 traffic을 random route로 흘려보내며 dynamic traffic상황을 조성한다.
dqn.add.xml 파일에 <vTypeDistribution>을 지정해준다. 원하는 vType을 생성하고, probability로 각 vType의 생성 비율을 조절해준다. 이 실험에서는 normal_car : car을 7:3비율로 생성한다.
이후, tools/randomTrips.py 을 사용하여 randomRoute를 설정해준다. traffic volume을 3600초 당 2400대로 계산하여 옵션을 설정하였다.
dqn.add.xml
1
2
3
4
5
6
|
<additional>
<vTypeDistribution id="type1" >
<vType id="normal_car" length="5.0" accel="2.0" decel="5.0" maxSpeed="15.0" color="0,1,0" sigma="0.5" guiShape="passenger/van" probability = "0.8"/>
<vType id="truck" length="8.0" accel="1.0" decel="5.0" maxSpeed="5.0" color="1,0,0" sigma="0.5" guiShape="truck" probability = "0.2"/>
</vTypeDistribution>
</additional>
|
cs |
Traffic Volume : To let n vehicles depart between times t0 and t1 set the options
-b t0 -e t1 -p ((t1 - t0) / n)
1
2
|
cmd_genDemand = "python \"C:/Program Files (x86)/Eclipse/Sumo/tools/randomTrips.py\" -n {} -o {} -r {} -b 0 -e 3600 -p 1.5 --additional-file {} --trip-attributes \"type='type1'\" --random\"".format(net, trip, randomrou, add)
os.system(cmd_genDemand)
|
cs |
3) State observation
4) Reward
5) DQN
DQN Parameter
DQN Model layer
1
2
3
4
5
|
def __init__(self, action_size):
super(DQN, self).__init__()
self.fc1 = Dense(150, activation= 'relu')
self.fc2 = Dense(100, activation= 'relu')
self.fc_out = Dense(action_size, kernel_initializer=RandomUniform(-1e-3,1e-3))
|
cs |
6) Result
Train Result
episode 500을 설정하고 train해보았을 때, Mean Travel TIme이 100~200사이로 수렴하는 것을 확인할 수 있다.
EPISODE 분석해보기
episode1: 트럭때문에 아래로 돌아서 감!
episode1: 트럭때문에 아래로 돌아서 감!
7) Code
https://github.com/Rrojin11/SUMO/tree/master/DQN
>> python .\DQN\dqnrun.py --nogui -N 500
-N : episodenum
--nogui : without sumo-gui
8) Error 해결
Error1 Answered with error to command 0xa3: Lane '' is not known TOT 1 ACT 1 BUF 1)
Error1 해결방법
lane을 받아오지 못하는 오류였는데, vehicle.getLaneID와 lane.getEdgeID를 사용하는 대신 vehicle.getRoadID를 통해서 특정 차량의 현재 edge를 구했다.
Error2 Keras 모델 저장 오류
https://stackoverflow.com/questions/51806852/cant-save-custom-subclassed-model
Error2 해결방법
https://ltlkodae.tistory.com/13
나의 경우, keras 모델을 save, load_model 하는게 되지 않아서, 대신 weights만 저장하는 방식을(save_weights, load_weights) 사용했다. 그리고 추가적으로 model.built=True가 필요했다.
1
2
3
4
|
self.trained_model = self.get_trainedmodel()
self.trained_model.built = True
self.trained_model.load_weights(dirModel+str(num_episode)+'.h5')
|
cs |
9) 개선점
Emission 정보 추가하기
1) dqn.sumocfg에 <emission-output>파일을 명시하면 emission정보를 확인할 수 있다. 단, vType=='agent'일때만 가능하도록 하고 싶은데, 다른 type에 has.emission.device = false해도 되지 않는다. (이유는 아직 파악하지 못함.) 이러면 모든 차량에 대해서 emission정보를 구하기에 불가피한 정보량까지 모조리 구해버리게 된다.
<output>
<emission-output value="dqn.emissionoutput.xml"/>
</output>
2) 적용해볼 수 있는 다른 방법으로는, vehicle모듈 사용하는 것이다.
'Traffic Simulation > SUMO' 카테고리의 다른 글
SUMO permission denied (0) | 2023.02.20 |
---|---|
OSM에 쿼리 적용하여 SUMO지도 생성(Overpass Turbo) (2) | 2022.02.23 |
[Routing] SUMO + TraCI + Qlearning Routing (0) | 2022.02.14 |
[Routing] SUMO + TraCI + Random Routing (0) | 2022.02.08 |
[Tutorial] TraCI4Traffic Lights (0) | 2022.02.05 |