Python lpsolve-每次更改约束顺序时,结果都不同

Python lpsolve-每次更改约束顺序时,结果都不同,python,lpsolve,Python,Lpsolve,我注意到lpsolve库的一个奇怪行为(在python 3.4中使用它) 当我更改我添加到lpsolve模型的约束顺序时,结果也略有不同 我很高兴能得到任何关于为什么会发生这种情况的提示 添加两个模型以再现案例: lp model 1: http://pastie.org/private/mginn1s7orxkq58mv3dxrw lp model 2: http://pastie.org/private/ron5k7y3hipxhci1hap8nq 如果运行这两个模型,将得

我注意到lpsolve库的一个奇怪行为(在python 3.4中使用它)

当我更改我添加到lpsolve模型的约束顺序时,结果也略有不同

我很高兴能得到任何关于为什么会发生这种情况的提示

添加两个模型以再现案例:

    lp model 1: http://pastie.org/private/mginn1s7orxkq58mv3dxrw
    lp model 2: http://pastie.org/private/ron5k7y3hipxhci1hap8nq
如果运行这两个模型,将得到略有不同的结果(而目标函数几乎相同):

要复制的Python代码:

    from lpsolve55 import *

    mod1 = lpsolve("read_lp", "/home/../model_1.lp")
    mod2 = lpsolve("read_lp", "/home/../model_2.lp")

    res1 = lpsolve('solve', mod1)
    res2 = lpsolve('solve', mod2)

    obj1 = lpsolve('get_objective', mod1)
    obj2 = lpsolve('get_objective', mod2)

    vars1 = lpsolve('get_variables', mod1)[0]
    vars2 = lpsolve('get_variables', mod2)[0]


    print("obj1: ", obj1)
    print("obj2: ", obj2)

    print("vars1: ", vars1)
    print("vars2: ", vars2)

这可能是因为您的模型在数值上并不完全稳定。您可能有不在同一范围内的变量输入(例如:x1可以是-1..+1,x2可以是-1000000..+1000000)

您能提供一些示例吗?:)@FredBarclay,添加了两个模型以复制案例。添加了可以在原始消息中复制的模型。你有什么想法吗?我在LPSolve IDE中用defaul参数运行你的2个模型,除了单纯形类型,我在其中放置了“primal primal”,我确实得到了完全相同的结果。但从两个值的差异(1e-16百分位)来看,由于计算顺序的不同,它看起来更像是一个舍入误差,而不是完全错误。请尝试使用所有默认选项重现它。我已经添加了要运行的python代码。您的代码非常好。值的差异纯粹是由于浮点计算中的舍入近似。请参阅[有关更多信息,我的第一个答案是胡乱猜测,因为您在第一个版本的问题中没有输入任何值。看到第二个版本的问题中的值,我可以毫无疑问地回答差异是由于舍入错误造成的,您对此无能为力。如果您这样做(obj1-obj2)/Obj1,你将得到2E-16,这是完全好的,你可以把这2个值视为一个完全相同的计算机。对于我的大多数程序,我甚至认为2个值在1E-8相等。
    from lpsolve55 import *

    mod1 = lpsolve("read_lp", "/home/../model_1.lp")
    mod2 = lpsolve("read_lp", "/home/../model_2.lp")

    res1 = lpsolve('solve', mod1)
    res2 = lpsolve('solve', mod2)

    obj1 = lpsolve('get_objective', mod1)
    obj2 = lpsolve('get_objective', mod2)

    vars1 = lpsolve('get_variables', mod1)[0]
    vars2 = lpsolve('get_variables', mod2)[0]


    print("obj1: ", obj1)
    print("obj2: ", obj2)

    print("vars1: ", vars1)
    print("vars2: ", vars2)