使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)

函数格式
scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method=‘simplex‘, callback=None, options=None)
今天阅读数据建模第一章线性规划问题,问题描述如下:
通过介绍我们知道了线性规划,就是目标函数及约束条件均为线性函数。
通过画图我们可知,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取值了。其实有时候那个条件为>,>=的时候我们要写成<,<=的模式,一样对参数和结果取反就行了。
我这里在补充一个求三个解的实例:
我们的最优解为 14.57
时间: 2024-09-28 09:59:34

使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)的相关文章

数组用法----求最大值、最小值和平均数

public class d { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 //数组 求最大值.最小值.平均分 int a[]={70,80,90,75,84,88}; int n; int min =100; int max = 1; for(n=0;n<6;n++) { if(max<a[n]) { max=a[n];//循环比较max和a[n]的大小 }else if(m

分组求最大值,最小值 使用开窗函数经验总结

select distinct TT.prod_id, tt.creteTime, tt.inspection_time, tt.cnt from (select s.prod_id, min(s.datetime_created) over(partition by s.prod_id) as creteTime, max(s.inspection_time) over(partition by s.prod_id) as inspection_time, sum(s.complete_cou

POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53703   Accepted: 25237 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

python 版 mldivide matlab 反除(左除)《数学建模算法与程序》Python笔记

今天在阅读数学建模的时候看到了差分那章 其中有一个用matlab求线性的代码,这里我贴出来 这里我送上 Python代码 In [39]: import numpy as np ...: from scipy.optimize import nnls ...: x = np.array([[1,2,3,4,5],[1,1,1,1,1]]) ...: x = x.T ...: y = np.array([11,12,13,15,16]) ...: nnls(x,y) ...: Out[39]: (

java中数组求最大值,最小值,中和,平均

public class LxJavaCX { public static void main(String[] args) { // 定义一个整型数组,并赋初值 int[] nums = new int[] { 49,61, 23, 4, 74,160, 13, 148, 20 ,150}; int max = nums[0]; // 假定最大值为数组中的第一个元素 int min = nums[0]; // 假定最小值为数组中的第一个元素 double sum = 0;// 累加值 doub

C++数组求最大值及最小值最快方法(3[n/2]的时间效率)

#include <iostream> using namespace std; //最小值和最大值的求解,时间复杂度最多是3[n/2],依据算法导论第九章. void swap(int &a,int &b) { int temp = a; a = b; b = temp; } void Grial(int a[],int n) { int i = 0; if(a[i]>a[i+1]) { swap(a[i],a[i+1]); } for(int j = i+2;j<

zoj 3386 Trick or Treat 三分 求最大值的 最小值

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3963 题意:  给定 N 个不同的点, 求在x轴上的 一点,  使 这点到N个点的 距离 最大 的 最小值. f(x) =  max(i){ (xi - x) ^2 + yi ^2 } 求 x  使  min(f(x)) , f(x)为凹函数   ,  采用三分的形式 代码如下: const double EPS = 1e-10 ; const int Max_N

根据状态变化情况,求最大值和最小值

题目1:根据第一二列,计算出第三列.即:求每组KH_VALUE状态(1和0)变化的最小时间 --创建测试表 create table tmp as select to_date('2017-04-21 16:22:00','yyyy-mm-dd hh24:mi:ss') dt, 1 kv from dual union all select to_date('2017-04-21 16:23:00','yyyy-mm-dd hh24:mi:ss') dt, 1 kv from dual unio

JS数组求最大值和最小值

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-