• 线性规划


    http://www.cnblogs.com/zhilangtaosha/p/5745556.html

    函数格式
    scipy.optimize.linprog(cA_ub=Noneb_ub=NoneA_eq=Noneb_eq=Nonebounds=Nonemethod='simplex'callback=Noneoptions=None)
    A_ub表示不等式条件的系数矩阵
    A_eq表示等式条件矩阵
    b_ub和 b_eq是对应的条件值
    今天阅读数据建模第一章线性规划问题,问题描述如下:
    通过介绍我们知道了线性规划,就是目标函数及约束条件均为线性函数。
    通过画图我们可知,X1,X2的最优解为2,6,目标值为26。
    我们如何时候这个scipy的公式来计算这个值呢:
    >>> c = [-1, 4]
    >>> A = [[-3, 1], [1, 2]]
    >>> b = [6, 4]
    >>> x0_bounds = (None, None)
    >>> x1_bounds = (-3, None)
    >>> from scipy.optimize import linprog
    >>> res = linprog(c, A_ub=A, b_ub=b, bounds=(x0_bounds, x1_bounds),
    ...               options={"disp": True})
    >>> print(res)
    Optimization terminated successfully.
         Current function value: -11.428571
         Iterations: 2
    status: 0
    success: True
    fun: -11.428571428571429
    x: array([-1.14285714,  2.57142857])
    message: 'Optimization terminated successfully.'
    nit: 2

    上面是官方给出的案例,我们很难看出来这个怎么求解最大值,不过英语好的也可以把。
    言归正传,我们先结合官网是思路得出最小值的解。
    In [1]:c = np.array([4,3])
    In [1]:a = np.array([[2,1],[1,1]])
    In [1]:In [1]:b = np.array([10,8])
    In [1]:optimize.linprog(c,a,b,bounds=((0,None),(0,7)))
    Out[1]:
         fun: -0.0
     message: 'Optimization terminated successfully.'
         nit: 0
       slack: array([ 10.,   8.,   7.])
      status: 0
     success: True
           x: array([ 0.,  0.])
    按照正常的计算 我们得出了最小值为0,且x的两个值为 0 , 0。对于上面的的公式有必要说明的是,bounds是针对x的最大最小一次给一个值,从题目可知,x1的取值范围为大于0,最小值就为0,最大值没有约束,被其他的条件所约束就可以了 ,没有明确,所以是写的 (0,None),而相对x2来说,他最小值为0,最大值被C约束,为7。所以范围为(0,7),当有三个求解的时候,依次增加,不可省略。
    接下来我们说这个最大值怎么求,其实只要对C取反我们就可以求除最大值的负数,对结果在取反回来就可以了
    In [1]:optimize.linprog(-c,a,b,bounds=((0,None),(0,7)))
    Out[1]:
    fun: -26.0
    message: 'Optimization terminated successfully.'
    nit: 2
    slack: array([ 0., 0., 1.])
    status: 0
    success: True
    x: array([ 2., 6.])

    是不是很简单,得到的-26取反回来就是我们的最大值求解了,(2,6)就是我们的X1,X2取值了。其实有时候那个条件为>,>=的时候我们要写成<,<=的模式,一样对参数和结果取反就行了。
    我这里在补充一个求三个解的实例:
    ==========================


    import numpy as np
    import random
    import os
    import math
    import operator
    # import scipy.optimize.linprog
    from scipy.optimize import minimize
    import matplotlib.pyplot as mpl
    from scipy import optimize

    规划求解每个媒体的投放数量:

    条件:

    1、输入库存,每个媒体买入价格,卖出价格,每千人(cpm)价格,cpm个数,输出最优的每个媒体投放个数

    2、每个媒体数量小于对应的库存,总费用大于0.8倍的总预算,小于总预算

    3、追求利润最大化

    def lipro(buy,sell,kucun,cpm,cpm_price):
        
        per_profit=[(sell[i]-buy[i]) for i in range(len(sell))] #卖出每个媒体的利润
        #print per_profit
        buget=cpm*cpm_price  #预算的最大值
        
        c=np.array(per_profit) #目标函数
        
        bound_1=[(0,i) for i in kucun]    #卖出各媒体数量范围
        bound_2=tuple(bound_1)
        
        a=np.array([[-sell[i] for i in range(len(sell))],[sell[i] for i in range(len(sell))]]) #设定预算范围
        b=np.array([-0.8*buget,buget])
        
        a_eq=np.array([[1 for x in range(len(sell))]])     #限定卖出媒体总数量条件
        b_eqs=cpm*1000
        
        res=optimize.linprog(-c,a,b,A_eq=a_eq,b_eq=b_eqs,bounds=bound_2)   #线性规划
        
        max_profit=-res.fun
        cnt=res.x
        income=sum([sell[i]*cnt[i] for i in range(len(sell))])
        cost=sum([buy[i]*cnt[i] for i in range(len(buy))])
        #return res
        return cnt,max_profit,income,cost
    
    
    print lipro([1,2,3,4,5],[2,4,5,5,6],[3000,2000,1000,500,300],5,4000)
  • 相关阅读:
    数据规范化(normalization)
    《穷爸爸富爸爸》笔记
    期望,方差,协方差,相关系数,协方差矩阵,相关系数矩阵,以及numpy实现
    numpy array和mat的乘法
    matlab多图排列
    POJ 3463
    POJ 3463
    Poj2449 第k短路
    Poj2449 第k短路
    POJ 3013
  • 原文地址:https://www.cnblogs.com/zhangbojiangfeng/p/6110774.html
Copyright © 2020-2023  润新知