satisfy_brute, an Octave code which uses brute force to find all assignments of values to a set of logical variables which make a complicated logical statement true.
This problem assumes that we are given a logical circuit of AND, OR and NOT gates, with N binary inputs and a single output. We are to determine all inputs which produce a 1 as the output.
The general problem is NP complete, so there is no known polynomial-time algorithm to solve the general case. The natural way to search for solutions then is exhaustive search.
In an interesting way, this is a very extreme and discrete version of the problem of maximizing a scalar function of multiple variables. The difference is that here we know that both the input and output only have the values 0 and 1, rather than a continuous range of real values!
This problem is a natural candidate for parallel computation, since the individual evaluations of the circuit are completely independent.
The example circuit considered here has been described in conjunctive normal form ("CNF"). This is a standard format for logical formulas. At the highest level, the formula consists of clauses joined by the AND (conjunction) operator. Each clause consists of signed literals joined by the OR (disjunction) operator. Each signed literal is either the name of a variable (positive literal), or the name of a variable preceded by the NOT (negation) operator (a negative literal). There is a CNF file format that can be used to store logical formulas that have been cast into conjunctive normal form.
The computer code and data files described and made available on this web page are distributed under the MIT license
satisfy_brute is available in a C version and a C++ version and a Fortran90 version and a MATLAB version and an Octave version and a Python version.
change_diophantine, an Octave code which sets up a Diophantine equation to solve the change making problem, which counts the number of ways a given sum can be formed using coins of various denominations.
change_dynamic, an Octave code which uses dynamic programming to solve the change making problem, which counts the number of ways a given sum can be formed using coins of various denominations.
change_greedy, an Octave code which uses the greedy method to seek a solution to the change making problem, which tries to match a given amount by selecting coins of various denominations.
change_polynomial, an Octave code which uses a polynomial multiplication algorithm to count the ways of making various sums using a given number of coins.
cnf, a data directory which describes the DIMACS CNF file format for defining instances of the satisfy problem for boolean formulas in conjunctive normal form.
combo, an Octave code which includes many combinatorial routines.
football_dynamic, an Octave code which uses dynamic programming to count the ways of achieving a given score in football.
knapsack_01_brute, an Octave code which uses brute force to solve small versions of the 0/1 knapsack problem;
knapsack_greedy, an Octave code which uses a greedy algorithm to estimate a solution of the knapsack problem;
mcnuggets, an Octave code which counts M(N), the number of ways a given number N of Chicken McNuggets can be assembled, given that they are only available in packages of 6, 9, and 20.
partition_brute, an Octave code which uses brute force to seek solutions of the partition problem, splitting a set of integers into two subsets with equal sum.
partition_greedy, an Octave code which uses a greedy algorithm to seek a solution of the partition problem, in which a given set of integers is to be split into two groups whose sums are as close as possible.
subset, an Octave code which enumerates combinations, partitions, subsets, index sets, and other combinatorial objects.
subset_sum, an Octave code which seeks solutions of the subset sum problem.
subset_sum_brute, an Octave code which uses brute force to solve the subset sum problem, to find a subset of a set of integers which has a given sum.
tsp_brute, an Octave code which reads a file of city-to-city distances and solves the traveling salesperson problem, using brute force.
tsp_descent, an Octave code which is given a city-to-city distance map, chooses an initial tour at random, and then tries a number of simple variations, seeking to quickly find a tour of lower cost.
tsp_greedy, an Octave code which reads a file of city-to-city distances, picks a starting city, and then successively visits the nearest unvisited city.
tsp_random, an Octave code which reads a file of city-to-city distances, and then randomly samples a number of possible tours, to quickly seek a tour of lower length.