Решить систему булевых уравнений в Matlab - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть набор булевых уравнений, т.е.

var1 = x AND y
var2 = x OR z
var3 = ...
var4 = ...

И ограничение, что каждый вывод vari должен равняться 1.

Я хочу каждую соответствующую комбинацию входных переменных (х, y, z ...), который удовлетворяет этим уравнениям.

Например, первые два уравнения позволят [x y z] = [1 1 0] or [1 1 1] в качестве решений.

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете сделать это довольно легко, если у вас не слишком много переменных.

Этот метод остановится, если у вас много переменных, потому что он использует матрицу размера K*(2^K), где K - число переменных, а combvec становится довольно медленным для больших K тоже.

Хотя вы должны быть осторожны с количеством переменных, этот метод вполне способен обрабатывать многие логические «уравнения» с небольшими издержками.


В x, y, z пример:

% Get all combinations of x/y/z, where each is true or false
opts = repmat( {[true, false]}, 1, 3 );
xyz = combvec( opts{:} )
% Assign each row to a named variable 
x = xyz(1,:); y = xyz(2,:); z = xyz(3,:);
% Get the combinations which satisfy your conditions
results = xyz( :, (x & y) & (x | z) );
% Each column of results is a solution
>> results
results = 
    1    1
    1    1
    1    0

В более общем виде это может выглядеть примерно так:

K = 3; % K variables (previously x, y and z so K = 3)
% Create all true/false combinations
opts = repmat( {[true, false]}, 1, K );
combs = combvec( opts{:} );

% Shorthand so we can write in(i) not combs(i,:)
in = @(k) combs(k,:); 
% Apply conditions
results = combs( :, (in(1) & in(2)) ...
                  & (in(1) | in(3)) );

Примечание: если у вас нет NeuralNetwork Toolbox, у вас не будет combvec.Есть много альтернатив для получения всех комбинаций.

...