ลิฟต์ใช้อัลกอริทึมใดในการค้นหาเส้นทางที่สั้นที่สุดในการเดินทางไปยังคำสั่งซื้อที่พื้น


27

ฉันพยายามที่จะจำลองลิฟต์เช่นเคยฉันเริ่มง่ายมากโดยการสั่งซื้อครั้งเดียวเพียงครั้งเดียวแล้วเพิ่มหน่วยความจำในลิฟต์ในรูปแบบของคิวเพื่อให้ชั้นจะเดินทางตามลำดับที่พวกเขากด ซึ่งเห็นได้ชัดว่าไม่ใช่วิธีที่ดีที่สุด

ดังนั้นในขณะนี้ฉันใช้ตรรกะที่เรียบง่ายและ "สายตาสั้น" ซึ่งก็คือสำหรับชั้นปัจจุบันหาพื้นที่อยู่ใกล้ฉันที่สุดและตั้งเป็นปลายทางต่อไปของฉันและวนไปเรื่อย ๆ จนไม่มีชั้นอื่น ๆ อยู่ในรายการ

แต่มันไม่ได้ผลเสมอไปตัวอย่างเช่นลิฟต์อยู่ที่ชั้น 3 ของอาคาร 5 ชั้นและได้รับคำสั่ง 4,5,2 เส้นทางที่สั้นที่สุดจะเป็น 2-> 4-> 5 ซึ่งมีค่าใช้จ่าย 4 ชั้น แต่ใช้ตรรกะนี้ 4-> 5-> 2 ซึ่งมีค่าใช้จ่าย 5 มีโอกาสถูกเลือกขึ้นอยู่กับรหัส

ฉันจะค้นหาเส้นทางที่สั้นที่สุดและทำให้ลิฟต์มีประสิทธิภาพมากขึ้นได้อย่างไร


2
ค่อนข้างเกี่ยวข้อง: programmers.stackexchange.com/q/96278/149904
manlio

6
ฉันอยากเชิญคุณมาที่สำนักงานของฉันและหาอัลกอริทึมที่ลิฟต์ใช้งาน เพราะฉันไม่สามารถอย่างแน่นอน
gnasher729

1
@ gnasher729 โอ้ฉันทำได้แม้ว่าฉันจะไม่รู้จักคุณเพราะมันเหมือนกับที่อยู่ในออฟฟิศของฉัน: ไม่เคยหยุดอยู่บนพื้นฉันเข้าได้ยกเว้นเมื่อมีคนเต็มไปหมดแล้ว ฉันถูกไหม?
Andres F.

2
ไม่มาก มีลิฟท์สี่ตัว คุณกดปุ่มไม่มีอะไรเคลื่อนไหวเป็นเวลานานมาก หากมีใครเคลื่อนย้ายมันจะหยุดลงก่อนที่พื้นของคุณและรอเป็นเวลานานจนกว่ามันจะถูกแซงโดยอีกอันหนึ่งซึ่งไหลผ่านพื้นของคุณจากนั้นก็ลงมา ระหว่างทางลงสู่พื้นดินจะหยุดอย่างน้อยสามครั้งโดยไม่มีใครเข้ามา
gnasher729

2
เกม / การเขียนโปรแกรมที่เกี่ยวข้อง: play.elevatorsaga.com
dwikle

คำตอบ:


30

"ประสิทธิภาพ" ไม่ใช่คุณสมบัติที่สำคัญที่สุดสิ่งสำคัญที่สุดคือการตรวจสอบให้แน่ใจว่ามีการปฏิบัติตามคำสั่งซื้อทุกครั้งไม่มีความอดอยาก ถ้ามีคนกด 100 และคนกด 1 และ 2 ต่อไปมันอาจจะมีประสิทธิภาพในการเดินไปมาระหว่างชั้นเหล่านั้น แต่มันก็ดีสำหรับ 100 ที่จะมาเยี่ยมในบางจุด

ฉันคิดว่า (จากการสังเกตส่วนตัวเมื่อฉันสนใจที่จะหา) ว่าพวกเขาส่วนใหญ่ทำ:

  1. เริ่มไปในทิศทางของปุ่มแรกที่กดติดตามทิศทางที่เรากำลังไป
  2. เมื่อถึงชั้นและกดปุ่มนั้นหยุดและเปิดประตูทำเครื่องหมายปุ่มสำหรับชั้นนี้ว่าไม่ได้กดอีกต่อไป
    • หากยังมีชั้นอื่น ๆ ที่เราจำเป็นต้องเยี่ยมชมที่อยู่ในทิศทางเดียวกันให้ไปในทิศทางนั้น
    • ถ้าไม่และยังมีชั้นที่เราต้องไปให้ย้ายไปในทิศทางนั้น
    • ถ้าไม่ใช่เราก็เสร็จแล้วและจะเริ่มต้นที่ 1 เมื่อกดปุ่มอีกครั้ง

