สนับสนุนโครงสร้างข้อมูลสำหรับการค้นหาในท้องถิ่นของ SAT


20

WalkSAT และ GSATเป็นอัลกอริทึมการค้นหาในท้องถิ่นที่รู้จักกันดีและเรียบง่ายสำหรับการแก้ปัญหาความพึงพอใจบูลีน pseudocode สำหรับอัลกอริทึม GSAT ถูกคัดลอกมาจากคำถามการใช้อัลกอริทึม GSAT - วิธีการเลือกตัวอักษรที่จะพลิก? และนำเสนอด้านล่าง

procedure GSAT(A,Max_Tries,Max_Flips)
  A: is a CNF formula
  for i:=1 to Max_Tries do
    S <- instantiation of variables
    for j:=1 to Max_Iter do
      if A satisfiable by S then
        return S
      endif
      V <- the variable whose flip yield the most important raise in the number of satisfied clauses;
      S <- S with V flipped;
    endfor
  endfor
  return the best instantiation found
end GSAT

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

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

นี่คือสิ่งที่ฉันรู้สึกเหมือนตำราเรียนมักจะละเว้น ตัวอย่างหนึ่งคือแม้จะมีชื่อเสียงรัสเซลและ Norvig หนังสือ


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

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

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

คำตอบ:


9

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

อัลกอริทึมที่ดีกว่าการพลิกทุกตัวแปรคือ:

  1. ทำรายการเฉพาะตัวแปรที่เกิดขึ้นในส่วนคำสั่งที่ไม่พอใจ
  2. x
  3. x
  4. x
  5. x
  6. x
  7. x
  8. ทำซ้ำขั้นตอนที่ 2-7 สำหรับตัวแปรที่เหลือที่พบในขั้นตอนที่ 1
  9. พลิกตัวแปรด้วยหมายเลขสูงสุดที่บันทึกในขั้นตอนที่ 7

การอ้างอิงสำหรับโครงสร้างข้อมูล (มักรู้จักกันในชื่อรายการ adjacency) เป็นตัวอย่างของLynce และ Marques-Silva โครงสร้างข้อมูลที่มีประสิทธิภาพสำหรับตัวแก้ SAT backtracking, 2004

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