如何使用+, - ,*,/
等基本数学运算符实现XOR更新:实际上,我需要跟踪具有布尔值的两个矩阵的变化。这可以使用XORing每个值与其他矩阵中的对应值来完成。但是,Lp_Solve库不支持XOR操作。此外,它只接受线性方程。
答案 0 :(得分:13)
这是因为:
(a − b)² = a * (a − b) + b * (b − a)
由于ℤ2中的乘法是结合(&
),而1 - a
是否定(!
),上述公式相当于a, b ∈ {0, 1}
的XOR:
(a & !b) | (b & !a)
请参阅Pascal Cuoq下面的评论,解释为什么这不能是线性等式。
答案 1 :(得分:9)
我能提出的最简单的表达方式是:a != b
。
(之前的最佳努力是(a + b) == 1
)
答案 2 :(得分:6)
答案 3 :(得分:6)
在Brown,G。和Dell,R。,制定线性和整数线性程序:流氓画廊 可以找到以下XOR的线性规划公式:
Z3 = Z1 XOR Z2
解析为
Z3 <= Z1 + Z2
Z3 >= Z1 - Z2
Z3 >= -Z1 + Z2
Z3 <= 2 - Z1 - Z2
答案 4 :(得分:5)
你能做点什么:
(a + b) % 2
答案 5 :(得分:3)
2因素XOR
虽然(x-y)²
是双因素XOR的一个非常紧凑的等式,但这种形式在某些方面具有误导性。
虽然对于1和0的值,这些方程的评估是相同的,但它们在代数上并不相等......
(a − b)²
≠a * (1 − b) + b * (1 − a)
此外,逻辑OR
运算符不会在没有约束的情况下作为+
进行算术转换。对于两个1的AND
条件,这将为您提供值2。如果您首先考虑NOT
和AND
..
NOT
= (1-x)
AND
= x*y
你真正需要的是这样......
OR
= (1-(1-a)(1-b))
= a + b - ab
请注意,OR
的特点是纯粹是附加的,因此您加入了两套,但是您不想复制这些集合的任何重叠,因此您减去{{1}通过乘法找到的条件。因此,您的附加项AND
减去重叠或a+b
条件AND
。如果您确定您的集合不会重叠,那么您可以使用
a*b
= OR
,如果我们知道&{1}}的所有值a + b
B'/ P>
同样,我们可以推导出一个XOR方程。使用复合逻辑a*b = 0
,你会得到......
(a && !b) || (!a && b)
= XOR
≠1 - (1 - a(1-b))(1 - b(1-a))
所以(a-b)²
在逻辑和代数的翻译中有些误导。事实证明,这些错误会被二进制输入的约束掩盖,因为条件(a-b)²
和a(1-b)
是互斥的,这放松了处理{b(1-a)
运算符的约束。 1}}条件并允许将其建模为OR
。
吉利德的回答有助于解释为什么AND
确实有效。当您展开+
= (x-y)²
时,您可以看到它如何满足此基本模型...
(x-y)²
使用这些知识,您可以看到有许多方程式可以工作。例如,满足这些条件的实际最基本的等式是......
x² + y² - 2xy
这与我们为X = A + B - 2*H
H <= A
H <= B
H >= A + B - 1
H >= 0
得出的公式完全相同,但现在我们不仅要删除x + y - 2xy
条件(OR
)的副本,还要拒绝AND
条件全部在一起(-xy
)。事实证明,这也是AND
...
-2xy
= (a-b)²
。
a * (1 − b) + b * (1 − a)
可用于代替,因为,
a + b - 2ab ≠ (a-b)²
= (a-b)²
,值为1和0,
(a-b)²
= a² + b² - 2ab
(对我来说,这是在代码中使用的最佳模型,原因有两个:1。)它比使用权力2更简单。)它更容易看到它背后的逻辑,因为a被添加到b后跟其重叠的完全否定(x2)a和b)
超越2个因素
当你想要XOR(A,B,C ......)时怎么样?这里的问题是,如果我们试图辨别所有真实条件,就像我们在双因子XOR的复合逻辑中所做的那样,它不能很好地扩展,因为你必须添加每个真理的排列。然而,逻辑就是这样,我们可以通过免费的方式来到XOR ......
a² + b² - 2ab
= a + b - 2ab
您可以从中以......的形式为任意数量的因子构建算术XOR。
XOR
!(A & B & C...) & !(!A & !B & !C...)
模糊
有趣的是停下来思考一下,如果我们使用上面的多因子方程得到一个双因子方程式,我们得到以下结果......
(1 - A*B*C...)(1 - (1-A)(1-B)(1-C)...)
首先要注意的是,这与我们从真实条件中得出的2因子方程相似但不相等......
Function ArithmeticXOR(R As Range, Optional EvaluateEquation = True)
Dim AndOfNots As String
Dim AndGate As String
For Each c In R
AndOfNots = AndOfNots & "*(1-" & c.Address & ")"
AndGate = AndGate & "*" & c.Address
Next
AndOfNots = Mid(AndOfNots, 2)
AndGate = Mid(AndGate, 2)
'Now all we want is (Not(AndGate) AND Not(AndOfNots))
ArithmeticXOR = "(1 - " & AndOfNots & ")*(1 - " & AndGate & ")"
If EvaluateEquation Then
ArithmeticXOR = Application.Evaluate(xor2)
End If
End Function
= a + b - ab(1 + a + b - ab)
事实上,区别在于以下术语......
1 - (1 - a(1-b))(1 - b(1-a))
≠a + b - ab(3 - a - b + ab)
那是什么给出的?我认为这是使用赞美的算术神器。如果你注意到,这两个词相互补充,他们会从不同的方向做同样的事情:一个从1上升到2,另一个从3下降到2.两个到达2,但他们的到达方向因为他们接近赞美而有所不同。
要注意的第二点是,两个方程都比1 + a + b - ab
和3 - a - b + ab
等最小方程复杂得多。这是否意味着什么,这种增加的复杂性是否有任何价值?
显然,为此,您必须关注离散点(0,0),(0,1),(1,0)和(1,1)之外的十进制值。 )。这为什么会这么重要?有时您希望放宽离散问题的整数约束。在这种情况下,您必须查看用于将逻辑运算符转换为方程式的前提。
在将布尔逻辑转换为算术时,您的基本构建块是x + y - 2xy
和(x-y)²
运算符,您可以使用它们构建AND
和NOT
。
OR
= XOR
OR
= (1-(1-a)(1-b)(1-c)...)
因此,如果您正在考虑小数区域,那么值得思考我们如何定义这些运算符以及它们在该区域的行为。
翻译XOR
我们将(1 - a*b*c...)(1 - (1-a)(1-b)(1-c)...)
表示为NOT
。显然,这个简单的等式适用于0和1的二进制值,但对它来说非常酷的事情是它还为0到1之间的值提供了分数或百分比的补语。这是有用的,因为{ {1}}在布尔逻辑中也称为NOT
,当涉及集合时,1-x
指的是当前集合之外的所有内容。
翻译NOT
我们将Compliment
表示为NOT
。再一次,显然它适用于0和1,但是对于0到1之间的值,它的效果更加随意,其中乘法导致部分真值(十进制值)相互减小。可以想象你想要将真相模拟为在这个区域中的平均或累积。例如,如果两个条件假设为半真,那么AND
条件只有四分之一真(0.5 * 0.5),或者它是完全正确(0.5 + 0.5 = 1),还是保持半真(({ 0.5 + 0.5)/ 2)?事实证明,对于完全离散且部分真理代表概率的条件,四分之一真理实际上是正确的。例如,你现在和第二次翻转尾巴(二进制条件,50%概率)吗?答案是0.5 * 0.5 = 0.25,或25%为真。积累并不真正有意义,因为它基本上模拟AND
条件(记住x*y
可以AND
当OR
条件不建模时现在,所以求和是OR
)的特征。如果您正在查看协议和度量,那么平均值是有意义的,但它实际上是+
和AND
混合的建模。例如,要求2个人以1到10的等级说出他们对声明的同意程度&#34;外面是冷的&#34;?如果他们都说5,那么陈述的真相&#34;外面是冷的&#34;是50%。
这里的一点是,如果放宽整数约束,则对小数区域有一些含义。您可能希望这样做以使离散问题更容易/可能解决。您需要考虑价值在这个地区的互动方式以及它们如何被转换回来。
任何一个k
这里有一个最后的消息。如果任意n个输入为真,有时您希望条件为真。这可以被视为放松的OR
条件,例如,您愿意接受&amp; b或a&amp; c或b&amp; c。这可以从复合逻辑算术建模...
AND
并应用我们的翻译......
1 - (1-ab)(1-ac)(1-bc)...
这对它有用,但在扩展条款时,这也是一个有趣的模式。有一种变量和指数组合的模式,但这会很长;但是,您可以通过忽略二进制上下文的权限来简化。确切的模式取决于n与k的关系。对于n = k-1,其中k是被测试条件的总数,结果如下:
c1 + c2 + c3 ... ck - n *Π
其中c1到ck都是n变量组合。
例如,如果满足4个条件中的3个就是
abc + abe + ace + bce - 3abce
这具有完美的逻辑意义,因为我们所拥有的是OR
条件的加法AND
减去重叠的(a && b) || (a && c) || (b && c) ...
条件。
如果你开始看n = k-2,k-3等,那么模式会变得更复杂,因为我们有更多的重叠来减去。如果这完全扩展到n = 1的最小值,那么我们只得到一个常规的OR
条件。
答案 6 :(得分:0)
异或OR 是线性函数,但关于布尔函数的'linear'的definition与多项式函数不同。您必须查看lp_solve
库的文档,看看它是否能够处理线性布尔函数。从我所读到的,我不怀疑它可以。
编辑:在进一步研究lp_solve
使用的单纯形算法之后,我相当肯定你不能做你想做的事。
答案 7 :(得分:0)
ABS(A + B-1)。如果不做abs,则(A + B-1)*(A + B-1)应该这样做。
答案 8 :(得分:0)
您可以使用此:
Xor(n,x,y)= x + y-Pow(2,n + 1)(floor((x + y)/ Pow(2,n + 1)));
何时
x => Z集合中的正数,x> = 0
y => Z集合中的数字为正,y> = 0
n =>是数据位长度,例如32或64
pow(2,3)=> 2 2 2
楼层(1.6594565)= 1或楼层(4562.21)= 4562