2017-08-25 6 views
0

シンプレックス法を使用して最小化を計算するには、scipy.optimize.linprogライブラリを使用しています。私は教科書でこの問題に取り組んでいます。私が期待している出力が得られないので、誰かが正しい方向に向けることを期待しています。問題は次のとおりです。Python linprog最小化 - シンプレックスメソッド

Minimize   w = 10*y1 + 15*y2 + 25*y3 
Subject to:  y1 + y2 + y3 >= 1000 
        y1 - 2*y2 >= 0 
          y3 >= 340 
with    y1 >= 0, y2 >= 0 

私はこのために書いたコードです:

Optimal value: -15100.0 
X: [ 660. 0. 340.] 
:私はそれがあることを期待

Optimal value: -18400.0 
X: [ 0. 660. 340.] 

出力を与える
import numpy as np 
import pandas as pd 
from scipy.optimize import linprog 
A = np.array([ 
[1, 1, 1], 
[1,-2, 0], 
[0, 0, 1]]) 
b = np.array([1000,0,340]) 
c = np.array([-10,-15,-25]) 
res = linprog(c, A_ub=A, b_ub=b, 
bounds=(0, None)) 
print('Optimal value:', res.fun, '\nX:', res.x) 

私はこの機能と一貫性を見つけることができませんしかし、おそらくそれは私がそれを使用している方法です。

答えて

2

入力を少し間違って設定しました。 the manualを参照してください。具体的には、多くの符号エラーがあります。

  1. ベクトルcに間違った記号があります。 linprogのでcがちょうどbとマトリックスAが間違った看板を持ってw = c x
  2. あなたのベクトルの係数でなければなりませんc xを最小限に抑えます。その兆候はすなわち-f(x) <= - const

  3. 、より少なくよりか-等しいlinprog方法、のために所望の形状に制約f(x) >= constのフォームから切り替えるように反転しなければならないあなたは最後の2つの制約が欠落しています。

  4. 提案された最小値は<であり、これは明らかに不可能です。 w = 10*x1 + 15*x2 + 25*x3は、常に制約がx1,x2,x3>=0であるためです。

正しいコードを読み取ります

import numpy as np 
from scipy.optimize import linprog 

A = np.array([[-1, -1, -1], [-1,2, 0], [0, 0, -1], [-1, 0, 0], [0, -1, 0]]) 
b = np.array([-1000, 0, -340, 0, 0]) 
c = np.array([10,15,25]) 

res = linprog(c, A_ub=A, b_ub=b,bounds=(0, None)) 

print('Optimal value:', res.fun, '\nX:', res.x) 
# ('Optimal value:', 15100.0, '\nX:', array([ 660., 0., 340.])) 
+0

素晴らしい説明だこと - あなたに感謝!私はドキュメントにもっと多くの例があり、このように少し良く説明されたことを望みます。私はもともと、正しい符号を持つベクトルcを持っていましたが、出力が得られなかったので、それらを切り替えました。ベクトルbと行列Aについては、記号を逆転させることを知っていなければなりません。より多くの例がすべて同じかそれ以下であることを認識していなければなりません。私は完全に最後の2つの制約を逃した。 –

関連する問題