E D R , A S I H C RSS

Bus Simulation

BusSimulation

  • 원래 대안언어 축제 코드 첼린지에 6단계까지 해서 내려던 문제인데(답 검증을 못한 관계로 2단계로 축소후 일부 문제로만 냄) 이왕 만든거 아까워서 이렇게 올림 - 상협
  • 우리는 보통 버스를 기다릴 때 버스가 한꺼번에 오는 경우를 종종 보게 된다. 버스가 처음에 출발할 때는 일정한 간격으로 출발하였을 텐데 이렇게 몰려다니는 이유는 무엇일까? 이 이유를 컴퓨터로 시물레이션 해본다. 초기 단계에서는 최대한 간단하게 시작해서 점차 현실을 반영하는 시물레이션 으로 만들어 나간다. 하위 단계를 무시하고 다음 단계로 올라갈 수 없으면 순차적으로 시물레이션 단계를 올라간다.
  • Data Input - 시물레이션 데이터는 busData.txtbusStationData.txt 두 가지 로부터 받아들인다. 각 데이터의 값은 단계가 올라감에 따라서 추가되어간다.
  • User Input - 사용자는 자신이 원하는 시간 후의 시물레이션 결과를 볼 수 있다. 시간과 분을 입력받는다.
  • Output - 출력결과는 버스의 위치(단위 meter), 단계에 따라서 승객 수를 출력한다.

1 단계

  • 조건 : 버스의 속력, 총운행구간 거리
  • 문제 : 특정 시간 후의 버스의 위치는?
  • Input
    • busData.txt

~cpp 
120000 
60   65  72   75   80 
  • busStationData.txt(시간_초)

~cpp 
60
  • Output

~cpp 
1000
1083.33
1200
1250
1333.33

테스트

~cpp 
2시간 10분
10000   (120000 + 10000 - 120000)
20833.3(130000 + 10830 - 120000)
36000   (144000 + 12000 - 120000)
42500   (150000 + 12500 - 120000)
53333.3(160000 + 13333 - 120000)

5시간 30분
90000
117500
36000
52500
80000

2 단계 조건

  • 추가 조건 : 정류장 위치 데이터 추가, 정류장 너비 데이터 추가, 정류장에서 대기하는 시간 데이터 추가
  • Input
    • busData.txt

~cpp 
120000 
60   65  72   75   80 
  • busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함)

~cpp 
5400 12 5 
20000 40000 60000 80000 100000 0 
  • 버스가 정류장에서 5분간 쉬었다가 이동함
  • 문제 : 특정 시간 후의 버스의 위치는?
  • Output

~cpp 
75000
75833.3
84000
87500
93333.3

테스트

~cpp 
4시간 30분(270)
100000
100007
12000
28750
40000

3 단계

  • 추가 조건 : 버스가 출발하는 시간 간격 데이터 추가 (24분)
  • 문제 : 특정 시간 후의 버스의 위치는?
  • Input
    • busData.txt

~cpp 
120000 
60   65  72   75   80 
  • busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함, 출발하는 간격(분))

~cpp 
5400 12 5 24
20000 40000 60000 80000 100000 0 
  • Output

~cpp 
75000
55286.1
40000
20000

테스트

~cpp 

4시간 30분(270)
100000
81536.1
86440
77541.7
60000

4 단계

  • 추가 조건
    • 정류장에는 1분마다 일정한 수로 사람 수 증가(1명)
    • 버스에 탈수 있는 사람수 제한(70명)
    • 정류장에서 내리는 사람수 데이터 추가(10명)
      • 버스가 정류장에 멈추면 현재 정류장에 기다리는 모든 사람을 태우고 이동
  • 문제 : 특정 시간 후의 버스의 위치 및 버스의 승객수는?
  • Input
    • busData.txt

~cpp 
120000 
60   65  72   75   80 
  • busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함, 출발하는 간격(분), 정류장에서 사람 수 증가 율(명/분), 버스에 탈 수 있는 사람 수 ,정류장에서 내리는 사람 수)

~cpp 
5400 12 5 24 1 70 10
20000 40000 60000 80000 100000 0 
  • Output

~cpp 
75000   70
55286.1  27
40000    28
20000    23

테스트

~cpp 
4시간 30분(270)
100000    70
81536.1   70
86440      70
77541.7   70
60000      70

5 단계 조건

  • 종점에서는 모든 승객이 내린다. 종점에서는 타는 승객이 없다. (주의 - 아래 InputData에서 원하는 시간을 5400(1시간30분)이 아니라 9600(2시간40분)으로 설정함)
  • Input
    • busData.txt

