ความซับซ้อนของเวลาของอัลกอริทึม Held-Karp สำหรับ TSP


9

เมื่อฉันดู " วิธีการเขียนโปรแกรมแบบไดนามิกเพื่อแก้ไขปัญหาลำดับ " โดย Michael Held และ Richard M. Karp ฉันพบคำถามต่อไปนี้: เหตุใดความซับซ้อนของอัลกอริธึมสำหรับ TSP จึงเป็น(k=2n1k(k1)(n1k))+(n1) (หน้า 199) ฉันหมายถึงพวกเขาใช้ปัจจัยkที่ไหน? หากฉันเข้าใจถูกต้องk1หมายถึงจำนวนการเพิ่มสำหรับแต่ละชุดย่อยของเมือง แล้วทำไมการดำเนินการแต่ละนอกจากเป็นคู่กับรู้จักกับผมkการดำเนินงาน? ฉันคิดว่ามันเชื่อมต่อกันเพื่อลดขั้นต่ำ แต่การคำนวณขั้นต่ำดูเหมือนจะไม่ต้องการการดำเนินการมากมาย

อัลกอริธึมการเขียนโปรแกรมแบบไดนามิกโดย Held และ Karp และเป็นอิสระจาก Bellman ทำงานดังนี้: สำหรับแต่ละคู่(S,ci)หมายถึงเส้นทางที่จะผ่านc1องค์ประกอบทั้งหมดของSและสิ้นสุดที่การคำนวณci

OPT[S,ci]=min{OPT[S{ci},cj]+d(cj,ci):cjS{ci}},

ที่d(cj,ci)หมายถึงระยะทางระหว่างเมืองcjและC_iciจากนั้นในสูตรจากกระดาษkหมายความว่าขนาดของSS

คำตอบ:


5

ภาคผนวกลงไปด้านล่างชี้แจงข้อกำหนดk(k1) :

ดังนั้นถ้าคุณตรวจสอบเงื่อนไขในนิพจน์คุณสามารถจินตนาการ (ตามความคล้ายคลึง)เทอมคือการแจกแจงของสตริงไบนารี่ทั้งหมดที่มี 1 ที่มี 1 ในตำแหน่งแรก กล่าวอีกนัยหนึ่งเราปล่อยให้แต่ละตำแหน่งในสตริงไบนารีแสดงตัวเลือกว่าหนึ่งในเมืองที่ระบุในปัญหานั้นอยู่ในชุดย่อยที่แน่นอนที่เรากำลังพิจารณาอยู่หรือไม่ ดังนั้นสำหรับ 5 เมือง 1,0101 สอดคล้องกับส่วนย่อย {1,3,5}(n1k)kn

ดังนั้นในการคำนวณข้ามเซตย่อยทั้งหมดของ {1, ... , } เราจะนับผ่านแต่ละเซตย่อยไบนารี (เช่นนับผ่านสตริงไบนารี่) ของขนาด = 2 (เช่นสตริงไบนารี่ขนาดที่มีสอง 1) จากนั้น ขนาด = 3 แล้วขนาด = 4, ... แล้วขนาด = n (โปรดทราบว่าชุดย่อยขนาด = 1 จะต้องประกอบด้วยเมืองแรกเท่านั้นจึงไม่เกี่ยวข้องกับการคำนวณระยะทางบางส่วนเนื่องจากระยะทางตั้งแต่ 1 -> เมืองอื่น ๆ ทั้งหมดในชุดย่อย -> 1 มีค่าเท่ากับ 0)nn

