โซลูชันที่ใช้ปัญญาประดิษฐ์สำหรับซูโดกุ

โซลูชันที่ใช้ปัญญาประดิษฐ์สำหรับซูโดกุ

โหนดต้นทาง: 3091242

วันที่ 29 มกราคมเป็นวันปริศนาแห่งชาติ และเพื่อเป็นการเฉลิมฉลอง เราได้สร้างบล็อกสนุกๆ ที่ให้รายละเอียดเกี่ยวกับวิธีการแก้ซูโดกุโดยใช้ปัญญาประดิษฐ์ (AI)

บทนำ

ก่อน คำที่ ปริศนาซูโดกุ เป็นความเดือดดาลและยังคงได้รับความนิยมอย่างมาก ในปีที่ผ่านมาการใช้ การเพิ่มประสิทธิภาพ วิธีการแก้ปริศนาเป็นหัวข้อหลัก ดู “การแก้ปริศนา Sudoku โดยใช้การเพิ่มประสิทธิภาพใน Arkieva"

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

บล็อกนี้จะให้คำอธิบายโดยละเอียดเกี่ยวกับวิธีการใช้วิธีนี้เพื่อแก้ Sudoku ปรากฎว่า "การย้อนรอย" สามารถพบได้ภายในกลไกการเพิ่มประสิทธิภาพและการเรียนรู้ของเครื่อง และเป็นรากฐานสำคัญของการวิเคราะห์พฤติกรรมขั้นสูงที่ Arkieva ใช้ในการกำหนดเวลา อัลกอริทึมถูกนำไปใช้ใน “Array Programming Language” ซึ่งเป็นภาษาการเขียนโปรแกรมเชิงฟังก์ชันที่จัดการ ชุดโครงสร้างอาเรย์ที่หลากหลาย.

พื้นฐานของซูโดกุ

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

ตารางที่ 1 มีปัญหาตัวอย่าง มี 9 แถว 9 คอลัมน์ รวมเป็น 81 เซลล์ แต่ละรายการได้รับอนุญาตให้มีจำนวนเต็มเก้าจำนวนเพียงหนึ่งหรือเพียงหนึ่งในเก้าระหว่าง 1 ถึง 9 ในวิธีแก้ปัญหาเริ่มต้น เซลล์จะมีค่าเดียว ซึ่งจะแก้ไขค่าในเซลล์นี้เป็นค่านั้น หรือเซลล์ว่างเปล่า ซึ่งบ่งชี้ว่าเราต้องการ เพื่อค้นหาค่าสำหรับเซลล์นี้ เซลล์ (1,1) มีค่า 2 และเซลล์ (6,5) มีค่า 6 เซลล์ (1,2) และเซลล์ (2,3) ว่างเปล่า และอัลกอริทึมจะค้นหาค่าสำหรับเซลล์เหล่านี้

ภาวะแทรกซ้อน

นอกจากจะเป็นของแถวและคอลัมน์เดียวเท่านั้น เซลล์ยังอยู่ในกล่องเดียวเท่านั้น มีกล่องอยู่ 1 กล่อง และจะมีการระบุด้วยสีในตารางที่ 9 ตารางที่ 1 ใช้จำนวนเต็มเฉพาะระหว่าง 2 ถึง 1 เพื่อระบุแต่ละกล่องหรือตาราง เซลล์ที่มีค่าแถวเป็น (9, 1 หรือ 2) และค่าคอลัมน์เป็น (3, 1 หรือ 2) อยู่ในกล่อง 3 กล่อง 1 คือค่าแถวเป็น (6, 4, 5) และค่าคอลัมน์ (6, 7 , 8) รหัสกล่องถูกกำหนดโดยสูตร BOX_ID = {9x(floor((ROW_ID-3) /1)} + เพดาน (COL_ID/3) สำหรับเซลล์ (3), 5,7 = 6x(floor(3-5) ))/1) + เพดาน (3/8)= 3×3 + 1 = 3+3

หัวใจแห่งปริศนา

เมื่อต้องการค้นหาค่าจำนวนเต็มหนึ่งค่าระหว่าง 1 ถึง 9 สำหรับแต่ละเซลล์ที่ไม่รู้จัก โดยจะใช้จำนวนเต็ม 1 ถึง 9 เพียงครั้งเดียวสำหรับแต่ละคอลัมน์ แต่ละแถว และแต่ละกล่อง

