ปัญหาการนับจำนวนรอบนับถอยหลัง - และวิธีแก้ปัญหาอัลกอริทึม?


10

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

ตัวอย่างเช่นYoutube: Countdown - เกมหมายเลขพิเศษที่สุดที่เคยมีมา?

มีคำอธิบายโดยละเอียดใน Wikipedia: Countdown (Game Show)

ตัวอย่างเช่น:

  • ผู้ให้ข้อมูลเลือก 6 หมายเลข - สองตัวใหญ่ (ความเป็นไปได้รวม 25, 50, 75, 100) และสี่ตัวเล็ก (หมายเลข 1 .. 10 แต่ละตัวรวมสองครั้งในสระว่ายน้ำ)
  • ตัวเลขที่เลือกจะ75, 50, 2, 3, 8, จะได้รับมีจำนวนเป้าหมายของการ7812
  • หนึ่งครั้งคือ (75 + 50 - 8) * 7 - (3 * 2) = 813 (คะแนนนี้ 7 คะแนนสำหรับการแก้ปัญหาภายใน 5 ของเป้าหมาย)
  • คำตอบที่แน่นอนจะเป็น (50 + 8) * 7 * 2 = 812 (ซึ่งจะได้คะแนน 10 คะแนนตรงกับเป้าหมาย)

เห็นได้ชัดว่าปัญหานี้เกิดขึ้นก่อนการกำเนิดของทีวี แต่บทความ Wikipedia ไม่ได้ให้ชื่อ ฉันเคยเห็นเกมนี้ที่โรงเรียนประถมฉันเข้าร่วมเกมที่เรียกว่า "Crypto" เป็นการแข่งขันระหว่างคลาส - แต่การค้นหาเกมในตอนนี้ไม่ได้เปิดเผยอะไรเลย

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


1
ฉันแก้ไขกราฟิกนี้ - ใช้โหนดเพื่อแสดงผลลัพธ์ของการคำนวณและขอบเพื่อแสดงการดำเนินการที่สามารถทำได้กับตัวเลขเหล่านั้นจากนั้นใช้อัลกอริทึมการค้นหากราฟเพื่อค้นหาเส้นทางที่ต้องการ
ell

1
จากการอ่านกฎดูเหมือนว่าเป็นไปไม่ได้ที่จะหาทางออกที่สมบูรณ์แบบ - ตัวอย่างเช่นถ้าหมายเลขที่เลือกคือ (1, 1, 2, 2, 3, 3) และหมายเลขเป้าหมายคือ 999 จริงๆแล้ว เป้าหมายของอัลกอริทึมใด ๆ ก็คือการค้นหาทางออกที่ใกล้เคียงที่สุด
Rich Smith

1
@ell: โซลูชันการค้นหากราฟของคุณนั้นเป็นการค้นหาที่ดุร้ายใช่ไหม
Martin

ฉันใช้การค้นหาลึกครั้งแรกในการนำไปใช้ แต่ฉันไม่เห็นว่าทำไมบางอย่างเช่น Dijkstra จึงไม่สามารถใช้งานได้
ell

1
เรามีการแสดงที่คล้ายกันบางอย่างในสหรัฐอเมริกา: เราติดประมาณ 6 โง่ย่อยความรู้ในบ้านเป็นเวลาหลายสัปดาห์และภาพยนตร์ที่พวกเขาพูดคุยเกี่ยวกับแต่ละอื่น ๆ และตะโกนที่แต่ละอื่น ๆ มันใกล้เคียงกับทีวีของเราถึงสิ่งที่มีปัญญาในรายการยอดนิยม
RBarryYoung

คำตอบ:


4

คำปฏิเสธ: คำตอบนี้ไม่ตอบคำถามที่สมบูรณ์ แต่มันยาวเกินไปสำหรับความคิดเห็น

NP-ยาก? ผมเชื่อว่าปัญหานี้อาจจะNP-ยาก

พิจารณากรณีพิเศษของปัญหาเป้ :

กำหนดชุดของจำนวนเต็มบวกและจำนวนเต็มบวกbมีชุดย่อยของชุดว่าผลรวมของจำนวนเต็มทั้งหมดในชุดย่อยนั้นเท่ากับbหรือไม่

สิ่งนี้ฟังดูคล้ายกับปัญหาการนับถอยหลังของเราและดูเหมือนง่ายกว่ามาก อย่างไรก็ตามเป้ (และกรณีพิเศษของเป้) คือ NP-hard (และ NP-complete แน่นอน)

