= 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 ---- see also ["데블스캠프2002"] ---- ["문제분류"]