线性规划

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)
原文地址:https://www.cnblogs.com/zhangbojiangfeng/p/6110774.html