ฉันไม่สามารถใช้สิ่งนี้เพื่อพิสูจน์ว่า Countdown เป็น NP-hard ฉันไม่สามารถกำจัดกองได้ พิจารณาว่าเรามีหนึ่งพัน 2 และb = 7 สิ่งนี้จะไม่สามารถแก้ไขได้ด้วย Knapsack แต่จะเสมอ (?) กับ Countdown อย่างน้อยในทุกวิธีที่ฉันพยายามถ่ายโอนปัญหา

ตอนนี้ถ้า Countdown เป็น NP-hard จริงๆเราสามารถอนุมานได้ว่ามีความเป็นไปได้สูงมากคือไม่มีอัลกอริทึมที่มีประสิทธิภาพมากกว่าการใช้กำลังดุร้ายที่พยายามทำทุกวิถีทาง (และถ้าเราควรหาอัลกอริธึมดังกล่าวเราจะกลายเป็นคนดังมาก)

ไม่ฉันไม่คิดว่าจะต้องมีอัลกอริทึมที่มีประสิทธิภาพ

heuristics วิดีโอ Youtube ที่เชื่อมโยงกับคำถามมีตัวอย่างที่ดี: ผู้แข่งขันพบคำตอบที่แน่นอน 952 = ((100 + 6) * 3 * 75 - 50) / 25 นั่นเป็นสิ่งที่ขัดกับสัญชาตญาณของฉันอย่างสมบูรณ์ฉันจะไม่เคยลอง วิธีในครั้งแรก: ผลิตจำนวนมากแล้วแบ่งและให้ผลลัพธ์

ในอีกด้านหนึ่งมนุษย์เรารู้สึกว่าเราไม่จำเป็นต้องลอง (ตัวอย่างตามอำเภอใจ) 50 * 75 * 100/2/3/7 เพื่อเข้าถึงตัวเลขสามหลัก แต่คอมพิวเตอร์ไม่รู้สึกอะไรเลยพวกเขาคำนวณง่ายๆ

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

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

ข้อสรุป เมื่อใช้อัลกอริทึมเราสามารถตัดการคำนวณที่เท่ากันเช่น a / b / c = a / (b * c) แต่ฉันคิดว่ามันค่อนข้างยากที่จะทำ

คอมพิวเตอร์แน่นอนว่าเร็วกว่ามนุษย์ในการตรวจสอบความเป็นไปได้จำนวนมาก และทุกวันนี้แม้แต่สมาร์ทโฟนก็สามารถแก้ปัญหานี้ได้ฉันคิดว่าภายในไม่กี่วินาทีโดยเพียงแค่พยายามทำทุกอย่างที่เป็นไปได้ (ฉันไม่ได้ทดสอบสิ่งนี้) มีเพียงหกตัวเลขมันจะแตกต่างกันถ้ามีเช่น 60 ของพวกเขา


คำตอบสำหรับตัวอย่างที่น่าประทับใจอย่างมากแม้ว่ามันจะไม่ซับซ้อนเท่าที่ปรากฏครั้งแรก กระบวนการคิดของเขาลบสิ่งที่ชัดเจนกว่าที่เขาอาจลองมาน่าจะเป็น "ฉันสามารถใช้ 954 (100 + 6) * 9 ซึ่งฉันสามารถทำได้ผ่าน (100 + 6) * 3 * 75/25 ฉันมี 50 ซ้ายและ 50/25 เป็นสองดังนั้นฉันจึงสามารถใช้ 50 off (100 + 6) * 3 * 75 ก่อนหารด้วย 25 "
Tim Down

1

อัลกอริทึมไม่ยากจริง ๆ

ด้วยตัวเลขสองตัว a และ b เราสามารถสร้างผลลัพธ์ a + b, abs (a - b) (ฉันไม่รู้ว่าอนุญาตให้ใช้จำนวนลบได้หรือไม่ซึ่งในกรณีนี้เราสามารถสร้าง a - b และ a + b) ได้ * b และอาจเป็น / b หรือ b / a หากผลลัพธ์เป็นจำนวนเต็ม ดังนั้นผลลัพธ์ที่เป็นไปได้คือชุดของตัวเลขสูงสุดห้าตัว เรียกชุดนี้ S (a, b)

ใช้ตัวเลขหกตัวคือ a, b, c, d, e และ f

สำหรับตัวเลขสองชุดแต่ละชุดให้ค้นหาหมายเลขที่สามารถสร้างได้

จากนั้นสำหรับแต่ละชุดย่อยของตัวเลขสามจำนวนค้นหาหมายเลขที่พวกเขาสามารถสร้าง: S (a, b, c) = S (S (a, b), c) union S (S (a, c), b) union S ( S (b, c), a)

จากนั้นเหมือนกันสำหรับแต่ละชุดย่อยของ 4 หรือ 5 หมายเลขแล้วสำหรับทั้ง 6 หมายเลข

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