ใช้ superoptimizer สำหรับการเพิ่ม


11

งานคือการเขียนรหัสที่สามารถหาสูตรตรรกะขนาดเล็กสำหรับจำนวนบิต

ความท้าทายโดยรวมคือการให้โค้ดของคุณค้นหาสูตรเชิงตรรกะที่มีความเป็นไปได้น้อยที่สุดเพื่อตรวจสอบว่าผลรวมของตัวแปร y ไบนารี 0/1 เท่ากับค่า x หรือไม่ ให้เราเรียกตัวแปร x1, x2, x3, x4 เป็นต้นนิพจน์ของคุณควรเท่ากับผลรวม นั่นคือสูตรตรรกะควรเป็นจริงถ้าหากผลรวมเท่ากับ x

นี่เป็นวิธีที่ไร้เดียงสาที่จะเริ่มต้นด้วย พูดว่า y = 15 และ x = 5. เลือกวิธีทั้งหมด 3003 วิธีในการเลือกตัวแปร 5 ตัวและแต่ละอันสร้างประโยคใหม่ด้วย AND และของตัวแปรเหล่านั้นและ AND ของตัวแปรที่เหลือ คุณจบด้วย 3003 ส่วนของความยาวแต่ละข้อ 15 สำหรับค่าใช้จ่ายทั้งหมด 45054

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

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

ในการเริ่มต้นออกกำลังกายบางคนอาจต้องการเริ่มต้นด้วยตัวแปร y = 5 ที่เพิ่มเข้าไปใน x = 2 วิธีการที่ไร้เดียงสานั้นจะให้ค่าใช้จ่าย 50

รหัสควรใช้ค่าสองค่า y และ x เป็นอินพุตและเอาต์พุตสูตรและขนาดของมันเป็นเอาต์พุต ต้นทุนของโซลูชันเป็นเพียงการนับจำนวนตัวแปรในผลลัพธ์ ดังนั้น(a or b) and (!a or c) นับเป็น 4. ผู้ประกอบการที่ได้รับอนุญาตเท่านั้นand, และornot

อัปเดตปรากฎว่ามีวิธีที่ฉลาดในการแก้ปัญหานี้เมื่อ x = 1 อย่างน้อยก็ในทางทฤษฎี


1
นี่คือนอกหัวข้อ ดังที่คุณกล่าวไว้: คำถามนี้เกี่ยวกับการปรับการแสดงออกเชิงตรรกะ มันไม่ใช่ความท้าทายในการเขียนโปรแกรม / ไขปริศนา แต่อย่างใด
shiona

@shiona ความท้าทายคือการคิดวิธีที่ชาญฉลาดในการทำสิ่งที่ทำงานให้เร็วพอ บางทีฉันควรใช้ถ้อยคำใหม่เพื่อให้ชัดเจนขึ้น ฉันคิดว่ามันเหมือนความท้าทายในการเขียน superoptimizer

1
โปรดระบุ "ขนาด" ให้แม่นยำยิ่งขึ้น คำอธิบายของคุณแปลว่าไม่ได้ถูกนับ หรือเพียงแค่การปฏิเสธตัวแปรดิบไม่นับ แต่ละไบนารีและ / หรือนับเป็นหนึ่ง?
Keith Randall

1
การแนะนำตัวแปรใหม่จะทำงานกับคะแนนได้อย่างไร บอกว่าฉันต้องการที่จะให้z[0] = y[0] and y[1]คุณต้องการให้สิ่งนี้ระบุ?
Kaya

1
@ Lembik ขอบคุณสำหรับลิงก์ PDF ฉันเชื่อว่าฉันเข้าใจแล้ว ถ้าฉันต้องการให้z[0]ตัวแทนเป็นตัวแปรy[0] or y[1]ฉันก็แค่ต้องแนะนำประโยคที่ดูเหมือน(y[0] or y[1]) or not z[0](หรือข้อความใด ๆ ที่เทียบเท่าโดยใช้ตัวดำเนินการ 3 ตัวที่อนุญาต)
Kaya

คำตอบ:


8

Python 644

เครื่องกำเนิดสมการแบบง่าย ๆ Sสร้างสมการที่เป็นที่พอใจ IFF รายการของที่จะเพิ่มขึ้นvarstotal

มีการปรับปรุงที่ชัดเจนที่ต้องทำ ตัวอย่างเช่นมีนิพจน์ย่อยทั่วไปจำนวนมากที่ปรากฏในเอาต์พุต 15/5

