ระเบียบวิธีวิเคราะห์จุดและกล่อง

Source-page: http://wilson.engr.wisc.edu/boxes/method/

เดวิด วิลสัน

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

ทำงานไปข้างหลัง

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

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

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

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

การค้นหาตำแหน่งที่มีจำนวนบรรทัดที่กำหนด

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

ฉันแบ่งบรรทัดออกเป็นกลุ่ม แต่ละกลุ่มของเส้นถูกแทนด้วยบิตต่อเนื่องในเลขฐานสองของตำแหน่ง บิตเหล่านี้สามารถคัดลอกและวางในจำนวนที่แยกต่างหากซึ่งแทนสถานะของบรรทัดภายในกลุ่ม ตัวอย่างเช่นสำหรับเกม 3×3 มีทั้งหมด 24 สาย โปรแกรมใช้สองกลุ่มบรรทัดโดยแต่ละบรรทัดมี 12 บรรทัด สำหรับแต่ละการนับบรรทัดที่เป็นไปได้สำหรับกลุ่ม (0 ถึง 12) โปรแกรมจะสร้างรายการของตัวเลขที่แสดงถึงกลุ่มที่มีจำนวนบรรทัดนั้นอยู่ จากนั้นเพื่อค้นหาตำแหน่งที่มีชุดของเส้น n ฉันรวมสถานะกลุ่มแรกทั้งหมดกับสาย i ชุดกับสถานะกลุ่มที่สองกับชุดสาย ni ที่ฉันแตกต่างกันไปมากกว่าค่าที่เป็นไปได้ทั้งหมด กลุ่ม. ตัวอย่างเช่นเพื่อค้นหาตำแหน่งทั้งหมดที่มี 15 บรรทัดในเกม 3×3 โปรแกรมจะรวมสถานะกลุ่มแรกทั้งหมดด้วย 3 บรรทัดกับกลุ่มกลุ่มที่สองทั้งหมดที่มี 12 บรรทัด (มีเพียงหนึ่งในนั้น) จากนั้นกลุ่มกลุ่มแรกทั้งหมดที่มี 4 บรรทัด สถานะกลุ่มที่สองทั้งหมดที่มี 11 บรรทัด, … , และในที่สุดทุกรัฐกลุ่มแรกที่มี 12 บรรทัด (อีกครั้งเพียงหนึ่งที่เป็นไปได้) กับกลุ่มรัฐที่สองทั้งหมดที่มี 3 บรรทัด

ตรวจสอบกล่องใหม่

แต่ละบรรทัดจะได้รับหมายเลขดัชนีที่สอดคล้องกับบิตในเลขฐานสองของตำแหน่ง โปรแกรมมีค่าทดสอบกล่องสองชุดซึ่งอ้างอิงโดยใช้หมายเลขดัชนีของบรรทัดใหม่ หนึ่งชุดตรวจสอบกล่องใหม่ด้านบนหรือด้านซ้ายของบรรทัดใหม่ อีกอันจะตรวจสอบกล่องด้านล่างหรือทางด้านขวาของบรรทัดใหม่ ค่าเหล่านี้ใช้เพื่อตรวจสอบว่าอีก 3 บรรทัดนั้นมีอยู่แล้วหรือไม่ บิตที่สอดคล้องกับ 3 บรรทัดเหล่านั้นถูกตั้งค่าเป็น 1; บิตอื่น ๆ ทั้งหมดถูกตั้งค่าเป็น 0 การทดสอบเสร็จสิ้นโดยใช้การดำเนินการแบบลอจิคัล “และ” ระหว่างเลขฐานสองของตำแหน่งและค่าการทดสอบ การดำเนินการ “และ” สำหรับแต่ละตำแหน่งบิตจะสร้าง 1 หากบิตที่สอดคล้องกันในทั้งสองค่านั้นถูกตั้งค่าไว้ 0 มิฉะนั้น เนื่องจากเลขฐานสองของตำแหน่งมีการตั้งค่าบิตเป็น 0 หากมีบรรทัด “และ” ของสิ่งนี้และค่าการทดสอบจะสร้างผลลัพธ์เป็นศูนย์ถ้าหากมีสามบรรทัดเท่านั้นที่มีอยู่แล้ว

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

การใช้กลุ่มบรรทัดจำนวนมาก

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

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