ลองดูเซลล์ (1,3) ที่ว่างเปล่า แถวที่ 1 มีค่า 2 และ 7 อยู่แล้ว ไม่อนุญาตให้ใช้ค่าเหล่านี้ในเซลล์นี้ คอลัมน์ 3 มีค่า 3, 5,6, 7,9 แล้ว สิ่งเหล่านี้ไม่ได้รับอนุญาต ช่องที่ 1 (สีเหลือง) มีค่า 2, 3 และ 8 ซึ่งไม่ได้รับอนุญาต ไม่อนุญาตให้ใช้ค่าต่อไปนี้ (2,7); (3, 5, 6, 7, 9); (2, 3, 8) ค่าเฉพาะที่ไม่อนุญาตคือ (2, 3, 5, 6, 7, 8, 9) ค่าที่เป็นตัวเลือกเพียงอย่างเดียวคือ (1,4)

วิธีแก้ไขคือกำหนด 1 ให้กับเซลล์ (1,3) ชั่วคราว จากนั้นลองค้นหาค่าที่เป็นตัวเลือกสำหรับเซลล์อื่น

โซลูชันการย้อนรอย: การเริ่มต้นส่วนประกอบ

โครงสร้างอาร์เรย์

จุดเริ่มต้นคือการตัดสินใจเกี่ยวกับโครงสร้างอาร์เรย์เพื่อจัดเก็บปัญหาต้นทางและสนับสนุนการค้นหา ตารางที่ 3 มีโครงสร้างอาร์เรย์นี้ คอลัมน์ 1 เป็นรหัสจำนวนเต็มที่ไม่ซ้ำกันสำหรับแต่ละเซลล์ ค่ามีตั้งแต่ 1 ถึง 81 คอลัมน์ 2 คือ ID แถวของเซลล์ คอลัมน์ 3 คือรหัสคอลัมน์ของเซลล์ คอลัมน์ 4 คือรหัสกล่อง คอลัมน์ 5 คือค่าในเซลล์ การสังเกตเซลล์ที่ไม่มีค่าจะได้รับค่าเป็นศูนย์แทนที่จะเป็นค่าว่างหรือค่าว่าง สิ่งนี้ทำให้สิ่งนี้เป็น "อาร์เรย์จำนวนเต็มเท่านั้น" ซึ่งเหนือกว่ามากในด้านประสิทธิภาพ

ใน APL อาร์เรย์นี้จะถูกจัดเก็บไว้ในอาร์เรย์ 2 มิติโดยที่รูปร่างเป็น 81 x 5 สมมติว่าองค์ประกอบของตารางที่ 3 ถูกเก็บไว้ในตัวแปร MAT ฟังก์ชันตัวอย่างได้แก่:

คำสั่ง MAT[1 2 3;] ดึง 3 แถวแรกของ MAT
1 1 1 1 2
2 1 2 1 0
3 1 3 1 0
เสื่อ[1 2 3; 4 5] รักษาความปลอดภัยแถว 1, 2, 3 และเฉพาะคอลัมน์ 4 และ 5
1
1
1
(MAT[;5]=0)/MAT[;1] ค้นหาเซลล์ทั้งหมดที่ต้องการค่า

แทรกตารางที่ 3

การตรวจสอบความสมบูรณ์: ซ้ำกัน

ก่อนเริ่มการค้นหา การตรวจสอบสุขภาพจิตเป็นสิ่งสำคัญ! นั่นคือวิธีแก้ปัญหาเริ่มต้นที่เป็นไปได้ เป็นไปได้สำหรับซูโดกุ โดยขณะนี้มีรายการซ้ำกันในแถว คอลัมน์ หรือกล่องใดก็ได้ วิธีแก้ปัญหาเริ่มต้นปัจจุบัน เช่น 1 เป็นไปได้ ตารางที่ 4 มีตัวอย่างที่โซลูชันเริ่มต้นซ้ำกัน แถวที่ 1 มีสองค่า 2 พื้นที่ 1 มีสองค่า 2 ฟังก์ชัน “SANITY_DUPE” จัดการตรรกะนี้