def S(vars, total):
    # base case
    if total == 0:
        return "(" + " and ".join("not " + x for x in vars) + ")"
    if total == len(vars):
        return "(" + " and ".join(vars) + ")"

    # recursive case
    n = len(vars)/2
    clauses = []
    for s in xrange(total+1):
        if s > n or total-s > len(vars)-n: continue
        a = S(vars[:n], s)
        b = S(vars[n:], total-s)
        clauses += ["(" + a + " and " + b + ")"]
    return "(" + " or ".join(clauses) + ")"

def T(n, total):
    e = S(["x[%d]"%i for i in xrange(n)], total)
    print "equation", e
    print "score", e.count("[")

    # test it
    for i in xrange(2**n):
        x = [i/2**k%2 for k in xrange(n)]
        if eval(e) != (sum(x) == total):
            print "wrong", x

T(2, 1)
T(5, 2)
T(15, 5)

สร้าง:

equation (((not x[0]) and (x[1])) or ((x[0]) and (not x[1])))
score 4
equation (((not x[0] and not x[1]) and (((not x[2]) and (x[3] and x[4])) or ((x[2]) and (((not x[3]) and (x[4])) or ((x[3]) and (not x[4])))))) or ((((not x[0]) and (x[1])) or ((x[0]) and (not x[1]))) and (((not x[2]) and (((not x[3]) and (x[4])) or ((x[3]) and (not x[4])))) or ((x[2]) and (not x[3] and not x[4])))) or ((x[0] and x[1]) and (not x[2] and not x[3] and not x[4])))
score 27
equation (((not x[0] and not x[1] and not x[2] and not x[3] and not x[4] and not x[5] and not x[6]) and (((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (x[11] and x[12] and x[13] and x[14])) or ((((not x[7] and not x[8]) and (x[9] and x[10])) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((x[7] and x[8]) and (not x[9] and not x[10]))) and (((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (x[13] and x[14])) or ((x[11] and x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))))) or ((((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (x[9] and x[10])) or ((x[7] and x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10]))))) and (((not x[11] and not x[12]) and (x[13] and x[14])) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((x[11] and x[12]) and (not x[13] and not x[14])))) or ((x[7] and x[8] and x[9] and x[10]) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))))) or ((((not x[0] and not x[1] and not x[2]) and (((not x[3] and not x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (not x[5] and not x[6])))) or ((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (not x[3] and not x[4] and not x[5] and not x[6]))) and (((not x[7] and not x[8] and not x[9] and not x[10]) and (x[11] and x[12] and x[13] and x[14])) or ((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (x[13] and x[14])) or ((x[11] and x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))))) or ((((not x[7] and not x[8]) and (x[9] and x[10])) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((x[7] and x[8]) and (not x[9] and not x[10]))) and (((not x[11] and not x[12]) and (x[13] and x[14])) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((x[11] and x[12]) and (not x[13] and not x[14])))) or ((((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (x[9] and x[10])) or ((x[7] and x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10]))))) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))) or ((x[7] and x[8] and x[9] and x[10]) and (not x[11] and not x[12] and not x[13] and not x[14])))) or ((((not x[0] and not x[1] and not x[2]) and (((not x[3] and not x[4]) and (x[5] and x[6])) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((x[3] and x[4]) and (not x[5] and not x[6])))) or ((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (((not x[3] and not x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (not x[5] and not x[6])))) or ((((not x[0]) and (x[1] and x[2])) or ((x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2]))))) and (not x[3] and not x[4] and not x[5] and not x[6]))) and (((not x[7] and not x[8] and not x[9] and not x[10]) and (((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (x[13] and x[14])) or ((x[11] and x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))))) or ((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (((not x[11] and not x[12]) and (x[13] and x[14])) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((x[11] and x[12]) and (not x[13] and not x[14])))) or ((((not x[7] and not x[8]) and (x[9] and x[10])) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((x[7] and x[8]) and (not x[9] and not x[10]))) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))) or ((((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (x[9] and x[10])) or ((x[7] and x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10]))))) and (not x[11] and not x[12] and not x[13] and not x[14])))) or ((((not x[0] and not x[1] and not x[2]) and (((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (x[5] and x[6])) or ((x[3] and x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))))) or ((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (((not x[3] and not x[4]) and (x[5] and x[6])) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((x[3] and x[4]) and (not x[5] and not x[6])))) or ((((not x[0]) and (x[1] and x[2])) or ((x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2]))))) and (((not x[3] and not x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (not x[5] and not x[6])))) or ((x[0] and x[1] and x[2]) and (not x[3] and not x[4] and not x[5] and not x[6]))) and (((not x[7] and not x[8] and not x[9] and not x[10]) and (((not x[11] and not x[12]) and (x[13] and x[14])) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((x[11] and x[12]) and (not x[13] and not x[14])))) or ((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))) or ((((not x[7] and not x[8]) and (x[9] and x[10])) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((x[7] and x[8]) and (not x[9] and not x[10]))) and (not x[11] and not x[12] and not x[13] and not x[14])))) or ((((not x[0] and not x[1] and not x[2]) and (x[3] and x[4] and x[5] and x[6])) or ((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (x[5] and x[6])) or ((x[3] and x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))))) or ((((not x[0]) and (x[1] and x[2])) or ((x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2]))))) and (((not x[3] and not x[4]) and (x[5] and x[6])) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((x[3] and x[4]) and (not x[5] and not x[6])))) or ((x[0] and x[1] and x[2]) and (((not x[3] and not x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (not x[5] and not x[6]))))) and (((not x[7] and not x[8] and not x[9] and not x[10]) and (((not x[11] and not x[12]) and (((not x[13]) and (x[14])) or ((x[13]) and (not x[14])))) or ((((not x[11]) and (x[12])) or ((x[11]) and (not x[12]))) and (not x[13] and not x[14])))) or ((((not x[7] and not x[8]) and (((not x[9]) and (x[10])) or ((x[9]) and (not x[10])))) or ((((not x[7]) and (x[8])) or ((x[7]) and (not x[8]))) and (not x[9] and not x[10]))) and (not x[11] and not x[12] and not x[13] and not x[14])))) or ((((((not x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2])))) or ((x[0]) and (not x[1] and not x[2]))) and (x[3] and x[4] and x[5] and x[6])) or ((((not x[0]) and (x[1] and x[2])) or ((x[0]) and (((not x[1]) and (x[2])) or ((x[1]) and (not x[2]))))) and (((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (x[5] and x[6])) or ((x[3] and x[4]) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))))) or ((x[0] and x[1] and x[2]) and (((not x[3] and not x[4]) and (x[5] and x[6])) or ((((not x[3]) and (x[4])) or ((x[3]) and (not x[4]))) and (((not x[5]) and (x[6])) or ((x[5]) and (not x[6])))) or ((x[3] and x[4]) and (not x[5] and not x[6]))))) and (not x[7] and not x[8] and not x[9] and not x[10] and not x[11] and not x[12] and not x[13] and not x[14])))
score 644

