Оно делает. Если вы ограничены 20-30 переменными, вы можете просто перебрать все комбинации. Если на попытку требуется 100 нс (это 500 машинных инструкций), она будет выполняться примерно за 100 секунд. Это быстрее, чем ты.
Если вы хотите решить гораздо большие уравнения, вам нужно создать настоящий решатель ограничений.
РЕДАКТИРОВАТЬ из-за замечания OP о попытке параллельного ускорения Java-программы, которая грубо заставляет ответ:
Я не знаю, как вы представляете свою логическую формулу. Для грубой силы вы не хотите интерпретировать дерево формул или делать что-то еще, что медленно.
Ключевой трюк заключается в том, чтобы сделать вычисление логической формулы быстрым. Для большинства языков программирования вы должны иметь возможность закодировать формулу для проверки как собственное выражение на этом языке вручную, обернуть ее N вложенными циклами и скомпилировать все это целиком, например,
A=false;
do {
B=false;
do {
C= false;
do {
if (A & (B | C) ) { printf (" %b %b %b\n",A,B,C);
C=~C;
} until C==false;
B=~B;
} until B==false;
A=~A;
} until A==false;
Скомпилированный (или даже JIT-компилированный с помощью Java), я ожидаю, что внутренний цикл будет выполнять 1-2 машинных инструкции на логическую операцию, касаясь только регистров или одной строки кэша, плюс 2 для цикла. Для 20 переменных это около 42 машинных инструкций, даже лучше, чем моя приблизительная оценка в первом абзаце.
Если кто-то настаивает, можно преобразовать самые внешние циклы (3 или 4) в параллельные потоки, но если все, что вам нужно, это операторы печати, я не понимаю, как это будет иметь значение с точки зрения полезности.
Если у вас есть много таких формул, легко написать генератор кода для их создания из любого имеющегося у вас представления формулы (например, дерева синтаксического анализа ANTLR).
person
Ira Baxter
schedule
02.12.2016