1

私はの形で機能を最適化しようとしています:scipyのダウンロード、より複雑な関数ではlinprogを最適化

1*abs(x_0) + 1*abs(x_1) + .. + 1*abs(x_n) 

係数を機能で、常に1ですが、私 X の値の条件があります例えば

X - X = 7 <とX - X < = 4、など。

私はscipy.optimize.linprogを使用していますが、これはのみの形式で関数を解決することができます:

a_0*x_0 + a_1*x_1 + .. + a_n*x_n 

ためscipy.optimize.linprogを使用する方法はあります最初の関数?

答えて

1

問題:

Minimize 1*abs(x_0) + 1*abs(x_1) + ... + 1*abs(x_n)) 
s.t.  x_2 - x3 <= 7 

が問題に変換することができます。

ここ
Minimize 1*y_0 + 1*y_1 + ... + 1*y_n 
s.t.  x_2 - x3 <= 7 
     -y_i <= x_i <= y_i // for i in n 

我々は新しい変数をy_0, ..., y_n紹介しました。

だから、あなた(仮定:最小化)を少し変更した問題は、次のようになりますし

  • :あなたはライブラリをインストール上のビットの知識を得た

    from scipy.optimize import linprog 
    import numpy as np 
    
    N = 5 
    N_AUX = N 
    
    c = np.hstack((np.zeros(N), np.ones(N_AUX))) # objective -> sum of aux-vars 
    
    A_orig = [[0, 1, -1, 0, 0, 0, 0, 0, 0, 0], # orig constraint 1 
          [0, 0, 1, -1, 0, 0, 0, 0, 0, 0], # orig constraint 2 
          [-1, -1, 0, 0, 0, 0, 0, 0, 0, 0], # more interesting problem 
          [0, -1, -1, 0, 0, 0, 0, 0, 0, 0]] # "" ""   "" 
    
    A_aux = [[-1, 0, 0, 0, 0, -1, 0, 0, 0, 0], 
         [0, -1, 0, 0, 0, 0, -1, 0, 0, 0], 
         [0, 0, -1, 0, 0, 0, 0, -1, 0, 0], 
         [0, 0, 0, -1, 0, 0, 0, 0, -1, 0], 
         [0, 0, 0, 0, -1, 0, 0, 0, 0, -1], 
         [1, 0, 0, 0, 0, -1, 0, 0, 0, 0], 
         [0, 1, 0, 0, 0, 0, -1, 0, 0, 0], 
         [0, 0, 1, 0, 0, 0, 0, -1, 0, 0], 
         [0, 0, 0, 1, 0, 0, 0, 0, -1, 0], 
         [0, 0, 0, 0, 1, 0, 0, 0, 0, -1]] 
    
    A = np.vstack((A_orig, A_aux)) 
    
    b = [7, 4, -5, -8] + [0 for i in range(N_AUX*2)] 
    bnds = [(0, 50) for i in range(N)] + [(None, None) for i in range(N_AUX)] # some custom bounds 
    
    res = linprog(c, A_ub=A, b_ub=b, bounds=bnds) 
    
    print(res) 
    
    #  fun: 8.0 
    # message: 'Optimization terminated successfully.' 
    #  nit: 10 
    # slack: array([ 5., 1., 0., 10., 6., 0., 0., 0., 0.,   0., 0., 
    #  0., 50., 45., 47., 50., 50., 0., 0.]) 
    # status: 0 
    # success: True 
    #  x: array([ 0., 5., 3., 0., 0., 0., 5., 3., 0., 0.]) 
    

    場合、私はどのcvxpyを使用することをお勧めしますこの種の変換は自動的に(他の中でも)

  • は、はるかに優れたソルバー(オープンソースおよび商用、シンプレックスおよび非シンプレックスベース)をサポートします

同じ例:

from cvxpy import * 

x = Variable(5) 
constraints = [x[1] - x[2] <= 7, 
       x[2] - x[3] <= 4, 
       x[0] + x[1] >= 5, 
       x[1] + x[2] >= 8, 
       x >= 0, 
       x <= 50] 
objective = Minimize(sum_entries(abs(x))) 
problem = Problem(objective, constraints) 
problem.solve() 
print(x.value) 
print(problem.value) 

# [[ -1.56436431e-11] 
# [ 5.83767132e+00] 
# [ 2.16232868e+00] 
# [ 6.53497343e-10] 
# [ 7.79511984e-10]] 
# 8.00000000102 
関連する問題