~cpp 
120000 
60   65  72   75   80 
  • busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함, 출발하는 간격(분), 정류장에서 사람 수 증가 율(명/분), 버스에 탈 수 있는 사람 수 ,정류장에서 내리는 사람 수)

~cpp 
9600 12 5 24 1 70 10
20000 40000 60000 80000 100000 0 
  • Output

~cpp 
10000   0
109453  70
104440  70
85041.7 70
65377.8 46
  • 문제 : 특정 시간 후의 버스의 위치 및 버스의 승객수는?

테스트

~cpp 
2시간 40분 160분
10000    0
109453  70
104440  70
85041.7 70
65377.8 46

6시간 10분
60000    70
48202.8 7
60000    70
57541.7 44
45377.8 300      70

6 단계 조건

  • 추가 조건 : 정류장에서 버스에 탑승시 한사람당 걸리는 시간 데이터 추가
  • 문제 : 특정 시간 후의 버스의 위치 및 버스의 승객수는?
  • Input
    • busData.txt

~cpp 
120000 
60   65  72   75   80 
  • busStationData.txt(시간_초, 정류장 너비, 정류장에서 대기하는 시간-처음 출발 할때는 정류장에서는 대기안함, 출발하는 간격(분), 정류장에서 사람 수 증가 율(명/분), 버스에 탈 수 있는 사람 수 ,정류장에서 내리는 사람 수, 한사람이 버스에 타는데 걸리는 시간)

~cpp 
9600 12 5 24 1 70 10 7
20000 40000 60000 80000 100000 0 
  • Output

~cpp 
22266.7  42
10938.9   0
119040   70
95458.3  70
75111.1  46

테스트

~cpp 
2시간 40분
22266.7  42
10938.9   0
119040   70
95458.3  70
75111.1  46

5시간 40분
65116.7 59
59993.1  70
69840    70
60000    6
47888.9  11

12시간 10분
62100   40
76397.2 70
9120      0
10229.9  46
20000    46

결과 분석

  • 버스들이 몰려다니는 것을 확인할 수 있다.

결론

  • 물리적인 추측만으로 버스가 연달아 오는 경우를 생각했었는데 이를 실제로 컴퓨터로 시물레이션 함으로써 그러한 현상이 일어나는 과정도 관찰할 수 있었고, 시물레이션 하는 과정에서 여러 가지 조건을 설정하면서 각 조건에 따라서 시물레이션이 어떻게 변할지도 생각해 볼 수도 있었다. 이러한 경험은 생활 속의 물리 현상을 나의 전공과 연계해볼 수도 있구나 하는 신선한 충격이었다. 이러한 일들이 쉬운일은 아니었지만 정말 좋은 경험이 되었다.

나온 소스

소스 작성자
BusSimulation/상협BusSimulation/상협(STL) BusSimulation/상협(STL)2 상협
BusSimulation/영동 영동
BusSimulation/태훈zyint 태훈
BusSimulation/영창 영창
BusSimulation/조현태 조현태


Discrete Event Simulation이 되겠군요. 사람이 몇 명이 기다리느냐, 길 막힘 상태 등은 이산 확률 분포를 사용하면 될 것입니다. NoSmok:TheArtOfComputerProgramming에서 NoSmok:DonaldKnuth가 자기 학교 수학과 건물 엘레베이터를 몇 시간 관찰해서 데이타를 수집한 것과 비슷하게 학생들이 직접 84번, 85-1번 등의 버스를 타고 다니면서 자료 수집을 해서 그걸 시뮬레이션 실험하면 아주 많은 공부가 될 것입니다 -- 특히, 어떻게 실세계를 컴퓨터로 옮기느냐 등의 모델링 문제에 관해. 실제로 NoSmok:DonaldKnuth는 TAOCP에서 이런 연습문제를 만들어 놨습니다. 제가 학부생 때 누군가 이런 숙제를 내줬다면 아마 한 두 계단(see also 축적과변화) 올라설 계기가 되지 않았을까 하고 아쉬울 때가 있습니다. 이 문제에 드는 시간은 하루나 이틀 정도가 되겠지만 여기서 얻은 경험과 지혜는 십 년도 넘게 자신의 프로그래밍 인생에 도움이 될 것이라 믿어 의심치 않습니다. (팀으로 문제 해결을 하면 더 많은 공부가 되겠지요) see also ProgrammingPartyAfterwords 참고자료 --JuNe


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:39
Processing time 0.0293 sec