在Matlab中求解布尔方程组

时间:2019-02-18 14:37:52

标签: matlab boolean boolean-logic equation-solving

我有一组布尔方程,即

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

以及每个输出vari应该等于1的约束。

我想要满足这些方程式的输入变量(x,y,z ...)的每个对应组合。

例如,前两个方程将允许[x y z] = [1 1 0] or [1 1 1]作为解。

1 个答案:

答案 0 :(得分:3)

如果您没有太多的变量,您可以很容易地做到这一点。

如果您确实有很多变量,则此方法将停顿,因为该方法使用大小为K*(2^K)的矩阵,其中K是变量的数量,而combvec的使用速度非常慢大K

尽管必须警惕变量的数量,但是此方法能够以很少的开销处理许多逻辑“方程”。


xyz示例中:

% 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)) );

注意:如果您没有神经网络工具箱,那么您将没有combvecmany alternatives用于获取所有组合。