นี่เป็นสิ่งที่ดีมาก คุณคิดว่าแนวทางแก้ไขอาจจะเล็กกว่านี้?

@ Lembik: ยังไม่ได้คิดเกี่ยวกับมัน คุณต้องกำหนดตัวแปรใหม่สำหรับนิพจน์ย่อยทั่วไป ตัวอย่างเช่นnot x[0] and not x[1] and not x[2]ปรากฏ 5 ครั้งในนิพจน์ 15/5
Keith Randall

2

ฉันจะทำให้ความคิดเห็นนี้ แต่ฉันไม่ได้มีชื่อเสียง ฉันต้องการแสดงความคิดเห็นว่าผลลัพธ์ของ Kwon & Klieber (หรือที่เรียกว่าการเข้ารหัส "ผู้บัญชาการ") สำหรับ k = 1 ได้รับการจัดวางสำหรับ k> = 2 โดย Frisch et al "SAT การเข้ารหัสข้อ จำกัด At-Most-k" สิ่งที่คุณถามเกี่ยวกับเป็นกรณีพิเศษของข้อ จำกัด AM-k พร้อมประโยคเพิ่มเติมเพื่อรับประกัน At-Least-k ซึ่งไม่สำคัญเพียงแค่แยกความแตกต่างของตัวแปรทั้งหมดไปยังข้อ จำกัด AM-k Frisch เป็นนักวิจัยชั้นนำในการสร้างแบบจำลองข้อ จำกัด ดังนั้นฉันรู้สึกสบายใจที่จะแนะนำว่า [(2k + 2 C k + 1) + (2k + 2 C k-1)] * n / 2 เป็นขอบเขตที่ดีที่สุดที่รู้จักกันในจำนวน จำเป็นต้องใช้คำสั่งและ k * n / 2 สำหรับจำนวนของตัวแปรใหม่ที่จะนำเสนอ รายละเอียดอยู่ในเอกสารที่ยกมาพร้อมกับคำแนะนำวิธีการเข้ารหัสนี้เพื่อสร้าง มัน' ค่อนข้างง่ายในการเขียนโปรแกรมเพื่อสร้างสูตรนี้และฉันคิดว่าวิธีแก้ปัญหาดังกล่าวจะแข่งขันกับโซลูชันอื่น ๆ ที่คุณน่าจะพบได้ในตอนนี้ HTH


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