Thực hiện superoptimizer để bổ sung


11

Nhiệm vụ là viết mã có thể tìm các công thức logic nhỏ cho các tổng bit.

Thử thách chung là mã của bạn tìm ra công thức logic mệnh đề nhỏ nhất có thể để kiểm tra xem tổng của các biến nhị phân y 0/1 có bằng một số giá trị x hay không. Hãy để chúng tôi gọi các biến x1, x2, x3, x4, vv Biểu thức của bạn phải tương đương với tổng. Đó là, công thức logic nên đúng khi và chỉ khi tổng bằng x.

Đây là một cách ngây thơ để làm điều đó để bắt đầu. Nói y = 15 và x = 5. Chọn tất cả 3003 cách khác nhau để chọn 5 biến và mỗi biến tạo một mệnh đề mới với AND của các biến đó VÀ AND của phủ định của các biến còn lại. Bạn kết thúc với 3003 mệnh đề mỗi chiều dài chính xác 15 với tổng chi phí 45054.

Câu trả lời của bạn nên là một biểu thức logic của loại đó có thể được dán vào python, để tôi có thể kiểm tra nó. Nếu hai người có cùng biểu thức kích thước, mã chạy nhanh nhất sẽ thắng.

Bạn được phép giới thiệu các biến mới vào giải pháp của mình. Vì vậy, trong trường hợp này, công thức logic của bạn bao gồm các biến nhị phân y, x và một số biến mới. Toàn bộ công thức sẽ thỏa đáng khi và chỉ khi tổng các biến y bằng x.

Khi bắt đầu bài tập, một số người có thể muốn bắt đầu với y = 5 biến thêm vào x = 2. Phương pháp ngây thơ sau đó sẽ cho chi phí là 50.

Mã phải lấy hai giá trị y và x làm đầu vào và xuất công thức và kích thước của nó làm đầu ra. Chi phí của một giải pháp chỉ là số lượng thô của các biến trong đầu ra của nó. Vì vậy, (a or b) and (!a or c) tính là 4. Các toán tử được phép duy nhất là and, ornot.

Cập nhật Hóa ra có một phương pháp thông minh để giải quyết vấn đề này khi x = 1, ít nhất là trên lý thuyết.


1
Đây là ngoài chủ đề. Như bạn đã nói: câu hỏi này là về tối ưu hóa một biểu thức logic. Đây không phải là một thách thức / câu đố lập trình theo bất kỳ cách nào.
shiona

@shiona Thách thức là nghĩ ra một cách thông minh để làm điều đó chạy đủ nhanh. Có lẽ tôi nên viết lại để làm cho điều này rõ ràng hơn. Tôi nghĩ về nó giống như một thách thức để viết một siêu phẩm.

1
Vui lòng xác định chính xác hơn "kích thước". Mô tả của bạn ngụ ý KHÔNG được tính. Hoặc chỉ phủ định biến thô không tính? Mỗi nhị phân VÀ / HOẶC được tính là một?
Keith Randall

1
Làm thế nào sẽ giới thiệu các biến mới làm việc với điểm số? Nói tôi muốn cho z[0] = y[0] and y[1], làm thế nào để bạn muốn chỉ định này?
Kaya

1
@Lembik cảm ơn vì đường link pdf, tôi tin là giờ tôi đã hiểu. Nếu tôi muốn có biến z[0]đại diện y[0] or y[1]thì tôi chỉ cần đưa ra một mệnh đề giống như (y[0] or y[1]) or not z[0](hoặc bất kỳ câu lệnh tương đương nào sử dụng 3 toán tử được phép).
Kaya

Câu trả lời:


8

Con trăn, 644

Một trình tạo phương trình đệ quy đơn giản. Stạo ra một phương trình được thỏa mãn nếu danh sách cộng varslại total.

Có một số cải tiến rõ ràng phải được thực hiện. Chẳng hạn, có rất nhiều biểu hiện con phổ biến xuất hiện trong đầu ra 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)

Tạo:

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

Điều này là rất tốt đẹp. Bạn nghĩ các giải pháp có thể nhỏ hơn bao nhiêu?

@Lembik: chưa thực sự nghĩ về nó. Bạn sẽ phải xác định các biến mới cho các biểu hiện phụ phổ biến. Chẳng hạn, not x[0] and not x[1] and not x[2]xuất hiện 5 lần trong biểu thức 15/5.
Keith Randall

2

Tôi đã có thể nhận xét này, nhưng tôi không có tiếng tăm. Tôi muốn nhận xét rằng kết quả của mã hóa Kwon & Klieber (được gọi là mã hóa "Chỉ huy") cho k = 1 đã được khái quát hóa cho k> = 2 bởi Frisch et al. "Các bảng mã SAT của ràng buộc tối đa." Những gì bạn đang hỏi là một trường hợp đặc biệt của ràng buộc AM-k, với một mệnh đề bổ sung để đảm bảo At-Least-k, không quan trọng, chỉ là một sự phân biệt của tất cả các biến đối với ràng buộc AM-k. Frisch là nhà nghiên cứu hàng đầu về mô hình ràng buộc, vì vậy tôi sẽ cảm thấy thoải mái khi đề xuất rằng [(2k + 2 C k + 1) + (2k + 2 C k - 1)] * n / 2 là ràng buộc tốt nhất được biết về số lượng mệnh đề bắt buộc và k * n / 2 cho số lượng biến mới sẽ được giới thiệu. Các chi tiết có trong bài báo giá, cùng với hướng dẫn về cách mã hóa này được xây dựng. Nó ' khá đơn giản để viết một chương trình để tạo ra công thức này và tôi nghĩ rằng một giải pháp như vậy sẽ cạnh tranh với bất kỳ giải pháp nào khác mà bạn có thể tìm thấy bây giờ. HTH.


Cảm ơn bạn. Sẽ rất thú vị để xem liệu đây có phải là cách tốt nhất để đo lường chi phí của tôi cho các kích thước vấn đề nhỏ trong đó có thể có một số tối ưu hóa toàn diện. Hy vọng ai đó ở đây sẽ thử điều này.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.