การตรวจสอบสติ: ตัวเลือกสำหรับเซลล์ที่ไม่มีค่า

ข้อมูลที่มีประโยชน์มากคือค่าที่เป็นไปได้ทั้งหมดสำหรับเซลล์ที่ไม่มีค่า หากไม่มีผู้สมัคร แสดงว่าปริศนานี้ไม่สามารถไขได้ เซลล์ไม่สามารถใช้ค่าที่เพื่อนบ้านอ้างสิทธิ์ไปแล้วได้ การใช้ตารางที่ 1 สำหรับเซลล์ (1,3,'1' – 1 สุดท้ายนี้คือ boxid) เพื่อนบ้านคือแถว 1 คอลัมน์ 3 และกล่อง 1 แถว 1 มีค่า (2,7) คอลัมน์ 3 มีค่า (3,5,6,7,9); ช่องที่ 1 มีค่า (2,3,8) เซลล์ (1,3.1) ไม่สามารถใช้ค่าต่อไปนี้ (2,3,5,6,7,8,9) ตัวเลือกเดียวสำหรับเซลล์ (1,3,1) คือ (1,4) สำหรับเซลล์ (4,1,2) ค่า 1, 2, 3, 5, 6, 7, 9 ถูกใช้อยู่แล้วในแถว 4, คอลัมน์ 1 และ/หรือกล่อง 4 ค่าที่เป็นตัวเลือกเท่านั้นคือ (4,8) . ฟังก์ชัน “SANITY_CAND” จะจัดการตรรกะนี้

ตารางที่ 5 แสดงผู้สมัคร เช่น 1 ที่จุดเริ่มต้นของกระบวนการค้นหา หากเซลล์ได้รับการกำหนดค่าในเงื่อนไขเริ่มต้นแล้ว (ตารางที่ 1) ค่านี้จะถูกทำซ้ำและแสดงเป็นสีแดง หากเซลล์ที่ต้องการค่ามีเพียงตัวเลือกเดียว ตัวเลือกนี้จะแสดงเป็นสีขาว เซลล์ (8,7,9) มีค่าเดียว 7 เป็นสีขาว (2,5,8,4,3) อ้างสิทธิ์โดยคอลัมน์เพื่อนบ้าน 7 (1, 2, 9) อ้างสิทธิ์ตามแถวที่ 8 (3,2,6) ในช่อง 9 เฉพาะค่า 7 เท่านั้นที่ไม่มีการอ้างสิทธิ์

การตรวจสอบสติ: การค้นหาข้อขัดแย้ง

ข้อมูลที่ระบุตัวเลือกทั้งหมดสำหรับเซลล์ที่ต้องการค่า (โพสต์ในตารางที่ 4) ช่วยให้เราสามารถระบุข้อขัดแย้งก่อนที่จะเริ่มกระบวนการค้นหา ข้อขัดแย้งเกิดขึ้นเมื่อสองเซลล์ที่ต้องการค่ามีผู้สมัครเพียงคนเดียว ค่าผู้สมัครจะเหมือนกัน และทั้งสองเซลล์อยู่ใกล้เคียงกัน จากตารางที่ 4 เราทราบว่าเซลล์เดียวที่ต้องการค่าและมีผู้สมัครเพียงเซลล์เดียวคือเซลล์ (8,7,9) ตัวอย่างที่ 1 ไม่มีความขัดแย้ง

จะเกิดความขัดแย้งอะไร? หากค่าเดียวที่เป็นไปได้สำหรับเซลล์ (3,7,3) คือ 7 (แทนที่จะเป็น 1, 6, 7) แสดงว่ามีข้อขัดแย้ง เซลล์ (8,7) และเซลล์ (3,7) อยู่ติดกัน – คอลัมน์เดียวกัน อย่างไรก็ตาม หากค่าเดียวที่เป็นไปได้สำหรับเซลล์ (4,9,2) คือ 7 (แทนที่จะเป็น 1, 2, 7) ค่านี้ก็จะไม่เกิดข้อขัดแย้ง เซลล์เหล่านี้ไม่ใช่เพื่อนบ้าน

สรุปการตรวจสอบสุขอนามัย

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

