BusSimulation ¶
- 원래 대안언어 축제 코드 첼린지에 6단계까지 해서 내려던 문제인데(답 검증을 못한 관계로 2단계로 축소후 일부 문제로만 냄) 이왕 만든거 아까워서 이렇게 올림 - 상협
- 우리는 보통 버스를 기다릴 때 버스가 한꺼번에 오는 경우를 종종 보게 된다. 버스가 처음에 출발할 때는 일정한 간격으로 출발하였을 텐데 이렇게 몰려다니는 이유는 무엇일까? 이 이유를 컴퓨터로 시물레이션 해본다. 초기 단계에서는 최대한 간단하게 시작해서 점차 현실을 반영하는 시물레이션 으로 만들어 나간다. 하위 단계를 무시하고 다음 단계로 올라갈 수 없으면 순차적으로 시물레이션 단계를 올라간다.
- Data Input - 시물레이션 데이터는 busData.txt 와 busStationData.txt 두 가지 로부터 받아들인다. 각 데이터의 값은 단계가 올라감에 따라서 추가되어간다.
- User Input - 사용자는 자신이 원하는 시간 후의 시물레이션 결과를 볼 수 있다. 시간과 분을 입력받는다.
- Output - 출력결과는 버스의 위치(단위 meter), 단계에 따라서 승객 수를 출력한다.
1 단계 ¶
- 조건 : 버스의 속력, 총운행구간 거리
- 문제 : 특정 시간 후의 버스의 위치는?
- Input
- busData.txt
- 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
- 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
- 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명)
- 버스가 정류장에 멈추면 현재 정류장에 기다리는 모든 사람을 태우고 이동
- 버스가 정류장에 멈추면 현재 정류장에 기다리는 모든 사람을 태우고 이동
- 정류장에는 1분마다 일정한 수로 사람 수 증가(1명)
- 문제 : 특정 시간 후의 버스의 위치 및 버스의 승객수는?
- Input
- busData.txt
- 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
- 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
- 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이 되겠군요. 사람이 몇 명이 기다리느냐, 길 막힘 상태 등은 이산 확률 분포를 사용하면 될 것입니다. TheArtOfComputerProgramming에서 DonaldKnuth가 자기 학교 수학과 건물 엘레베이터를 몇 시간 관찰해서 데이타를 수집한 것과 비슷하게 학생들이 직접 84번, 85-1번 등의 버스를 타고 다니면서 자료 수집을 해서 그걸 시뮬레이션 실험하면 아주 많은 공부가 될 것입니다 -- 특히, 어떻게 실세계를 컴퓨터로 옮기느냐 등의 모델링 문제에 관해. 실제로 DonaldKnuth는 TAOCP에서 이런 연습문제를 만들어 놨습니다. 제가 학부생 때 누군가 이런 숙제를 내줬다면 아마 한 두 계단(see also 축적과변화) 올라설 계기가 되지 않았을까 하고 아쉬울 때가 있습니다. 이 문제에 드는 시간은 하루나 이틀 정도가 되겠지만 여기서 얻은 경험과 지혜는 십 년도 넘게 자신의 프로그래밍 인생에 도움이 될 것이라 믿어 의심치 않습니다. (팀으로 문제 해결을 하면 더 많은 공부가 되겠지요) see also ProgrammingPartyAfterwords 참고자료 --JuNe
see also 데블스캠프2002