สมมติว่าเส้นถูกแบ่งออกเป็นสองกลุ่มจาก 19 บรรทัดแต่ละฉันจะมี แกะ เพียงค่าที่สอดคล้องกับจำนวนบรรทัดที่กำหนดสำหรับแต่ละกลุ่มทั้งสอง ตัวอย่างเช่นในขณะที่ทำการตำแหน่งที่มี 19 บรรทัดฉันสามารถประเมินตำแหน่งที่มี 9 บรรทัดในกลุ่มแรกและ 10 บรรทัดในกลุ่มที่สอง ฉันจะเรียกตำแหน่ง 9/19 10/19 เหล่านี้ ในการคำนวณค่าเหล่านี้ฉันต้องอ้างถึงตำแหน่งสองชุดที่มี 20 บรรทัด: 10/19 10/19 และ 9/19 11/19 ฉันไม่ต้องการหน่วยความจำทั้ง 20 ชุดในคราวเดียว พวกเขาสามารถใช้งานได้ครั้งละหนึ่งรายการโดยบันทึกคะแนนที่ดีที่สุดโดยพิจารณาเฉพาะบรรทัดใหม่ในกลุ่มแรกสำหรับตำแหน่ง 9/19 10/19 ทั้งหมดจากนั้นดูว่าการปรับปรุงใด ๆ สามารถทำได้ในคะแนนด้วยบรรทัดใหม่ในวินาที กลุ่ม. บัฟเฟอร์ทั้งสองจะใช้เวลาเพียง 16 กิกะไบต์

จากนั้นฉันก็รู้ว่าฉันสามารถแบ่งสายออกเป็นสองกลุ่มได้มากกว่า โดยการใช้กลุ่ม 6 ฉันสามารถตัด แกะ ที่ต้องการเพียง 426 เมกะไบต์ การตัดต่อโดยใช้สมมาตร (ดูด้านล่าง) ทำให้พอดี ตัวอย่างเช่นเพื่อหาคะแนนสำหรับตำแหน่ง 4/8 3/6 3/6 3/6 3/6 3/6 โปรแกรมต้องอ่านคะแนนหกชุดที่แตกต่างกันหกบรรทัดด้วย 20 บรรทัด มีอีกหนึ่งบรรทัดในหนึ่งในหกกลุ่ม

สมมาตร

3×5 เกมสมมาตรในแนวตั้งและแนวนอนโดยการใช้ประโยชน์ของสมมาตรฉันจะแบ่งความต้องการพื้นที่โดย 4 (ที่จริงโดย 3 ในการดำเนินการครั้งสุดท้ายของฉัน) พอลสตีเว่รายงาน ข้อผิดพลาด ในการทดสอบสำหรับสมมาตรกว่าเส้นทแยงมุมบนตารางคณะกรรมการ

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

ก่อนที่โปรแกรมจะกำหนดบรรทัดให้กับกลุ่มอันดับแรกจะค้นหาบรรทัดที่สัมพันธ์กันโดยการแปลงแบบสมมาตร ในเกม 3×5 มีเจ็ดชุด 4 สายและห้าชุด 2 ชุดที่สัมพันธ์กัน จากนั้นโปรแกรมจะกำหนดชุดของบรรทัดให้กับกลุ่ม สำหรับเกม 3×5 ที่ใช้ แกะ 256 เมกะไบต์ ผลหกกลุ่ม (แต่ละชุดมีสองชุด) ขนาด 8 6 6 6 6 6

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

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

การอนุรักษ์พื้นที่ดิสก์

คะแนนสำหรับตำแหน่งที่มีจำนวนบรรทัดที่กำหนดในแต่ละกลุ่มจะถูกเก็บไว้ในดิสก์ไฟล์เดียว ตัวอย่างเช่นคะแนนสำหรับตำแหน่ง 4/8 3/6 4/6 2/6 3/6 3/6 ถูกเก็บไว้ในไฟล์: \Boxes\3×5\19\4\3\4\2\3.bin

แบ็กสแลชคั่นชื่อโฟลเดอร์ที่ซ้อนกัน 3×5 เป็นชื่อของเกมที่กำลังวิเคราะห์ 19 คือจำนวนบรรทัดทั้งหมดในตำแหน่ง ส่วนที่เหลือของชื่อโฟลเดอร์และชื่อไฟล์มาจากจำนวนบรรทัดในกลุ่ม จำนวนบรรทัดในกลุ่มสุดท้ายไม่ได้ใช้เนื่องจากถูกแก้ไขโดยหมายเลขอื่น .bin หมายถึงนี่เป็นไฟล์ไบนารี – ไม่สามารถดูเนื้อหาของมันได้โดยตรง โฟลเดอร์ที่ซ้อนกันใช้เนื่องจาก Windows ประมวลผลโฟลเดอร์ที่มีไฟล์จำนวนมากช้ามาก

