ฉันจะทดสอบอัลกอริทึมฮิวริสติกได้อย่างไร


10

สมมติว่าเรามีอัลกอริทึมการค้นหาเส้นทางของเรา:

def myHeuristicTSP(graph):
    /*implementation*/
    return route

ตอนนี้เราต้องการทดสอบหน่วยนี้:

class TestMyHeuristicTSP:
    def testNullGraphRaiseValueError(self):
        self.assertRaises(ValueError, myHueristicTSP(None))

    def testSimpleTwoNodeGraphReturnsRoute:
        self.assertEquals(expectedResult, myHeuristicTSP(input))

คำถามคือสำหรับอัลกอริทึม TSP ที่ไม่ใช่การแก้ปัญหาเราสามารถให้กราฟที่หลากหลายและตรวจสอบว่าพวกเขากลับเส้นทางที่สั้นที่สุดเสมอ

แต่เนื่องจากอัลกอริทึมฮิวริสติกในขณะที่ยังคงสามารถกำหนดค่าได้คาดเดาได้น้อยกว่านั้นมีความหมายเพียงเพื่อให้เข้าใจว่าอัลกอริทึมนั้นใช้งานได้อย่างไรและค้นหากรณีขอบเหล่านั้นหรือไม่


คำตอบ:


11

สำหรับอัลกอริทึมแบบฮิวริสติกซึ่งคาดว่าจะไม่ส่งคืนอุดมคติ แต่เป็นวิธีการแก้ปัญหา "ดีพอ" คุณจะมีกรณีทดสอบและตรวจสอบต่าง ๆ

  1. การแก้ปัญหาจริงหรือไม่ แน่นอนคุณต้องการให้แน่ใจว่าอัลกอริทึมการค้นหาเส้นทางของคุณไม่ส่งคืนพา ธ ที่เป็นไปไม่ได้หรือที่ไม่ได้นำไปสู่ตั้งแต่ต้นจนจบ คุณอาจไม่สามารถพิสูจน์ได้ว่าโซลูชันนั้นเหมาะสมที่สุด แต่อย่างน้อยคุณควรสามารถตรวจสอบได้ว่าค่าส่งคืนเป็นโซลูชันจริงหรือไม่
  2. การแก้ปัญหาคือ "ดีพอ"? คุณควรมีข้อกำหนดบางประการซึ่งกำหนดว่าอัลกอริธึมที่แย่กว่านั้นอาจเป็นทางออกที่ดีที่สุด คุณควรมีกรณีทดสอบที่รู้จักโซลูชันในอุดมคติ (หรืออย่างน้อยโซลูชันที่ถือว่าดีพอที่จะใช้เป็นมาตรฐานการเปรียบเทียบ) และยืนยันว่าโซลูชันที่จัดทำโดยอัลกอริทึมนั้นไม่เลวร้ายยิ่งกว่า x%
  3. อัลกอริทึมเร็วเพียงพอหรือไม่ คุณมักจะใช้วิธีแก้ปัญหาแบบฮิวริสติกเมื่อคุณคิดว่าพวกเขาประกอบไปด้วยการขาดความแม่นยำโดยเร็วขึ้นมาก ในการตรวจสอบสิ่งนี้คุณควรวัดรันไทม์ของพวกเขาและตรวจสอบให้แน่ใจว่าพวกเขาเร็วกว่าอัลกอริทึมที่ได้รับโซลูชันที่แน่นอน การวัดรันไทม์นั้นค่อนข้างคลุมเครือดังนั้นการคาดการณ์เกินกว่าที่ควรจะเป็นคำเตือนไม่ใช่ข้อผิดพลาด (เมื่อกรอบการทดสอบหน่วยของคุณอนุญาตให้แตกต่างกันระหว่างคำเตือนและข้อผิดพลาด)

คุณสามารถให้คำแนะนำสำหรับการทดสอบวิธีกำหนดเส้นทางที่ถูกต้องได้หรือไม่?
dwjohnston

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

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

3

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

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

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

ถ้าคุณไม่ได้มองหาการทดสอบหน่วย แต่ยอมรับอัตโนมัติหรือบูรณาการการทดสอบคุณสามารถลองสิ่ง@Phillip ปัญหาตาม (2) หรือ (3)

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