scipy.optimize.minimize 解决实际问题

本文介绍了一个使用Python Scipy库进行优化问题求解的例子。该例通过定义目标函数和约束条件,采用共轭梯度(CG)法进行最小化求解,并展示了最终的求解结果。

接上博客问题http://www.cnblogs.com/shizhenqiang/p/8274806.html

# coding=utf-8

from scipy import optimize
import numpy as np




def get():

    ar = [160, 130, 220, 170, 140, 130, 190, 150, 190, 200, 230]
    fun = lambda x:(x[0]*ar[0]+x[1]*ar[1]+x[2]*ar[2]+x[3]*ar[3]+x[4]*ar[4]+ x[5]*ar[5]+x[6]*ar[6]+ x[7]*ar[7]+ x[8]*ar[8]+x[9]*ar[9]+x[10]*ar[10])

    return fun


def con():
    # Equality constraint means that the constraint function result is to be zero whereas inequality means that it is to be non-negative
    x1min, x2min, x3min, x4min,x5min ,x6min,x7min,x8min,x9min,x10min,x11min =  [50, 60, 50, 30, 70, 10, 10, 80, 140,30,50]
    cons = ({'type': 'eq', 'fun': lambda x: x[0] + x[1] + x[2] + x[3] - x1min},\
            {'type': 'eq', 'fun': lambda x: x[4] + x[5] + x[6] + x[7] - x2min},\
            {'type': 'eq', 'fun': lambda x: x[8] + x[9] + x[10] - x3min},\
            {'type': 'ineq', 'fun': lambda x: x[0]+x[4]+x[8] - x4min},\
            {'type': 'ineq', 'fun': lambda x: x[1] + x[5] + x[9] - x5min},\
            {'type': 'ineq', 'fun': lambda x: x[2] + x[6] + x[10] - x6min}, \
            {'type': 'ineq', 'fun': lambda x: x[3] + x[7]  - x7min}, \
            {'type': 'ineq', 'fun': lambda x: -(x[0] + x[4] + x[8] - x8min)}, \
            {'type': 'ineq', 'fun': lambda x: -(x[1] + x[5] + x[9] - x9min)}, \
            {'type': 'ineq', 'fun': lambda x: -(x[2] + x[6] + x[10] - x10min)}, \
            {'type': 'ineq', 'fun': lambda x: -(x[3] + x[7] - x11min)}, \
            )
    return cons


if __name__ == "__main__":
    #args = (2, 3, 7, 8, 9, 10, 2, 2) #a, b, c, d, e, f,g,h

    #args = (0, 0,0, 0,0, 0, 0, 0) #a, b, c, d, e, f,g,h
    #args1 = (-1000, 1000, -1000, 1000)  #x1min, x1max, x2min, x2max
    x0 = np.asarray((0, 0,0,0,0,0,0,0,0,0,0))
    fun = get()
    cons = con()
    bnds = ((0, None), (0, None),(0, None), (0, None),(0, None), (0, None),(0, None), (0, None),(0, None), (0, None),(0, None))
    res = optimize.minimize(fun, x0, method='CG', bounds=bnds,constraints=cons)
    #print(res)
    print(res.fun)
    print(res.success)
    print(res.x)

 

转载于:https://www.cnblogs.com/shizhenqiang/p/8276004.html

### scipy.optimize.minimize 函数的使用方法 `scipy.optimize.minimize` 是 SciPy 庉库中用于求解无约束和约束最优化问题的核心函数之一。它支持多种算法来寻找目标函数的局部最优值。 #### 参数说明 以下是 `scipy.optimize.minimize` 的主要参数及其功能: - **fun**: 可调用的目标函数,表示要最小化的内容。 - **x0**: 初始猜测值数组,通常是一个一维 NumPy 数组。 - **method**: 优化算法的选择,例如 'Nelder-Mead', 'Powell', 'CG', 'BFGS' 等[^1]。还可以选择线性逼近约束优化方法 ‘COBYLA’ [^2] 或其他高级方法如 fmin_slsqp [^3]。 - **jac**: 目标函数的一阶导数(梯度)。如果未提供,则会通过数值微分计算。 - **hess**: 目标函数的二阶导数(Hessian矩阵),可选。 - **constraints**: 定义约束条件的字典列表,适用于带约束的优化问题。 - **bounds**: 定义决策变量上下界的序列。 - **options**: 控制优化行为的额外选项,比如最大迭代次数、精度等。 #### 示例代码 下面展示了一个简单的例子,演示如何利用该函数找到二次多项式的极小值点。 ```python from scipy.optimize import minimize def objective_function(x): return (x[0] - 1)**2 + (x[1] - 2.5)**2 initial_guess = [0, 0] result = minimize(objective_function, initial_guess, method='COBYLA') print(result.x) ``` 上述脚本定义了一个二维空间内的目标函数 `(x[0]-1)^2+(x[1]-2.5)^2`, 并尝试从原点 `[0, 0]` 开始搜索其最低点的位置。最终输出的结果应接近于向量 `[1., 2.5]`. #### 结果解释 执行完毕之后,返回的对象包含了丰富的信息,其中包括但不限于以下几个方面: - **x**: 所得的最佳参数集合。 - **success**: 布尔型标志位,指示是否成功完成运算。 - **message**: 描述终止原因的消息字符串。 - **fun**: 已知最佳输入对应的函数评估值。 这些字段可以帮助我们理解整个优化流程以及验证所得结论的有效性和合理性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值