4

私は PuLP を使用して、制約、上限および下限を使用していくつかの最小化問題を解決しています。とても簡単できれいです。

ただし、Scipy および Numpy モジュールのみを使用する必要があります。

私が読んでいた: http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html

多変量スカラー関数の制約付き最小化

しかし、私は少し迷っています...いくつかの良い魂は、このPuLPのような小さな例をScipyに投稿できますか?

前もって感謝します。んん

from pulp import *

'''
Minimize        1.800A + 0.433B + 0.180C
Constraint      1A + 1B + 1C = 100
Constraint      0.480A + 0.080B + 0.020C >= 24
Constraint      0.744A + 0.800B + 0.142C >= 76
Constraint                            1C <= 2
'''

...
4

1 に答える 1

7

次の点を考慮してください。

import numpy as np
import scipy.optimize as opt

#Some variables
cost = np.array([1.800, 0.433, 0.180])
p = np.array([0.480, 0.080, 0.020])
e = np.array([0.744, 0.800, 0.142])

#Our function
fun = lambda x: np.sum(x*cost)

#Our conditions
cond = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 100},
        {'type': 'ineq', 'fun': lambda x: np.sum(p*x) - 24},
        {'type': 'ineq', 'fun': lambda x: np.sum(e*x) - 76},
        {'type': 'ineq', 'fun': lambda x: -1*x[2] + 2})


bnds = ((0,100),(0,100),(0,100))
guess = [20,30,50]
opt.minimize(fun, guess, method='SLSQP', bounds=bnds, constraints = cond)

eq条件はゼロに等しい必要がありますが、ineq関数はゼロより大きい値に対して true を返すことに注意してください。

私達は手に入れました:

  status: 0
 success: True
    njev: 4
    nfev: 21
     fun: 97.884100000000345
       x: array([ 40.3,  57.7,   2. ])
 message: 'Optimization terminated successfully.'
     jac: array([ 1.80000019,  0.43300056,  0.18000031,  0.        ])
     nit: 4

等号を再確認します。

output = np.array([ 40.3,  57.7,   2. ])

np.sum(output) == 100
True
round(np.sum(p*output),8) >= 24
True
round(np.sum(e*output),8) >= 76
True

丸めは、倍精度小数点誤差によるものです。

np.sum(p*output)
23.999999999999996
于 2013-10-29T17:50:36.270 に答える