การแปลงแบบสมมาตรตัดพื้นที่ดิสก์ที่ต้องการจาก 256 กิกะไบต์ เป็น 85 กิกะไบต์ อย่างไรก็ตามไม่จำเป็นต้องเก็บผลลัพธ์การวิเคราะห์ทั้งหมด ทันทีที่โปรแกรมทำงานกับตำแหน่งที่มี 19 บรรทัดผลลัพธ์สำหรับตำแหน่งที่มี 20 บรรทัดสามารถลบได้ ด้วยเนื้อที่ว่างบนดิสก์ที่ว่างเพียง 16 กิกะไบต์ โปรแกรมจะเก็บผลลัพธ์ไว้ในตำแหน่งที่มี 15 บรรทัดหรือน้อยกว่า สิ่งนี้ส่งผลให้ “หนังสือเปิด” สำหรับเกม 3×5

อย่างไรก็ตามการจัดเก็บผลลัพธ์เพียง 20 ตำแหน่งและ 19 บรรทัดยังคงใช้งานได้ 22 กิกะไบต์ วิธีนี้แก้ไขได้ด้วยการลบบางส่วนของไฟล์ตำแหน่ง 20 บรรทัดเนื่องจากไม่จำเป็นสำหรับการคำนวณคะแนนเพิ่มเติมอีก 19 ตำแหน่ง เมื่อโปรแกรมผ่านการรวมบรรทัดที่เป็นไปได้ทั้งหมดจะถูกนับสำหรับกลุ่มที่รวมกันได้มากถึง 19 บรรทัดการนับสำหรับกลุ่มบรรทัดแรกจะไม่ลดลง ดังนั้นเมื่อการนับสำหรับกลุ่มบรรทัดแรกย้ายจาก 0 ถึง 1 เช่นไฟล์ทั้งหมดที่ขึ้นต้นด้วย \Boxes\3×5\20\0\ สามารถลบได้ ด้วยการเปลี่ยนแปลงนี้การวิเคราะห์นั้นเหมาะสมกับขนาด 16 กิกะไบต์

ห่วงโซ่

ณ จุดนี้โปรแกรมก็ยังคงไม่เพียงพอสำหรับการแก้ 5×5 ปัญหาในบทที่ 12 จุดและกล่องเกม  โดยวิ่น การต่อสู้ (เค ปีเตอร์ส, 2000) หากคอมพิวเตอร์ยังคงเป็นสองเท่าของความจุของพวกเขาทุก 18 เดือนเราควรจะสามารถในการวิเคราะห์ทั้ง 5×5 เกมใน 2034 เพราะมันมี 22 บรรทัดที่มากขึ้นกว่า 3×5 เกมซึ่งได้รับการวิเคราะห์ในปี 2001 ในขณะนี้โปรแกรมสามารถจัดการกับ ตำแหน่งที่มีถึง 36 สายที่เปิดตำแหน่งที่ไม่มีความสมมาตรและ 14 กิกะไบต์ พื้นที่ดิสก์ที่ใช้ได้ นั่นหมายความว่าเพียง 5×5 ตำแหน่ง 24 เส้นขึ้นไป (จาก 60) จะได้รับการจัดการ ไม่มีบทที่ 12 ปัญหาที่มีวงเงินที่หลาย ๆ

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

+     +     +  .  +     +     +
            |  .  |
            |  .  |
            |  .  |
+     +  .  +  .  +     +     +
      |  .  |  .
      |  .  |  ....
      |  .  |
+     +  .  +-----+-----+-----+
      |  .  |
      |  .  |  ..........
      |  .  |  .
+     +  .  +  .  +-----+  .  +
            |           |  .
            |     ....  |  ....
            |        .  |
+     +     +  .  +  .  +-----+
            |  .
            |  ....
            |
+     +     +-----+     +     +

