Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反向二进制网络_Javascript_Algorithm_Math_Binary - Fatal编程技术网

Javascript 反向二进制网络

Javascript 反向二进制网络,javascript,algorithm,math,binary,Javascript,Algorithm,Math,Binary,我怎样才能反转一个二元方程,这样我就可以找到哪些输入将产生一个给定的输出 例如: Inputs: i0 through i8 Outputs: o0 through o8 Operators: ^ = XOR, & = AND 二元方程: (1&i0) ^ (1&i1) ^ (0&i2) ^ (1&i3) ^ (0&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o0 (0&am

我怎样才能反转一个二元方程,这样我就可以找到哪些输入将产生一个给定的输出

例如:

Inputs: i0 through i8
Outputs: o0 through o8
Operators: ^ = XOR, & = AND
二元方程:

(1&i0) ^ (1&i1) ^ (0&i2) ^ (1&i3) ^ (0&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o0
(0&i0) ^ (1&i1) ^ (0&i2) ^ (1&i3) ^ (1&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o1
(0&i0) ^ (1&i1) ^ (1&i2) ^ (0&i3) ^ (0&i4) ^ (1&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o2
(1&i0) ^ (0&i1) ^ (0&i2) ^ (1&i3) ^ (0&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o3
(0&i0) ^ (1&i1) ^ (0&i2) ^ (1&i3) ^ (1&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o4
(0&i0) ^ (0&i1) ^ (0&i2) ^ (0&i3) ^ (0&i4) ^ (1&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o5
(0&i0) ^ (0&i1) ^ (0&i2) ^ (1&i3) ^ (0&i4) ^ (0&i5) ^ (1&i6) ^ (0&i7) ^ (0&i8) = o6
(0&i0) ^ (0&i1) ^ (0&i2) ^ (1&i3) ^ (1&i4) ^ (0&i5) ^ (1&i6) ^ (1&i7) ^ (0&i8) = o7
(0&i0) ^ (0&i1) ^ (0&i2) ^ (0&i3) ^ (0&i4) ^ (1&i5) ^ (0&i6) ^ (0&i7) ^ (1&i8) = o8
以矩阵形式:

1,1,0,1,0,0,0,0,0,1
0,1,0,1,1,0,0,0,0,1
0,1,1,0,0,1,0,0,0,1
1,0,0,1,0,0,0,0,0,1
0,1,0,1,1,0,0,0,0,1
0,0,0,0,0,1,0,0,0,1
0,0,0,1,0,0,1,0,0,1
0,0,0,1,1,0,1,1,0,1
0,0,0,0,0,1,0,0,1,1
其他限制:

  • 素数对角线总是1
  • 我感兴趣的是是否有解决方案,而不仅仅是解决方案本身
我如何通过算法找到输入i0-i8,使输出o0-o8为1?我真正想找到的是,是否有这样的解决方案


我需要一种可扩展到更大网络的算法,至少100个输入/输出。

关于异或的一个有趣的事情是:

a ^ b ^ b = a
这允许进行很好的操作,比如说:

a ^ b = c
然后,您可以通过
xor
使用
b
对两侧进行排序,轻松算出
a
,得到:

a = c ^ b
如果我处在你的位置,我会用这个技巧从输出中获取输入。方程中出现的
ing仅具有从某些方程中删除某些输入变量的效果,因此它不会对这种方法造成任何问题

首先,您必须知道,对于特定的系数矩阵,可能没有解决方案,例如,如果输入从未出现在任何方程中(即,矩阵中的一列全零),或者一个方程出现两次(即,两行相同),或者一个方程是两个其他方程的组合

现在,假设你的矩阵确实产生了问题的解决方案,方法是使用每个方程来找到一个输入。对于每个方程,
xor
除一个输入外的所有输入的两侧(并为每个方程更改此输入)。例如,假设我想使用第一个方程式来查找
i0
,第二个方程式来查找
i1
(注意,输入必须出现在方程式中才能生成此值),我现在可以:

i0 = o0 ^ i1 ^ i3
i1 = o1 ^ i3 ^ i4
继续其他方程式,然后用方程式中的值替换右侧的所有输入。递归重复,直到右侧仅包含输出。如果对所有方程式重复,将找到所有输入的值


我确信
在求解线性方程组时,可以使用已经建立的方法优化此方法,尤其是利用矩阵形式。

您可以在多项式时间内解决2-SAT问题,请参阅

这里是一个链接到一个快速算法(繁重的数学,我会继续寻找更好的链接)

与的另一个链接

编辑:虽然我在这方面找到了很多文章,但我没有看到多少可实现的代码。大部分工作都是为了证明可满足性。您可能需要简化子句(删除每次运行时带零的子句),然后使用递归算法证明不可满足性,如果您发现满足了,那么您就解决了问题。

使用XOR(而不是OR),乍一看,某种形式的函数至少可以简化问题。改编维基百科关于reduced的文章中的伪代码,我们得到:

在此基础上,您可以调整算法以生成行的可能输入,同时考虑前面行的分区。生成分区是一个很好的记忆选择


仍然需要进行时间分析,以确定上述内容是否值得。

看来我的答案比预期/要求的水平要低得多。对不起~!实际上这很好。是关于我现在的处境。基本上,我正在尝试实现Gussian消除。但不知何故,我到目前为止尝试过的两种不同的实现都出现了故障。我只接受了另一个答案,因为他提供了伪代码,这正是我想要的。但你所说的异或为我指明了正确的方向,让我来弄清楚。谢谢不客气:)如果我处在你的位置,我也会接受他的回答+我向他致敬!嘿,我刚到了一个类似的状态。基本上,我认为唯一有意义的基本行操作是将行异或在一起。但后来我得到了那一排0,我想这行不通。现在我意识到仍然可以有多个解决方案,因此我可以得到自由变量。所以我所能做的就是尽可能地减少它,然后对0行尝试所有可能的输入。谢谢
function ToReducedRowEchelonForm(Matrix M) is
    // 'lead' is the column index in a row of the leading 1
    lead := 0
    rowCount := the number of rows in M
    columnCount := the number of columns in M
    for 0 ≤ r < rowCount do
        if columnCount ≤ lead then
            stop
        end if
        i = r
        // Find row with lead point
        while M[i, lead] = 0 do
            i = i + 1
            if rowCount = i then
            // no pivot in this column, move to next
                i = r
                lead = lead + 1
                if columnCount = lead then
                    stop
                end if
            end if
        end while
        Swap rows i and r
        for 0 ≤ i < rowCount do
            if i ≠ r do
                Set row i to row i XOR row r
            end if
        end for
        lead = lead + 1
    end for
end function
1,0,0,0,0,0,0,1,0,0
0,1,0,0,0,0,0,0,0,0
0,0,1,0,0,0,0,0,0,0
0,0,0,1,0,0,0,1,0,1
0,0,0,0,1,0,0,1,0,0
0,0,0,0,0,1,0,0,0,1
0,0,0,0,0,0,1,1,0,0
0,0,0,0,0,0,0,0,1,0
0,0,0,0,0,0,0,0,0,0