ก่อนอื่นมีพื้นหลังเล็กน้อย
ฉันทำงานให้กับ บริษัท ขนส่งในภูมิภาค เรากำลังทำการ "วินิจฉัย" เกี่ยวกับบริการรถบัสของเรา เราต้องการทราบว่าสัดส่วนของผู้ใช้ของเราสามารถขึ้นรถบัสเพื่อไปที่สถานีรถไฟแทนที่จะนั่งรถของพวกเขาได้ ผ่านไปหลายครั้ง แต่ตอนนี้เราใช้ gtfs เป็นแหล่งข้อมูลหลักของเราดังนั้นเราจึงต้องทบทวนวิธีการของเราใหม่
หากต้องการได้รับการพิจารณาให้เป็น "การให้อาหาร" รถไฟเส้นทางรถเมล์ต้องหยุดภายในระยะทางที่กำหนดจากสถานีรถไฟ (บัฟเฟอร์สีแดง) การซิงโครไนซ์กับบริการรถไฟนั้นสำคัญมากเพราะถ้ารถบัสของคุณมาถึงสถานีรถไฟครึ่งชั่วโมงก่อนรถไฟเวลาที่รอจะนานเกินไปและคุณจะต้องนอนอีก 20 นาทีในตอนเช้าและขึ้นรถของคุณ
สมมติว่าคุณใช้สาย A (สีฟ้า) ที่ป้าย 12 คุณก้าวออกจากรถที่ป้าย 13 รถบัสมาถึงที่ป้าย 13 ซึ่งเป็นป้ายหยุดเพื่อไปที่สถานีรถไฟ # 1 5 นาทีก่อนรถไฟ นั่นเป็นสิ่งที่ดีมาก นั่นหมายความว่าทุกคนที่ใช้เส้นทางรถเมล์ที่ป้าย 1-13 รวมถึง 5 นาทีก่อนรถไฟ
จากนั้นรถไฟจะผ่านบริเวณที่มีประชากรหนาแน่นมากโดยมีโรงเรียนและทางแยกถูกบังคับให้ลดความเร็วลงมาก ในขณะเดียวกันรถบัสจะไปรับผู้โดยสารที่ป้ายที่ 14 ถึง 17 และมาถึงที่สถานีรถไฟ # 2 10 นาทีก่อนรถไฟ ผู้โดยสารนั่งรถบัสที่ป้าย 14 ถึง 17 ทุกคนจะมีเวลารอ 10 นาทีเมื่อมาถึงสถานีรถไฟ ดังนั้นตามแนวรถบัสผู้โดยสารที่ขึ้นรถบัสที่ป้ายที่ 1 ถึง 13 มีเวลารอ 5 นาทีเมื่อผู้ที่ขึ้นรถที่ป้ายที่ 14 ถึง 17 มีเวลารอ 10 นาที
บรรทัด B ในอีกด้านหนึ่งของเส้นทางผ่านใกล้สถานีรถไฟหมายเลข 1 แต่จุดจอดนั้นไกลเกินกว่าที่จะพิจารณาว่า "ให้อาหาร" สถานีรถไฟ # 1 มาถึงที่สถานีรถไฟ # 2 7 นาทีก่อนรถไฟ (ลงมือทำทุกขบวนในช่วงชั่วโมงเร่งด่วนตอนเช้า ดังนั้นผู้โดยสารตามสาย B ขึ้นรถบัสทุกที่ตั้งแต่ป้าย 1 ถึง 59 จะมีเวลารอ 7 นาที
ตอนนี้คำถามของฉัน เมื่อฉันได้พิจารณาแล้วว่าหยุด LineA.13 และ LineA.17 กำลังให้อาหารรถไฟของฉัน (มันถูกทำในเชิงพื้นที่ใน PostGIS) และเวลาที่รอคอยเมื่อขึ้นรถบัสที่ป้ายก่อนหน้า # 13 คือ 5 นาที แต่หลังจากนั้น เวลารอ 10 นาทีฉันจะกำหนดเวลารอให้หยุดทั้งหมดก่อนพวกเขาได้อย่างไร
ฉันต้องการทำใน Postgres / PostGIS (pl / pgsql หรือ pl / python) แต่ฉันสามารถใช้ python บริสุทธิ์ (OS หรือ arcpy) ได้เช่นกัน
ฉันทำได้ฉันคิดว่าวนไปข้างหลัง ดังนั้นเมื่อฉันพบจุดหยุดที่เหมาะกับ (ที่นี่ LineA.17) ให้กำหนดเวลารอเดียวกันเพื่อหยุด 16 และ 15 ... จนกว่าฉันจะพบจุดหยุดที่ตรงกับเกณฑ์ของฉัน (LineA.13) แล้วกำหนดส่วนที่เหลือ ของการหยุดเวลารอเดียวกับ 13
ฉันไม่รู้ว่าจะสร้างลูปอย่างไร ฉันไม่คิดว่าฉันสามารถทำได้ใน SQL ดังนั้นฉันจึงต้องใช้ภาษาขั้นตอนใน PostgreSQL
ฉันมีความคิดในการใช้ pgRouting เพื่อค้นหาเส้นทางระหว่างตัวป้อนแต่ละตัวหยุดเพื่อให้วิธีนั้น Line A จะแยกออกเป็นสองส่วน (หยุด 1 ถึง 13 และ 13 ถึง 17) จะง่ายกว่านี้ไหม
ขั้นตอนต่อไปคือการใช้ pgRouting เพื่อคำนวณเวลาการขับรถจากจุดหยุดทั้งหมดที่มีเวลารอ (ขออภัย LineA.18 ขึ้นไป!) และเปรียบเทียบกับตารางเวลาของรถบัสเพื่อคำนวณความสามารถในการแข่งขัน (ใช้เวลา 5 อีกไม่กี่นาทีในรถบัสที่อยู่ในรถ?)
ความคิดใด ๆ ปกติแล้วฉันจะโพสต์สคริปต์ที่กำลังดำเนินการอยู่เป็นเวลานานเพื่อแสดงความพยายามที่ฉันทำมาจนถึงตอนนี้ แต่ฉันก็ยังติดอยู่!