โซลูชันการย้อนรอย: กระบวนการค้นหา

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

ติดตามการค้นหา

อาร์เรย์ ติดตาม ติดตามการมอบหมายที่ทำ

  1. Col 1 คือเคาน์เตอร์
  2. Col 2 คือจำนวนตัวเลือกที่สามารถกำหนดให้กับเซลล์นี้ได้
    • 1 หมายถึง มี 1 ตัวเลือกให้เลือก 2 หมายถึง มี XNUMX ตัวเลือก เป็นต้น
    • 0 หมายถึง - ไม่มีตัวเลือกให้ใช้งานหรือรีเซ็ตเป็น 0 (ไม่ได้กำหนดค่า) และการย้อนรอย
  3. Col 3 คือเซลล์ที่กำหนดหมายเลขดัชนีค่า (1 ถึง 81)
  4. Col 4 คือค่าที่กำหนดให้กับเซลล์ในประวัติการติดตาม
    • ค่า 9999 หมายความว่าเซลล์นี้เป็นเซลล์เมื่อพบทางตัน
    • ค่าของจำนวนเต็มระหว่าง 1 ถึง 9 คือค่าที่กำหนดให้กับเซลล์นี้ ณ จุดนี้ในกระบวนการค้นหา
    • ค่า 0 หมายความว่าเซลล์นี้ต้องมีการกำหนด

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

นอกจากนี้อาร์เรย์ พีเอวี (เวกเตอร์ของเวกเตอร์) ติดตามค่าที่กำหนดก่อนหน้านี้ให้กับเซลล์นี้ สิ่งนี้ทำให้แน่ใจได้ว่าเราจะไม่กลับมาทบทวนวิธีแก้ปัญหาที่ล้มเหลวอีกครั้ง ซึ่งคล้ายกับสิ่งที่ทำใน TABU

มีกระบวนการบันทึกเพิ่มเติมที่กระบวนการค้นหาเขียนแต่ละขั้นตอน

เริ่มต้นการค้นหา

เมื่อทำบัญชีและตรวจสุขภาพเรียบร้อย เราก็สามารถเริ่มกระบวนการค้นหาได้แล้ว ขั้นตอนคือ:

  1. มีเซลล์ที่ต้องการค่าเหลืออยู่หรือไม่? – ถ้าไม่ แสดงว่าเราทำเสร็จแล้ว
  2. สำหรับแต่ละเซลล์ที่ต้องการค่า ให้ค้นหาตัวเลือกที่ผู้สมัครทั้งหมดสำหรับแต่ละเซลล์ ตารางที่ 4 มีค่าเหล่านี้เมื่อเริ่มต้นกระบวนการแก้ปัญหา ในการวนซ้ำแต่ละครั้ง ข้อมูลนี้จะได้รับการอัปเดตเพื่อรองรับค่าที่กำหนดให้กับเซลล์
  3. ประเมินตัวเลือกตามลำดับนี้
    • หากเซลล์มีตัวเลือกเป็นศูนย์ ให้ทำการย้อนรอย
    • ค้นหาเซลล์ทั้งหมดด้วยตัวเลือกเดียว เลือกเซลล์ใดเซลล์หนึ่ง มอบหมายงานนี้
      1. และอัปเดตตารางการติดตาม โซลูชันปัจจุบัน และ PAV
    • หากเซลล์ทั้งหมดมีตัวเลือกมากกว่าหนึ่งตัวเลือก ให้เลือกหนึ่งเซลล์และหนึ่งค่า แล้วอัปเดต
      1. และอัปเดตตารางการติดตาม โซลูชันปัจจุบัน และ PAV

เราจะใช้ตารางที่ 6 ซึ่งเป็นส่วนหนึ่งของประวัติของกระบวนการแก้ไขปัญหา (เรียกว่า TRACKHIST) เพื่ออธิบายแต่ละขั้นตอน

ในการวนซ้ำครั้งแรก (CTR=1) เซลล์ 70 (แถว 8, คอลัมน์ 7, กล่อง 9) จะถูกเลือกเพื่อกำหนดค่า มีเพียงตัวเลือก (7) และค่านี้ถูกกำหนดให้กับเซลล์ 70 นอกจากนี้ ค่า 7 จะถูกเพิ่มให้กับเวกเตอร์ของค่าที่กำหนดก่อนหน้านี้ (PAV) สำหรับเซลล์ 70