จุดทำเครื่องหมายโซ่ที่แต่ละคนแสดงโดยสายหลอกเดียว จาก 60 บรรทัดมี 15 เต็ม 30 ว่างและ 15 เกี่ยวข้องใน 6 โซ่ ตำแหน่งที่สามารถเกิดขึ้นได้จากตำแหน่งเริ่มต้นนี้แสดงด้วย 36 บิต – 30 สำหรับบรรทัดว่างและ 6 สำหรับ 6 โซ่ ดังนั้นตำแหน่งนี้แทบจะไม่อยู่ในขีดความสามารถปัจจุบันของโปรแกรม

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

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

หากเชนเริ่มต้นมีกล่อง 3 ด้านที่ด้านใดด้านหนึ่งถัดจากเชนจากนั้นผู้เล่นที่เคลื่อนที่สามารถเคลื่อนที่เข้าสู่ห่วงโซ่ได้ด้วยการยึดและมีตัวเลือกในการรับกล่องในเชน มิฉะนั้นจะเป็นผู้เล่นคนอื่นที่มีตัวเลือกในห่วงโซ่ ฉันจะโทรหาคนที่มีตัวเลือกในการทำกล่องในเครือคือ “ผู้เล่นโซ่”

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

การลงโทษครั้งสุดท้าย

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

  • ถ้าคุณเรียกใช้การวิเคราะห์ที่สองบทลงโทษที่แตกต่างกันให้คะแนนสำหรับการย้ายไม่สามารถเปลี่ยนได้มากกว่าบวกหรือลบแตกต่างในการลงโทษ
  • สำหรับบทลงโทษจำนวนเต็มติดต่อกันหนึ่งผลการวิเคราะห์ในทุกคะแนนจำนวนเต็มและผลอื่น ๆ ในทุกคะแนนจำนวนเต็มคี่
  • ดังนั้นสำหรับบทลงโทษจำนวนเต็มติดต่อกันคะแนนเสมอเปลี่ยนแปลง +1 หรือ -1 … เป็นไปได้สูงสุด
  • ดังนั้นคุณจะได้รับคะแนนสำหรับโทษเศษส่วนใด ๆ โดย interpolating ระหว่างคะแนนสำหรับบทลงโทษจำนวนเต็มที่อยู่ติดกัน

เคลื่อนไหวบ้า ๆ บอ ๆ

รุ่นสุดท้ายของโปรแกรมรวมถึงการวิเคราะห์การเคลื่อนไหวบ้า ในเอาท์พุทคะแนนจะถูกต่อท้ายด้วย v หากผู้เล่น A ต้องเลื่อนไปข้างหน้าโง่หรือ ^ ถ้าผู้เล่น B ต้อง หากผู้เล่นทั้งสองไม่ต้องเคลื่อนที่ไปข้างหน้าจะไม่มีการใช้คำต่อท้าย ในระหว่างการวิเคราะห์ไบต์สองบิตที่ใช้เพื่อเก็บคะแนนจะถูกใช้เพื่อเก็บสถานะ loony ของการย้าย ใบนี้เหลือเพียง 6 บิตสำหรับคะแนน ดังนั้นสามารถเก็บคะแนนได้ตั้งแต่ -32 ถึง +31 เท่านั้น สิ่งนี้ทำให้เวอร์ชันการวิเคราะห์การเคลื่อนไหวแบบบ้า ๆ ของโปรแกรมไม่น่าเชื่อถือบนกระดานที่มีขนาดใหญ่กว่า 5 คูณ 6 ดังนั้นฉันจึงให้รุ่นที่มีอยู่ซึ่งไม่ทำการวิเคราะห์แบบเคลื่อนไหวแบบบ้าเพื่อใช้กับกระดานขนาดใหญ่

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

ลูกเตะมุม

วิลเลียมเฟรเซอร์ เขียน: “คุณคำนึงถึงความจริงที่ว่า [ab] และ [ba] อ้างถึงลิงก์ที่เทียบเท่าหรือไม่ดังนั้น (ถ้าคุณใส่ลิงค์แปดมุมเข้าไปในกลุ่มบรรทัดสุดท้าย 8 บรรทัด) คุณสามารถเก็บได้เพียง 3^4=81 รายการแทน 2^8=256 ซึ่งจะเป็นอิสระอย่างสมบูรณ์จากการหมุน/การสะท้อนซึ่งจะลดการใช้ดิสก์โดย 75% และการใช้หน่วยความจำโดยเฉลี่ย 75%”

ฉันใช้คำแนะนำนี้ซึ่งทำให้สามารถวิเคราะห์เกม 4×4 ได้

เดวิด วิลสัน / David Wilson / [email protected]