การทดสอบอัลกอริธึม (แบบกำหนดค่าได้) ที่มีหลายหรือยากที่จะพิสูจน์คำตอบที่ถูกต้อง


11

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

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

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

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

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

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

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


3
หากภาษาอนุญาตให้คุณสามารถพิสูจน์ความถูกต้องแทนการทดสอบ
miniBill

มีข้อความจำนวนมาก แต่ไม่มีคำถาม แล้วคุณจะถามว่าอะไร
BЈовић

@ BЈовић "ฉันจะทดสอบการใช้อัลกอริทึมที่มีหลายและ / หรือยากที่จะตรวจสอบผลลัพธ์ที่ถูกต้องได้อย่างไร" ฉันไม่แน่ใจว่าจะทำให้ชัดเจนขึ้นได้อย่างไรขอโทษ ฉันจะให้มันได้รับการพิจารณาเป็นวงกว้างขึ้นอยู่กับมุมมองของคุณ แต่ฉันไม่คิดว่ามันจะไม่ได้กำหนด
LinearZoetrope

ฉันยังไม่เข้าใจ อัลกอริทึมของคุณไม่ได้ขึ้นอยู่กับการสุ่ม แต่ก็ยังสามารถสร้างผลลัพธ์ที่แตกต่างกัน ไม่สมเหตุสมผลเลย อัลกอริทึมทุกชุดอินพุตต้องมีเอาต์พุตเหมือนกัน และนั่นคือสิ่งที่ทำและทดสอบในการทดสอบหน่วย แม้แต่อัลกอริทึมในกระดาษที่คุณเชื่อมโยง
BЈовић

@ BЈовићแน่นอนว่ามันสามารถกำหนดได้ แต่ก็มีความอ่อนไหวมากเช่นลำดับที่กราฟส่งคืนตัวตายตัวแทนของโหนด มันสามารถทำให้เกิดผลกระทบผีเสื้อเล็กน้อย ไม่ว่าคุณจะกดจุดสุดยอด A บนสแต็กก่อนที่จุดสุดยอด B จะนำไปสู่เอาต์พุตอื่นหากทั้งคู่นำไปสู่เส้นทางที่สั้นที่สุด การใช้ฟังก์ชั่นห้องสมุดเช่นประเภทที่ไม่มั่นคงหรือมีค่าน้อยเพียงแค่ทำให้ปัญหารุนแรงขึ้น
LinearZoetrope

คำตอบ:


5

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

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

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

ตัวอย่างเช่นการตั้งค่าการทดสอบที่ไร้เดียงสาจะเป็น:

  1. คำนวณเส้นทางที่เป็นไปได้ทั้งหมดระหว่าง Va และ Vb ในกราฟทดสอบด้วยอัลกอริทึมโลภ
  2. คำนวณฟังก์ชั่นต้นทุน (ตัวอย่างเช่นความยาวหากน้ำหนักขอบทั้งหมดเท่ากับ 1) สำหรับแต่ละเส้นทางเหล่านี้และค้นหาค่าต่ำสุด
  3. ใช้อัลกอริทึมภายใต้การทดสอบ
  4. ยืนยันในการทดสอบหน่วยของคุณว่าค่าใช้จ่ายอัลกอริทึมที่ทดสอบเท่ากับค่าต่ำสุดของโซลูชันโลภ

หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการปรับให้เหมาะสมตามกราฟคุณสามารถดูสิ่งพิมพ์ของ Yuri Boykov ได้ที่นี่แต่ในบริบทอื่น (ปัญหาการมองเห็นด้วยคอมพิวเตอร์)


ฉัน upvoted แต่ฉันจะรอสักครู่ที่จะยอมรับ นี่คือ "การทดสอบสำหรับลักษณะของคำตอบที่ถูกต้อง" ฉันพูดถึงในคำถาม ปัญหาเกิดขึ้นเสมอเพื่อให้แน่ใจว่าคุณกำลังตรวจสอบสิ่งที่ถูกต้อง ตัวอย่างเช่นในครั้งเดียวฉันกำลังตรวจสอบค่าใช้จ่ายที่ส่งคืนและตรวจสอบให้แน่ใจว่าเส้นทางนั้นถูกต้อง แน่นอนเส้นทางนั้นถูกต้อง! มันเป็นเพียงโหนดเริ่มต้น! ดังนั้นฉันต้องเปลี่ยนการทดสอบเพื่อให้แน่ใจว่าเส้นทางตัวเองมีค่าใช้จ่ายที่ถูกต้องคืน ผิดพลาดอย่างแน่นอน แต่ยิ่งมีการโต้ตอบเช่นนี้มากขึ้นโอกาสของคุณก็จะมากขึ้น
LinearZoetrope

@Jsor ในมุมมองของฉันมันเป็นประโยชน์ในการปรับปรุงอย่างต่อเนื่องของการทดสอบ: คุณไม่สามารถหาคุณสมบัติความถูกต้องทั้งหมดของโซลูชันในตอนแรกจากนั้นไปหนึ่งวันในความล้มเหลวปรับปรุงการทดสอบของคุณและอื่น ๆ
sansuiso

คำตอบนี้แนะนำสำหรับการทดสอบลักษณะของคำตอบที่ถูกต้อง แต่สิ่งที่สำคัญคือการเลือกซึ่งลักษณะจะทำให้การทดสอบที่ดี ในตัวอย่างนี้การตรวจสอบว่าคำตอบคือเส้นทางจาก A ถึง B และฟังก์ชั่นต้นทุนเท่ากับค่าต่ำสุดจะให้เกณฑ์สองข้อที่ทุกคำตอบที่ถูกต้องจะตอบสนองในขณะที่ไม่มีคำตอบที่ไม่ถูกต้องจะตอบสนองเกณฑ์ทั้งสอง หากคำตอบนี้ยังไม่ได้รับฉันจะแนะนำสิ่งที่คล้ายกัน เป็นที่ยอมรับกันบ่อยครั้งซึ่งไม่ใช่เรื่องง่ายที่จะทราบว่าคุณลักษณะใดที่ต้องทดสอบ
David K

0

ฉันคิดว่าคำตอบที่ตรงกับคำถามของคุณคือเลือกกรณีทดสอบที่ดีกว่า ฉันสงสัยเกี่ยวกับกรณีทดสอบที่คุณใช้ กราฟที่คุณใช้สามารถเป็นกราฟที่บรรจุกระป๋องซึ่งมนุษย์ค่อนข้างง่ายต่อการพิจารณาการตอบสนองที่คาดหวัง ลองนึกถึงกรณี "edge" ที่คุณต้องการให้แน่ใจว่าอัลกอริทึมของคุณจัดการและสร้างกราฟสำหรับแต่ละกรณีของขอบเฉพาะที่ง่ายสำหรับมนุษย์ในการคำนวณ ตัวอย่างเช่นในกรณีอัลกอริทึม Djikstra คุณอาจสร้างกราฟ 5x5 หรือ 7x7 ที่ครอบคลุมกรณีขอบทั้งหมดของคุณแม้ว่าระบบจริงของคุณอาจเป็น 500x500

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

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