โปรดทราบว่าลิฟต์หลายตัวมีปุ่ม "ฉันอยากขึ้นไป" และ "ฉันอยากลงไป" ข้างๆประตูแทนที่จะเป็นปุ่มเดียว อัลกอริทึมต้องการการเปลี่ยนแปลงเพียงเล็กน้อย: ใน 2 หากปุ่มเดียวที่กดสำหรับชั้นนั้นเป็นหนึ่งในปุ่มที่อยู่ติดกับประตูหยุดและเปิดประตูเท่านั้นหากเราไปในทิศทางนั้น อาจกดปุ่มค้างไว้หากประตูเปิดเพราะมีปุ่มกดอยู่ภายในลิฟต์และมันไปในทิศทางที่ผิด

คุณไม่ต้องคิดหาเส้นทางทั้งหมดในทิศทางที่จะไปต่อไป


สิ่งนี้ข้ามความคิดของฉันไปอย่างสิ้นเชิงฉันให้ความสำคัญกับประสิทธิภาพและลืมสิ่งอื่น ๆ ที่สำคัญเช่นกัน มันยังคงไม่มีประสิทธิภาพที่จะพูดตั้งแต่ 2-> 100 และกลับไปที่ 1 เพียงเพราะมันไปในทิศทางเดียวกัน แต่อย่างน้อยก็ทำให้แน่ใจว่าไม่มีความอดอยาก และหากไม่ได้อยู่ในหัวข้อทั้งหมดนี่อาจเป็นเหตุผลว่าทำไมการพบลิฟต์สองตัวด้วยตรรกะนี้ ซึ่งทำให้ฉันสงสัยว่ามันเป็นเรื่องธรรมดาหรือเปล่าที่จะพบว่าลิฟต์ไปในทิศทางตรงกันข้ามในเวลาใดก็ตาม ยังไงก็ตามฉันยังคงสงสัยว่าจะหาเส้นทางที่สั้นที่สุดได้อย่างไร แต่นี่จะตอบคำถามของฉันได้อย่างเรียบร้อยขอบคุณมาก
Raed Tabani

7
โปรดทราบว่าเมื่อคุณไปถึงอาคารที่มี 100 ชั้นโดยทั่วไปคุณจะมีลิฟต์ที่ให้บริการเฉพาะช่วงของชั้นที่เฉพาะเจาะจง (เช่น 0-19, 20-39, …) รวมถึงลิฟต์ด่วนที่ไปไกลเท่านั้น (เช่น 0 เป็น 50, 0 ถึง 100, 50 ถึง 100 แต่ไม่มีชั้นในระหว่าง) ดังนั้นคุณอาจต้องเปลี่ยนลิฟต์เพื่อไปยังจุดหมายปลายทางของคุณ คุณอาจมีลิฟต์หลายตัวต่อเพลาซึ่งไม่สามารถผ่านกันและกันได้ โดยสิ้นเชิงนอกหัวข้อ: IIRC มีคำถามเกี่ยวกับประสิทธิภาพของปุ่มลูกศรขึ้นและลงบนไซต์ประสบการณ์ผู้ใช้ที่สร้างขึ้นเพื่อการอ่านที่น่าสนใจมาก
Jörg W Mittag

ขอบคุณฉันไม่รู้ การแบ่งย่อยดูเหมือนจะเป็นกลยุทธ์ที่ดีถ้าส่วนใดส่วนหนึ่งพังทั้งระบบไม่ได้และเพื่อกระจายโหลดซึ่งเป็นสิ่งสำคัญสำหรับการสึกหรอทางกล ฉันสงสัยว่าลิฟต์แบบเร่งด่วนเหล่านี้เกิดจากความบกพร่องทางตรรกะของอัลกอรึทึมของ Knuth หรือไม่
Raed Tabani

สิ่งเดียวที่ฉันเพิ่มคือบ่อยครั้งที่พวกเขามีพื้น 'บ้าน' ที่พวกเขาจะกลับไปเมื่อไม่ใช้งานนี้อาจแตกต่างกันไปสำหรับลิฟต์ที่แตกต่างกันและอาจมีการเปลี่ยนแปลงขึ้นอยู่กับเวลาของวันและรูปแบบการใช้ที่คาดหวัง
jk .

