2017-12-08 29 views
1

linprogからscipy.optimizeを使って線形システムを解くことを試みましたが、いくつかの不等式と矛盾する答えがありました。ここ は私に設定されている:あなたはx_2 => 8.88178420e-16が-2以上である見ることができるようにlinprog in scipy.optimize - 解決策

fun: -0.0 
message: 'Optimization terminated successfully.' 
    nit: 15 
    slack: array([ -2., -2., -2., 94., 0., 0., -2.]) 
    status: 0 
success: True 
     x: array([ 0.00000000e+00, -8.88178420e-16, -1.77635684e-15, 
     9.60000000e+01, 2.00000000e+00, 2.00000000e+00, 
     -7.10542736e-15]) 

ここ
import numpy as np 
from scipy.optimize import linprog 
c = np.array([1,0,0,0,0,0,0]) 
A_ub = np.identity(7)*(-1) 
b_ub = np.array([[-2],[-2],[-2],[-2],[-2],[-2],[-2]]) 
A_eq = np.array([[1,1,1,1,1,1,0],[0.3,1.3,0.9,0,0,0,-1],[0.3,0,0,0,0,0,-2/3], 
       [0,0.65,0,0,0,0,-1/15],[0,0,0.3,0,0,0,-1/15]]) 
b_eq = np.array([[100],[0],[0],[0],[0]]) 
res = linprog(c = c, A_ub=A_ub, b_ub=b_ub, A_eq = A_eq, b_eq = b_eq) 

が答えです。

誰かがなぜそれが起こるかを明確にすることができますか? 一般にlinprog

答えて

1

、scipyのダウンロードのlinprogは(method='simplex'が)多少壊れており、もはや多くを維持しない:ここでは

は、ドキュメントへのリンクです。以下のような

負のスラックス:

slack: array([ -2., -2., -2., 94., 0., 0., -2.]) 

は、有効な解決策になることはありません!

私はlinprogでいくつかの悪いことを見ましたが(既存の実現可能な解決策を見つけられない)、これは非常に悪いです(実行不可能な解決策が正しいと主張しています)!

だから、三つのこと:

  • scipyのダウンロード> = 1.0をベースにした新しいインテリア・ポイントを持っているLP-ソルバーmethod='interior-point'より堅牢で、より高度である
    • 非常に異なるアルゴリズム・ワイズ!
    • あなたのようなユースケースのための唯一の違いは、(離れて堅牢性と性能から)ソリューションの性質である:
      • は、基本的な解決策であるとは限りません(なしクロスオーバーのサポート、商用ソルバーがいることを許可しません) !
  • 可変範囲を記述する代わりに、これらの不等式の境界引数を使用!
    • さらに特殊な取り扱い!
  • あなたが説明した:-x <= -2 <-> x >= 2
    • が期待されると正解がx >= 2です!

あなたのコードのIPM:

 con: array([ 2.77992740e-10, -1.52664548e-11, 3.69659858e-12, -5.92570437e-12, 
     -2.37077025e-12]) 
    fun: 43.3333333331385 
message: 'Optimization terminated successfully.' 
    nit: 5 
    slack: array([4.13333333e+01, 6.92779167e-13, 2.33333333e+00, 1.47777778e+01, 
     1.47777778e+01, 1.47777778e+01, 1.75000000e+01]) 
    status: 0 
success: True 
     x: array([43.33333333, 2.  , 4.33333333, 16.77777778, 16.77777778, 
     16.77777778, 19.5  ]) 
+0

は、返信いただきありがとうございます。私は 'res = linprog(c = c、A_eq = A_eq、b_eq = b_eq、 bounds =((2、なし)、(2、なし)、(2、なし)、(2、なし)、 ValueError:Unknown solver interior-point' – user1700890

+1

私が言ったように:scipy> = 1.0(2、None)、(2、None)、 method = 'interior-point' – sascha

関連する問題