ในแต่ละชุดย่อยที่มีเมืองเราจะต้องพิจารณาเส้นทางที่เหมาะสมและบางส่วนได้สูงสุดโดยเฉพาะอย่างยิ่งเส้นทางที่ดีที่สุดทั้งหมดอาจข้ามผ่านส่วนย่อยที่กำหนดและสิ้นสุดในเมืองๆ ยกเว้นเมืองแรก จากนั้นสำหรับแต่ละเส้นทางย่อยของผู้สมัครเราคำนวณการเดินทางที่ดีที่สุดจนถึงจุดต่ำสุดของเส้นทางย่อยขนาด =ก่อนหน้าใด ๆบวกระยะทางจากเมืองปลายทางสำหรับเส้นทางย่อยนั้นไปยัง เทอร์มินัลซิตี้สำหรับเส้นทางย่อยของผู้สมัครปัจจุบัน สิ่งนี้ให้การเปรียบเทียบดังกล่าวที่เราต้องทำ ความแตกต่างระหว่างเทอมของฉันและkk1k1k1(k1)(k2)(k1)(k2)k(k1)คำในการวิเคราะห์ที่เชื่อมโยงกันเป็นความแตกต่างที่เป็นสัญกรณ์ (ฉันจะรวมช่วงที่ต่างกันให้นิยามของมากกว่าที่ทำ) อย่างน้อยที่สุดก็ควรแสดงให้เห็นถึงความซับซ้อนของกำลังสองของคำนั้นk


น่าสนใจมาก - ฉันเพิ่งเขียนโค้ดอัลกอริธึมที่แน่นอนนี้ขึ้นใน C ++ ไม่กี่นาทีที่ผ่านมา (ดังนั้นให้อภัยแทนเจนต์จากทฤษฏีบริสุทธิ์ไปสู่การสนทนาเชิงปฏิบัติเล็กน้อย :))

มันมีค่าใช้จ่ายเวลาและพื้นที่ - อย่างน้อยภายใต้การใช้งานของฉัน แม้ว่าในทางปฏิบัติเมื่อความต้องการพื้นที่ของคุณเพิ่มขึ้นอย่างรวดเร็วพวกเขาก็เจ็บปวดกว่าเวลาที่กำหนด ตัวอย่างเช่นบนพีซีของฉัน (ที่มี RAM 4 GB) ฉันสามารถแก้ปัญหาอินสแตนซ์ที่มีได้ถึง 24 เมือง - ยิ่งไปกว่านั้นและฉันมีหน่วยความจำไม่เพียงพอO(2nn2)O(2nn)

แน่นอนฉันอาจเป็นโปรแกรมเมอร์ที่ไม่ดีและคุณอาจทำได้ดีกว่าฉันในทางปฏิบัติ :)

แก้ไข: มีรายละเอียดเพิ่มเติมเกี่ยวกับคำถามของคุณเพียงเล็กน้อย: เทอมมาจากข้อเท็จจริงที่ว่าคุณต้องคำนวณระยะทางที่เหมาะสมที่สุดจากชุดย่อยก่อนหน้า (ในกรณีส่วนใหญ่)ของพวกเขาโปรดทราบว่าถูกหาผลรวมในการวิเคราะห์ที่คุณเชื่อมโยง) กับค่าปัจจุบัน นี้ต้องใช้อีกครั้งในกรณีที่เลวร้ายที่สุดเปรียบเทียบกับขนาดย่อยของรวมเป็น2)k(k1)nknO(k)k1O(k2)

นอกจากนี้หากคำอธิบายของฉันไม่ชัดเจนพอนี่คือบันทึกการบรรยายที่ดีของ Vazirani ( PDF ) เลื่อนลงมาที่หน้า 188 เพื่อหารือเกี่ยวกับ TSP รวมถึงการวิเคราะห์ Held-Karp


โอ้แน่นอน! ตอนนี้ฉันรู้สึกเซ่อคิดอยู่ ฉันจะอัปเดตคำตอบของฉัน ฉันเคยได้ยินความคิดเห็นที่แน่นอนก่อนหน้านี้และเพิ่งส่งต่อโดยไม่ต้องคิด และใช่ - การเขียนไปที่ไฟล์ / การอ่านจากไฟล์จะช่วยให้คุณไปได้อย่างมีประสิทธิภาพสูงตามจำนวนเมือง ... มันเป็นความเจ็บปวดที่ไม่น่ากังวลหากคุณกำลังพยายามแก้ไขอินสแตนซ์ของ TSP เพื่อจุดประสงค์ที่แท้จริง ฉันก็ไม่ได้มีวัตถุประสงค์เพื่อการปฏิบัติจริง ;)
Daniel Apon

