1 线性规划概念
定义:在线性等式和不等式约束下,最小化线性目标函数。
2 输入格式
scipy.optimize.linprog(c,a_ub=none,b_ub=none,a_eq=none,b_eq=none,bounds=none,method=‘interior-point’,callback=none,options=none,x0=none)
3 参数设置
‘’‘
c:线性目标函数的系数; 数据类型:一维数组
a_ub(可选参数):不等式约束矩阵, a_{ub} 的每一行指定 x 上的线性不等式约束的系数;数据类型:二维数组
b_ub(可选参数):不等式约束向量,每个元素代表 a_{ub}x 的上限;数据类型:一维数组
a_eq(可选参数):等式约束矩阵, a_{eq}的每一行指定 x 上的线性等式约束的系数;数据类型:二维数组
b_eq(可选参数):等式约束向量,a_{eq}x 的每个元素必须等于 b_{eq} 的对应元素;数据类型:一维数组
bounds(可选参数):定义决策变量 x 的最小值和最大值;数据类型:(min, max)序列对
none:使用none表示没有界限,默认情况下,界限为(0,none)(所有决策变量均为非负数)
如果提供一个元组(min, max),则最小值和最大值将用作所有决策变量的界限。
method(可选参数):算法,{‘interior-point’, ‘revised simplex’, ‘simplex’}以上三种算法可选;数据类型:输入如上三种字符串
callback(可选参数):调用回调函数,我的理解是等待被调用的参数 ,如果提供了回调函数,则算法的每次迭代将至少调用一次。回调函数必须接受单个 scipy.optimize.optimizeresult由以下字段组成:
x:当前解向量; 数据类型:一维数组
fun:目标函数的当前值(c^tx); 数据类型:浮点数
success:当算法成功完成时为 true;数据类型:布尔值
slack:不等式约束的松弛值(名义上为正值) b_{ub} ? a_{ub}x; 数据类型:一维数组
con:等式约束的残差(名义上为零) b_{eq} ? a_{eq}x;数据类型:一维数组
phase:正在执行算法的阶段; 数据类型:整数
status:表示算法退出状态的整数; 数据类型:整数
0 : 优化按名义进行
1 : 达到了迭代限制
2 : 问题似乎不可行
3 : 问题似乎是不收敛
4 : 遇到数值困难
nit:当前的迭代次数; 数据类型:整数
message:算法状态的字符串描述符; 数据类型:字符串
options(可选参数)——求解器选项字典,所有方法都接受以下选项:
数据类型:字典
maxiter:整数,要执行的最大迭代次数
disp:布尔值,设置为true以打印收敛消息,默认值:false
autoscale:布尔值,设置为true以自动执行平衡,如果约束中的数值分开几个数量级,请考虑使用此选项,默认值:false
presolve:布尔值,设置为false可禁用自动预解析,默认值:true
rr:布尔值,设置为false可禁用自动移除冗余,默认值:true
x0(可选参数):猜测决策变量的值,将通过优化算法进行优化。当前仅由’ revised simplex’ 方法使用此参数,并且仅当 x0 表示基本可行的解决方案时才可以使用此参数。 数据类型:一维数组
’‘’
4 输出格式
‘’‘
x:在满足约束的情况下将目标函数最小化的决策变量的值;数据类型:一维数组
fun:目标函数的最佳值(c^tx);数据类型:浮点数
slack:不等式约束的松弛值(名义上为正值) b_{ub}-a_{ub}x;数据类型:一维数组
con:等式约束的残差(名义上为零)b_{eq}-a_{eq}x;数据类型:一维数组
success:当算法成功找到最佳解决方案时为 true;数据类型:布尔值
status:表示算法退出状态的整数;数据类型:整数
0 : 优化成功终止
1 : 达到了迭代限制
2 : 问题似乎不可行
3 : 问题似乎是不收敛
4 : 遇到数值困难
nit:在所有阶段中执行的迭代总数;数据类型:整数
message:算法退出状态的字符串描述符;数据类型:字符串 ’‘’
5 例子
import scipy
from scipy import optimize
import numpy
c = numpy.array([2,3]) #最值等式未知数系数矩阵
a_ub = numpy.array([[-1,1],[2,-2]]) #《=不等式左侧未知数系数矩阵
b_ub = numpy.array([1,1]) #《=不等式右侧常数矩阵
#a_eq = numpy.array() 等式左侧未知数系数矩阵
#b_eq = numpy.array() 等式右侧常数矩阵
x = (none,1) #未知数取值范围
y = (none,none) #未知数取值范围
res = scipy.optimize.linprog(c,a_ub,b_ub,bounds = (x,y)) #默认求解最小值,求解最大值使用-c并取结果相反数
print(res)
#结果:无解情况
con: array([], dtype=float64)
fun: -8782091626.64441
message: ‘the algorithm terminated successfully and determined that the problem is unbounded.’#算法成功终止,确定问题是无界的
nit: 3
slack: array([0.89897776, 1.20204449])
status: 3
success: false
x: array([-1.75641833e+09, -1.75641833e+09])
佐佑思维
连接交流接触器控制线的方法
range()函数的用法是什么
润和软件与华润(武汉)智能科技签署合作协议 共创智慧医疗新生态
开发的EMARMOUR系列运算放大器在车载和工业设备市场获得了高度好评
基于运放的幅移键控发生器(ASK)设计
scipy.optimize.linprog函数参数最全详解
如何使用Verilog硬件描述语言描述时序逻辑电路?
电容如何识别电容管上的符号,电解电容之王为什么是钽电容而不是铝电容?
微软Surface Pro深度拆解:x86架构更胜一筹
汽车半导体:增长最稳定的产品
华米手表新品曝光 可以直接控制小爱同学
iphone8什么时候上市?最新消息:iphone8/iphone7s如期发布,iphone 8内存至少64G,用数据告诉你为什么
RSA3000/E系列频谱分析仪特点
爱立信完成了对美国无线解决方案专家Cradlepoint的收购
DSP系统中噪声和电磁干扰EMI的影响以及控制方法
土壤墒情速测仪的检测原理是怎样的
我国物联网市场的发展瓶颈和深层次问题依然突出
深圳正在进一步加速产业发展 计划2023年整体销售收入突破2000亿元
嵌入式操作系统它有什么特点
创新发展,南京矽景助力无人化生产进程