어제 기차 경로가 특정 상황에서 재설정 된다는걸 배웠음.
댓글로 누가 바닐라 ltn 해보려다가 포기했다길래 '병신같은 생각이군, 당장하자' 마인드로 바로 연구해봄.
기차 경로 메커니즘:
https://wiki.factorio.com/Railway/Train_path_finding
이 실험에서는 경로 재설정 메커니즘 중 역에서 기차가 출발할 때 경로가 설정되는 것을 이용함.
ltn이라고 한다면 기차 한 대로 여러 배송을 하는 것이 주 목적이다.
따라서 이번 실험에서는 우선순위 등 다른 부가기능은 빼고 기차 하나로 공급, 요청을 하는것에 주안점을 두었음.
대략적인 실험 스케치
ltn의 능동적인 경로 설정을 구현하기 위해 '검사역' 이라는걸 추가했다.
검사역에서 기차의 물품을 검사하고, 해당 물품을 요청한 요청역으로 기차를 보내는 시스템임.
기차 경로 설정에 붙는 페널티와 경로 재설정 조건을 이용했음.
기차 스케줄은 다음과 같다.
위에서부터 차고지, 공급역, 검사역, 요청역임.
역 이름을 모두 통일해서 하나의 기차로 전부 돌아가게 만듬.
물론 ltn처럼 기차를 더 추가해도 된다.
먼저 요청역에서 요청이 발생한다.
늘 하던 ltn처럼 원하는 품목을 -로 걸고 일정 수 이상 떨어지면 요청이 걸리게 만들었음.
철광석(1)로 발생한 요청은 초록색 전역네트워크를 따라 이동한다.
철광석 (1) 신호를 받아온 철광석 공급역이 활성화된다.
사실 활성화는 원래 되어있고 공급역의 기차수 제한을 0에서 1로 늘리는 것.
이렇게 해야 기차가 차고지에서 요청이 발생할때 까지 대기한다.
공급역에서 철광석을 실은 기차는 검사역으로 이동함.
검사역에 잠시 정차하고, 검사역은 해당 기차가 싣고 있는 품목의 요청역들에 신호를 보냄.
예를들어 철광석을 싣고 있다면 철광석 요청역들에 전부 신호가 감.
하지만 그 중 요청 신호를 보낸 요청역만이 활성화된다.
요청역 활성화는 신호 제어를 사용했음.
검사역으로부터 철광석 기차가 온다는 예보를 받았고, 이 역이 요청신호를 보냈다면 신호에 초록불이 들어옴.
그렇다면 기차는 여러 요청역들 중 오직 여기, 신호에 초록불이 들어와 접근이 가능한 이 역으로 도착하게 된다.
이 방법을 사용하면 운송 품목도 상관없고, 공급역, 요청역 개수도 상관없이 그냥 ltn처럼 돌릴 수 있음.
공급역이랑 요청역도 품목 상관없도록 회로 짜서 스택 수랑 요청량 정도만 조절해주면 됨.
유체도 될거 같은데 잘 모르겠다.
그리드 형식으로 돌리려면 검사역 전용 대기줄 딸린 그리드 하나 파야될듯.
한 가지 큰 단점은 모든 기차가 하나의 검사역을 한번에 하나씩 통과해야 된다는 거임..
거의 기차 세 개 이상은 쓰기 힘들듯...
사실 효율 따질거면 그냥 ltn 쓰면 됨 ㅋㅋ
혹시 보고있는 회로 고수 있으면 개조 부탁함.
검사역 안쓰고 될려나 이게
청사진에 모드는 아마 AAI Container 하나 들어있을 거임.
Co / 8 << 이거 왜 금지어임? 청사진 안올라가네
https://factoriobin.com/post/yi5W7KHj
검사역이 하는 역할이 경로 설정 뿐인거면 그냥 디팟을 검사역으로 써도 되지 않아? 요청이 오면 대기역 -> 공급역 -> 대기역 -> 요청역으로 가는 식으로
열차가 싣고있는 품목이 있어야 정상작동하는 로직이라 그러려면 좀 많이 뜯어고쳐야할것처럼 보임
겜 켜서 굴려봤는데 걍 우회로 하나 만들어주고 디팟 역 지우면 잘 굴러감
아 나는 예전에 포기를 했던이유가 열차수제한 기능이 생기기 전이라 기차역활성화 비활성화를 이용해서 제어했어야하는데 이러면 목적지역을 계속 켜둬야하고 목적지 제외 역들의 빨간불신호를 강제로 켜버려서 경로 패널티를 크게 줘버려서 목적지역을 인식하게 하는 방법을 하려고 했었음
근데 이 방법의 단점은 이러면 목적지역으로 출발은 잘 하는데 이런식으로 여러대의 열차가 돌아다니다가 한번 신호라도 걸리면 경로재탐색을 하게되고 이러면 새로 탐색한결과 원래목적지가 아니라 그냥 가장 가까운 하차역으로 휭 가버리는 문제가 있었음
이 글처럼 기차역활성화가 아니라 열차수제한을 조절하는 식으로 하면 원래가려던 열차가 중간에 새지도 않고 다른열차가 비집고 들어오지 않게 할 수 있겠네 괜찮은듯
아예 요청역 활성화도 기차수 제한으로 하는게 나으려나 - dc App
공급역 위치가 엄청 멀리퍼져있다면 빨간불 신호 한두개로는 패널티가 부족할수도 있으니 열차수제한 쓰는게 낫지 않을까
굉장허네
열차 10개도 못굴리면...사실상 실패네...
바닐라 ltn 구현하려다 포기한 사람 중 하나인데, 가장 큰 문제는 기차가 이동중에도 가까운 역을 주기적으로 찾으려함. 출발하고 경로설정한 역까지 가다가 도중에 같은 이름의 더 가까운 역이 있으면 갑자기 도착역을 바꿔버림. 결론적으로 그리드 반대편까지 철을 옮기던 기차가, 갑자기 중간에 가까운 구리 요청역에 갈 수도 있음.
요청역은 요청 안할 때 꺼져있으니까 뭔상관이냐 할 수 있는데, 그리드에 기차 하나만 굴릴 거 아니니까. 기차 여러개 굴리는데, 하필 운이 나빠서 요청역 하나 정해주려고 잠깐 켜면 가까운 열차가 가로챌 수도 있음. 계산 대충 해보면 확률 극악이긴 한데, 한번 발생하면 요청역 두개가 서로 꼬여버림. 동맥경화는 당연하고.
해결 방법이 없지는 않음. 이미 요청역까지 운행중인 기차가 다른 길로 안새게 하면 됨. 가까운 역을 찾는 거니까, 모든 요청역 입구에 신호기를 왕창 박아서 회로로 빨간 불 주면 경로계산상 멀다고 판단해서 안샐 거임. 물론 기차의 실제 도착역은 신호기에 파란불을 켜야겠지
이론적으로는 바닐라 LTN이 가능함. 손좀 보면 유체나 우선순위 화물 칸 수 필터링 등등 다 가능은 함. 다중상하차도 이악물고 만들면 가능은 함..... 가능은.. 함
위에 고닉도 같은 얘기를 했네. 경로패널티만 잘 주면 지금 만든 것도 충분히 잘 쓸듯.