Вы можете найти минимальное количество вентилей в многоуровневой сети только путем решения задачи целочисленного программирования [или ее эквивалентов, см. Ниже]. Эта проблема является NP-полной, так что практично решить только до дюжины ворот или около того.
Существуют методы аппроксимации, которые не дадут вам минимальное количество, но более удобны в плане требуемого времени ... Это большая тема сама по себе, в основном вся область многоуровневой оптимизации. Вы можете прочитать [бесплатный] обзор здесь .
Для небольших сетей NAND (до 4 переменных) проблема была полностью решена исчерпывающим перечислением [или эквивалентными методами]. Есть довольно недавняя [2009] кандидатская диссертация Элизабет Энн Эрнст, которая суммирует древние результаты и расширяет их. Эрнст использует ветвление и ограничение, что улучшает исчерпывающий метод на практике, но не асимптотически. Она также отмечает, что другие методы неявного перечисления, такие как целочисленное программирование или CSP (удовлетворение ограничений, решаемое с помощью SAT), работают хуже на практике.
Она, очевидно, написала какое-то программное обеспечение для своего метода (называемое BESS), но я не уверен, доступно ли оно где-нибудь публично. Полный текст ее диссертации находится в свободном доступе на umich . И действительно, вы нашли минимальное выражение для 2-х входного xor (очевидно, ваше второе), выделенное ниже:
Она также сравнила точные результаты (для NAND) с результатами, полученными эвристическим оптимизатором от ABC .
ABC удалось создать оптимальную сеть для 340 из 4043 функций, где оптимальная сеть известна. Для тех функций, где ABC не производила оптимальную сеть, она была в среднем на 36% больше, чем оптимальная сеть [.]
Существуют (очевидно) некоторые [более крупные] сети, для которых BESS не закончил, но позволил найти верхнюю границу (в точке, где поиск был прекращен). Для них ABC довольно хорошо [хорошо с точки зрения найденных границ], как вы можете видеть из 2-го графика ниже.