Задача состоит в том, чтобы написать код, который может найти небольшие логические формулы для сумм битов.
Общая задача для вашего кода - найти наименьшую возможную логическую формулу высказывания, чтобы проверить, равна ли сумма y двоичных переменных 0/1 некоторому значению x. Давайте назовем переменные x1, x2, x3, x4 и т. Д. Ваше выражение должно быть эквивалентно сумме. То есть логическая формула должна быть истинной тогда и только тогда, когда сумма равна x.
Вот наивный способ сделать это для начала. Скажите y = 15 и x = 5. Выберите все 3003 различных способа выбора 5 переменных и для каждой сделайте новое предложение с AND этих переменных И AND с отрицанием остальных переменных. В итоге вы получите 3003 предложения, каждая из которых имеет длину ровно 15, а общая стоимость составит 45054.
Ваш ответ должен быть логическим выражением такого рода, которое может быть просто вставлено, например, в python, чтобы я мог проверить его. Если два человека получают одинаковое выражение размера, код, который запускается быстрее всех, выигрывает.
Вам разрешено вводить новые переменные в ваше решение. Таким образом, в этом случае ваша логическая формула состоит из двоичных переменных y, x и некоторых новых переменных. Вся формула была бы выполнимой тогда и только тогда, когда сумма переменных y равна x.
В качестве начального упражнения некоторые люди могут захотеть начать с переменных y = 5, добавляя к x = 2. Наивный метод тогда даст стоимость 50.
Код должен принимать два значения y и x в качестве входных данных и выводить формулу и ее размер в качестве выходных данных. Стоимость решения - это просто необработанное количество переменных в его выводе. Таким образом, (a or b) and (!a or c)
считается 4. Единственные допустимые операторы and
, or
и not
.
Обновление Оказывается, есть умный способ решения этой проблемы, когда x = 1, по крайней мере, в теории.
источник
z[0] = y[0] and y[1]
, как ты хочешь, чтобы это указывалось?z[0]
представляла,y[0] or y[1]
тогда мне просто нужно ввести предложение, которое выглядит как(y[0] or y[1]) or not z[0]
(или любое эквивалентное утверждение, использующее 3 допустимых оператора).Ответы:
Python, 644
Генератор простых рекурсивных уравнений.
S
генерирует уравнение, которое удовлетворяется, если списокvars
суммирует доtotal
.Есть некоторые очевидные улучшения, которые необходимо сделать. Например, в выводе 15/5 есть много общих подвыражений.
Формирует:
источник
not x[0] and not x[1] and not x[2]
встречается 5 раз в выражении 15/5.Я бы сделал это комментарий, но у меня нет репутации. Я хотел бы прокомментировать, что результаты работы Kwon & Klieber (известной как кодировка «Commander») для k = 1 были обобщены для k> = 2 Фришем и соавторами. «SAT кодировки ограничения At-Most-k». То, о чем вы спрашиваете, - это особый случай ограничения AM-k с дополнительным предложением, гарантирующим At-Least-k, что тривиально, просто дизъюнкция всех переменных с ограничением AM-k. Фриш является ведущим исследователем в моделировании ограничений, поэтому я чувствую себя комфортно, предполагая, что [(2k + 2 C k + 1) + (2k + 2 C k-1)] * n / 2 является наилучшей оценкой, известной для числа пункты обязательны, и k * n / 2 для количества новых переменных, которые будут введены. Подробности в цитируемой статье вместе с инструкциями о том, как эта кодировка построена. Это' Довольно просто написать программу для генерации этой формулы, и я думаю, что такое решение будет конкурентоспособным с любыми другими решениями, которые вы, вероятно, найдете сейчас. НТН.
источник