ฉันมีแนวโน้มที่จะกดปุ่มขึ้น / ลงแบบกึ่งสุ่มโดยไม่คำนึงถึงทิศทางที่ฉันเดินทางในกรณีของฉันฉันมีปลายทางเดียวเท่านั้นดังนั้นลิฟต์จะนำฉันไปยังที่ตั้งโดยไม่คำนึงว่าฉันเลือกขึ้นหรือ ลง. ฉันสงสัยว่าถ้าฉันต้องกดปุ่มลงให้เลือกชั้นที่อยู่ด้านบนของฉันแล้วเลือกชั้นที่อยู่ด้านล่างของฉันก่อนที่ลิฟท์จะเริ่มเคลื่อนไหวมันจะพาฉันไปที่พื้นด้านล่างของฉันมากกว่าชั้นที่ฉันผลักก่อน ฉันอาจจะผิดฉันจะต้องแน่ใจว่าได้ทดสอบในครั้งต่อไปที่ฉันพบว่าตัวเองอยู่ในลิฟต์
Ucenna

13

คำตอบอื่น ๆ อย่างถูกต้องให้อัลกอริทึมลิฟต์มาตรฐานซึ่งโดยทั่วไปแล้ว "ไปในทิศทางเดียวกันให้นานที่สุดและหยุดทุกครั้งที่จำเป็นไปพร้อมกัน"

มีอัลกอริทึมลิฟต์อื่น ๆ ตัวอย่างเช่นพิจารณาอาคารอพาร์ตเมนต์ที่อพาร์ทเมนต์มีราคาแพงกว่าเมื่อคุณขึ้นไป เจ้าของอาคารอาจเลือกที่จะปรับเปลี่ยนอัลกอริทึมลิฟต์เพื่อ "ไปในทิศทางเดียวกันตราบเท่าที่จะทำได้ แต่หยุดลงเท่านั้น" ด้วยวิธีนี้หากคุณมีคนในลิฟต์ที่อยู่ในล็อบบี้และกำลังจะไปที่ 2, 5 และ 10 ลิฟท์จะไปที่ 10 จากนั้น 5 จากนั้น 2 จากนั้น 2 คนจะลดลงตามลำดับว่าพวกเขาจ่ายค่าเช่าเท่าใด แต่แน่นอนว่าเมื่อผู้คนใน 10 คนออกจากอพาร์ตเมนต์พวกเขามักจะต้องรอนานกว่านี้เพื่อไปที่ล็อบบี้

หากคุณกำลังมองหาโซลูชันที่มีประสิทธิภาพคุณจะต้องใช้ตัวชี้วัดด้านราคาและใช้อัลกอริธึมที่แตกต่างกันมากมายและทำการจำลอง อย่าลืมวัดผลไม่เพียง แต่ต้นทุนโดยเฉลี่ยเท่านั้น แต่ยังต้องใช้เมตริกเช่นคำขอที่ยาวที่สุดที่จะได้รับการบริการ การเพิ่มประสิทธิภาพสำหรับค่าเฉลี่ยต่ำในบางครั้งสามารถลดขนาดกรณีที่เลวร้ายที่สุดซึ่งไม่ดี


1
ดูเหมือนว่าจะเป็นของหายาก (alogirthms อื่น ๆ )
FindOutIslamNow

10

โปรดทราบว่าลิฟต์จะใช้อัลกอริธึมการจัดตารางเวลาเดียวกันกับตัวควบคุมฮาร์ดไดรฟ์บางตัว อัลกอริทึม SCAN มาตรฐานเป็นที่รู้จักกันเช่นเดียวกับขั้นตอนวิธีการลิฟท์ ฉันคิดว่าในทางปฏิบัติอัลกอริธึมLOOKนั้นใช้กันทั่วไปมากกว่าเนื่องจากมีประสิทธิภาพมากกว่า SCAN เล็กน้อย


เมื่อคุณพูดอย่างนั้นคุณมีประสบการณ์ระดับมืออาชีพในการนำรหัสไปใช้กับลิฟต์หรือไม่ โดยเฉพาะระบบลิฟต์รุ่นใหม่ ฉันอยากรู้ว่าถ้าหลังจาก 9/11 ในนิวยอร์คมีความสำคัญสูงกว่าในการส่งผู้โดยสารลงและนำพวกเขาขึ้นมา
John Zabroski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.