【问题标题】:Linear Optimization: Absolute difference between binary vectors线性优化:二进制向量之间的绝对差
【发布时间】:2022-01-17 04:49:05
【问题描述】:

我的优化问题(我的目标是保持线性)的决策变量是一个放置二进制向量,其中每个位置的值是 0 或 1(项目 i 的两个不同可能位置)。

目标函数的一个组成部分是:

C_T 是转移 N 个项目的常数。

k 是我当前解决问题的迭代,k-1 是项目的当前位移(解决问题 k-1 的最后一次迭代的结果)。我有一个初始条件 (k=0)。

N是“当前位移(k-1)和优化问题的结果(未来最优位移x^k)之间有多少x的位置不同”。

如何保持目标函数的这个分量是线性的?换句话说,如何替换 XOR 运算符? 我考虑过使用绝对差异作为替代方案,但我不确定它是否会有所帮助。

有没有线性的方法来做到这一点?

我将在 python 中用 PuLP 实现这个问题,也许那里也有一些可以帮助的东西......

【问题讨论】:

    标签: mathematical-optimization linear-programming nonlinear-optimization pulp absolute-value


    【解决方案1】:

    我的符号是:xprev[i] 是以前的解决方案,x[i] 是当前解决方案。我假设xprev[i] 是一个二进制常量,x[i] 是一个二进制变量。然后我们可以写

       sum(i, |xprev[i]-x[i]|) 
       =sum(i|xprev[i]=0, x[i]) + sum(i|xprev[i]=1, 1-x[i]) 
       =sum(i, x[i]*(1-xprev[i]) + (1-x[i])*xprev[i])  
    

    第二行和第三行都可以直接在 Pulp 中实现。请注意 |第二行是“这样”。


    下面有一条评论声称这是错误的。所以让我们把我的表达写成B*(1-A)+(1-B)*A。可构造如下真值表:

     A   B   A xor B    B*(1-A)+(1-B)*A
     0   0      0          0   +   0  
     0   1      1          1   +   0  
     1   0      1          0   +   1
     1   1      0          0   +   0
    

    请注意,A xor B = A*not(B) + not(A)*B 是众所周知的身份。


    注意。这里我假设xprev[i](或A)是一个常数,所以事情是线性的。如果两者都是(布尔)变量(我们称它们为 x 和 y),那么我们需要做一些不同的事情。我们可以使用四个不等式对构造 z = x xor y 进行线性化:

    z <= x + y
    z >= x - y
    z >= y - x
    z <= 2 - x - y
    

    这现在是线性的,可以在 MIP 求解器中使用。

    【讨论】:

    • 这是错误的。我假设您将 XOR 定义为(A AND (NOT B)) OR ((NOT A) AND B),但这并不能从数学上转换为您所写的内容。例如,如果OR = +,那么它不适用于A = 1B = 1。相反,它被定义为A OR B = A + B - A*B
    • @eduardokapp 来吧。 A=B=1 评估为 B*(1-A)+(1-B)*A = 0 + 0。显然A XOR B = 0 也适用于A=B=1。像这样的表达式在数学编程中并不少见,我经常使用它们。如果这不起作用,我的许多模型都会出错。
    • 我的错。我没有说你的表达是错误的,但我认为你不能将 OR 定义为一个简单的 + (你不能)。但是,现在我意识到 OR 被整体逻辑“嵌入”了。对不起!
    【解决方案2】:

    更新: 如果您需要替换的是 XOR 门,那么您可以使用其他线性门的组合来替换它。以下是其中一些https://en.wikipedia.org/wiki/XOR_gate#Alternatives

    例如:A XOR B = (A OR B) AND (NOT A + NOT B)。当 A 和 B 是二进制时,这应该在数学上转换为:

    (A + B - A * B) * ((-A) + (-B) - (-A * -B))
    

    为什么不用乘法?

    AND table
    0 0 = 0
    0 1 = 0
    1 0 = 0
    1 1 = 1
    
    Multiplication table
    0*0 = 0
    0*1 = 0
    1*0 = 0
    1*1 = 1
    

    我认为可以。如果没有,那么我想需要更多细节。

    【讨论】:

    • 对不起,我确实做错了。逻辑运算不是AND,应该是XOR(相当于绝对差)!基本上我想计算改变的“位”(或位置)。
    • @enrico_steez 我更新了我的答案。
    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多