2
ใช้เวลาในการดำเนินการตามขั้นตอนวิธีการ Bjorklund :)
Suresh Venkat

@Suresh: ความคิดที่ดี!
Daniel Apon

@Daniel Apon คุณช่วยกรุณาทำให้ถูกต้องว่าทำไมเราต้องทำการเปรียบเทียบเมื่อคำนวณ "ระยะทางที่เหมาะสมบางส่วน"
Oleksandr Bondarenko

@Oleksandr: แน่นอนฉันจะเพิ่มไปที่ด้านบนของคำตอบของฉัน
Daniel Apon

0

หมายเหตุหลัก

โปรดทราบว่าเราคำนวณและจัดเก็บไม่ใช่
"ระยะทางของเส้นทางที่เหมาะสมที่สุดcombination of k cities"
แต่
"ระยะทางเส้นทางที่เหมาะสมที่สุดสำหรับcombination of k cities และสำหรับend-point city from this combination"
การทำความเข้าใจจะช่วยให้มีความหมายของตัวคูณสองตัวแรกในสูตรต่อไปนี้

ระยะแรก

จำนวนการดำเนินการในระยะแรกคือ:

k>=2(n1k1)choose city combinationof size = k1(k1)choose city to be the lastfrom k1 citiesin chosen combination((n1)(k1))choose citythat is not in chosen combinationto add to path

for all k>=2 that is valid for binomial coefficientที่ขาดหายไปในยกผลรวมหมายถึง ดังนั้นคำที่ถูกต้องไม่เป็นโมฆะของผลรวมจะเป็น นั่นหมายความว่าผลรวมของเราไม่จับตัวเลือกสุดท้าย เพื่อเชื่อมต่อกับเมืองแรก มีเมืองจะเชื่อมต่อกับเมืองแรก ดังนั้นในที่สุดเราจะเพิ่มคำนี้ลงในผลรวมk=n1

(n1n2)(n2)1
n1

อนุญาตเปลี่ยนสูตรในรูปแบบที่คุณให้ว่าก็ยัง ถือคาร์พหน้าวิกิพีเดีย

k>=2(n1k1)(k1)((n1)(k1))=k>=2(n1)!(k1)!(nk)!(k1)(nk)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n1k)k(k1)
การจัดการสัมประสิทธิ์ทวินามนำไปสู่: ดังนั้นจำนวนการดำเนินการในครั้งแรก เฟสคือ
k>=2(n1k)k(k1)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n3)!(k2)!(n3(k2))!(n1)(n2)=(n1)(n2)k>=2(n3k2)=(n1)(n2)2n3
(n1)(n2)2n3+(n1)

ระยะที่สอง

ขั้นตอนที่สองคือการกู้คืนเส้นทางที่ดีที่สุดด้วยเครื่องหมายที่เราทำในระยะแรกพร้อมกับระยะการคำนวณ

สำหรับแต่ละเส้นทางที่ดีที่สุด "สำหรับcombination of k cities และสำหรับend-point city from this combination" เราได้บันทึกเมืองที่สองไปยังหน้าสุดท้ายแล้ว

ในการย้อนเส้นทางที่ดีที่สุดเราจำเป็นต้องขอโครงสร้างข้อมูลบางอย่างเพื่อส่งคืนเมืองที่สองไปยังท้าย "สำหรับcombination of k cities และสำหรับend-point city from this combination" ดังนั้นโครงสร้างข้อมูลนี้ต้องเป็นอย่าง
Map<combination of k cities, Map<last city, second-to-last city>>นั้น ในฐานะที่เป็นดัชนีของเราสามารถใช้ยกตัวอย่างเช่นcombination of k cities binary_string[city id]=1 if city id is in combinationดังนั้นเราจำเป็นต้องดูองค์ประกอบทั้งหมดของcombination of k citiesการระบุชุดค่าและดัชนีโครงสร้างข้อมูลของเรา สิ่งนี้ทำให้เรามีจำนวนการดำเนินงานสำหรับเฟสที่สอง:

k>=2n1k=(n)(n1)21

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.