E D R , A S I H C RSS

Bus Simulation

BusSimulation

  • 원래 대안언어 축제 코드 첼린지에 6단계까지 해서 내려던 문제인데(답 검증을 못한 관계로 2단계로 축소후 일부 문제로만 냄) 왕 만든거 아까워서 렇게 올림 - 상협
  • 우리는 보통 버스를 기다릴 때 버스가 한꺼번에 오는 경우를 종종 보게 된다. 버스가 처음에 출발할 때는 일정한 간격으로 출발하였을 텐데 렇게 몰려다니는 유는 무엇일까? 유를 컴퓨터로 시물레션 해본다. 초기 단계에서는 최대한 간단하게 시작해서 점차 현실을 반영하는 시물레션 으로 만들어 나간다. 하위 단계를 무시하고 다음 단계로 올라갈 수 없으면 순차적으로 시물레션 단계를 올라간다.
  • Data Input - 시물레션 데터는 busData.txt 와 busStationData.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.0637 sec