ในการวนซ้ำครั้งที่สอง เซลล์ 30 ได้รับการกำหนดให้เป็นค่า 1 เซลล์นี้มีค่าที่เป็นตัวเลือกสองค่า ค่าตัวเลือกที่น้อยที่สุดจะถูกกำหนดให้กับเซลล์ (เป็นเพียงกฎที่กำหนดเองเพื่อให้ง่ายต่อการปฏิบัติตามตรรกะ)

กระบวนการระบุเซลล์ที่ต้องการค่าและการกำหนดค่าจะทำงานได้ดีจนกระทั่งการวนซ้ำ (CTR) 20 เซลล์ 9 ต้องการค่า แต่จำนวนผู้สมัครเป็นศูนย์ มีสองตัวเลือก:

  • ไม่มีทางแก้ปริศนานี้ได้
  • เรายกเลิก (ย้อนรอย) งานบางส่วนและใช้เส้นทางอื่น

เราค้นหาการกำหนดเซลล์ที่ใกล้เคียงที่สุด ซึ่งมีมากกว่าหนึ่งตัวเลือก ในตัวอย่างนี้ เหตุการณ์นี้เกิดขึ้นเมื่อวนซ้ำ 18 โดยที่เซลล์ 5 ถูกกำหนดให้เป็นค่า 3 แต่มีค่าที่เป็นตัวเลือกสองค่าสำหรับเซลล์ 5 – ค่า 3 และ 8

ระหว่างเซลล์ 5 (CTR = 18) และเซลล์ 9 (CTR = 20) เซลล์ 8 จะได้รับการกำหนดค่า 4 (CTR=19) เราใส่เซลล์ 8 และ 5 กลับเข้าไปในรายการ "ต้องการค่า" ข้อมูลนี้บันทึกไว้ในรายการ CTR=20 ที่สองและสาม โดยตั้งค่าเป็น 0 ค่า 3 จะถูกเก็บไว้ในเวกเตอร์ PAV สำหรับเซลล์ 5 นั่นคือเครื่องมือค้นหาไม่สามารถกำหนดค่า 3 ให้กับเซลล์ 5 ได้

เครื่องมือค้นหาจะเริ่มทำงานอีกครั้งเพื่อระบุค่าสำหรับเซลล์ 5 (โดยที่ 3 ไม่มีตัวเลือกอีกต่อไป) และกำหนดค่า 8 ให้กับเซลล์ 5 (CTR=21) จะดำเนินต่อไปจนกว่าเซลล์ทั้งหมดจะมีค่าหรือมีเซลล์ที่ไม่มีตัวเลือกและไม่มีเส้นทางย้อนกลับ โซลูชันถูกโพสต์ไว้ในตารางที่ 7

สังเกตว่า เมื่อมีผู้สมัครมากกว่าหนึ่งรายสำหรับเซลล์ นี่เป็นโอกาสสำหรับการประมวลผลแบบขนาน

เปรียบเทียบกับโซลูชันการเพิ่มประสิทธิภาพ MILP

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

อย่างไรก็ตาม ภายในตัวแก้ปัญหา MILP จะไม่เก็บไบนารี แต่ใช้วิธีการอาร์เรย์แบบกระจายเพื่อกำจัดการเก็บค่าศูนย์ทั้งหมด นอกจากนี้ อัลกอริธึมในการแก้ไบนารี่ยังไม่เกิดขึ้นจนกระทั่งช่วงปี 1980 และ 1990 บทความปี 1983 โดย คราวเดอร์, จอห์นสัน และแพดเบิร์ก รายงานเกี่ยวกับหนึ่งในโซลูชันเชิงปฏิบัติแรกๆ ของการเพิ่มประสิทธิภาพด้วยไบนารี พวกเขาสังเกตเห็นความสำคัญของการประมวลผลล่วงหน้าที่ชาญฉลาดและวิธีการแยกสาขาและผูกมัดว่ามีความสำคัญอย่างยิ่งต่อโซลูชันที่ประสบความสำเร็จ

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

ประทับเวลา:

เพิ่มเติมจาก อาร์เคียวา