1、最优化问题建模

最优化问题的三要素是决策变量、目标函数和约束条件。

(1)分析影响结果的因素是什么,确定决策变量

(2)决策变量与优化目标的关系是什么,确定目标函数

(3)决策变量所受的限制条件是什么,确定约束条件

最优化问题的建模,通常按照以下步骤进行:

(1)问题定义,确定决策变量、目标函数和约束条件;

(2)模型构建,由问题描述建立数学方程,并转化为标准形式的数学模型;

(3)模型求解,用标准模型的优化算法对模型求解,得到优化结果;

(4)模型检验,统计检验和灵敏度分析。

欢迎关注 Youcans 原创系列,每周更新数模笔记

Python数模笔记-PuLP库

Python数模笔记-StatsModels统计回归

Python数模笔记-Sklearn

Python数模笔记-NetworkX

Python数模笔记-模拟退火算法


2、线性规划

线性规划(Linear programming),是研究线性约束条件下线性目标函数的极值问题的优化方法,常用于解决利用现有的资源得到最优决策的问题。

线性规划模型的一般形式如下:

min  fx = c1*x1 + ...+ cn*xn

  s.t. a11*x1+...+a1n*Xn ≤ b1

    ...

    am1*x1+...+amn*Xn ≤ bm

    x1≥0,...,xn≥0

其中:fx 是目标函数,求最小值;x1,...xn 是决策变量;aij, bi 是不等式约束的参数。


3、Scipy 求解线性规划

Python 的 SciPy 库带有用于解决线性编程问题的 linprog 函数。

  linporg 函数对于线性规划模型的描述为:

min fx = C'*X fx 是目标函数

  s.t. A_ub*X <= B_ub 不等式约束

    A_eq*X = B_eq 等式约束

    lb <= X <= ub 取值范围

其中:

fx 是目标函数,求最小值;

X 是决策变量,向量;

C 是目标函数的参数向量;

A_ub 是不等式约束的参数矩阵,B_ub 是不等式约束的参数向量;

A_eq 是等式约束的参数矩阵,B_eq 是等式约束的参数向量;

lb,ub 是参数向量,(lb,ub) 是 X 的取值范围。

注意:

  (1)问题表示为:求 fx 的最小值,如果问题要求 fx 的最大值则要通过 fx‘= -fx 将问题转化为求 fx' 的最小值;

  (2)不等式约束条件表示为:小于等于,如果约束条件为大于等于则要通过不等式两侧乘以 -1 将约束条件转化为小于等于的形式。

linporg 函数求解线性规划问题的输出参数为:

con: 等式约束的残差(名义上为 0),B_eq - A_eqX

fun: 目标函数的当前值(最小值),C'X

message: 算法状态描述

nit: 当前迭代次数

slack: 不等式约束的松弛值,B_ub - A_ub
X

status: 算法退出时的状态,0:优化完成,1:达到最大迭代次数,2:不可行,3:不收敛,4:数值困难

success: 当算法成功完成时为 True

x: 当前解,向量


4 实例

4.1 问题模型:

    max     fx = 2*x1 + 3*x2 - 5*x3
s.t. x1 + x2 + x3 = 7
2*x1 - 5*x2 + x3 >= 10
x1 + 3*x2 + x3 <= 12
x1, x2, x3 >=0

4.2 模型转换:

首先要将求解问题的模型转化为 Linprog 的标准形式:

(1)求最大值问题要转换为求最小值问题:C = [-2, 3, 5]

(2)当约束条件为 大于等于 时要加负号:A_ub = [[-2, 5, -1], [1, 3, 1]]

(3)由 x1,x2,x3>=0 和 x1+x2+x3=7 可知:0 <= x1,x2,x3 <= 7

4.3 python 程序:

import numpy as np  # 导入 numpy
from scipy.optimize import linprog # 导入 scipy c = np.array([-2, -3, 5])
A_ub = np.array([[-2, 5, -1], [1, 3, 1]]) # 不等式约束参数矩阵
B_ub = np.array([-10, 12]) # 不等式约束参数向量
A_eq = np.array([[1, 1, 1]]) # 等式约束参数矩阵
B_eq = np.array([7]) # 等式约束参数向量
x1 = (0, 7) # x1 的取值范围,lb1 < x1 < ub1
x2 = (0, 7) # x2 的取值范围,lb2 < x2 < ub2
x3 = (0, 7) # x3 的取值范围,lb3 < x3 < ub3
res = linprog(c, A_ub, B_ub, A_eq, B_eq, bounds=(x1, x2, x3))
print(res)
# === 关注 Youcans,分享更多原创系列 https://www.cnblogs.com/youcans/ ===

4.4 运行结果:

     con: array([1.19830306e-08])
fun: -14.57142854231215
message: 'Optimization terminated successfully.'
nit: 5
slack: array([-3.70231543e-08, 3.85714287e+00])
status: 0
success: True
x: array([6.42857141e+00, 5.71428573e-01, 9.82192085e-10])

版权说明:

YouCans 原创作品,转载必须注明原文链接

Copyright 2021 YouCans, XUPT

Crated:2021-04-28

欢迎关注 Youcans 原创系列,每周更新数模笔记

Python数模笔记-PuLP库

Python数模笔记-StatsModels统计回归

Python数模笔记-Sklearn

Python数模笔记-NetworkX

Python数模笔记-模拟退火算法

Python数模笔记-Scipy库(1)线性规划问题的更多相关文章

  1. Python数模笔记-PuLP库(1)线性规划入门

    1.什么是线性规划 线性规划(Linear programming),在线性等式或不等式约束条件下求解线性目标函数的极值问题,常用于解决资源分配.生产调度和混合问题.例如: max fx = 2*x1 ...

  2. Python数模笔记-PuLP库(2)线性规划进阶

    1.基于字典的创建规划问题 上篇中介绍了使用 LpVariable 对逐一定义每个决策变量,设定名称.类型和上下界,类似地对约束条件也需要逐一设置模型参数.在大规模的规划问题中,这样逐个定义变量和设置 ...

  3. Python数模笔记-StatsModels 统计回归(4)可视化

    1.如何认识可视化? 图形总是比数据更加醒目.直观.解决统计回归问题,无论在分析问题的过程中,还是在结果的呈现和发表时,都需要可视化工具的帮助和支持. 需要指出的是,虽然不同绘图工具包的功能.效果会有 ...

  4. Python数模笔记-StatsModels 统计回归(1)简介

    1.关于 StatsModels statsmodels(http://www.statsmodels.org)是一个Python库,用于拟合多种统计模型,执行统计测试以及数据探索和可视化. 2.文档 ...

  5. Python数模笔记-NetworkX(3)条件最短路径

    1.带有条件约束的最短路径问题 最短路径问题是图论中求两个顶点之间的最短路径问题,通常是求最短加权路径. 条件最短路径,指带有约束条件.限制条件的最短路径.例如,顶点约束,包括必经点或禁止点的限制:边 ...

  6. Python数模笔记-Sklearn(1) 介绍

    1.SKlearn 是什么 Sklearn(全称 SciKit-Learn),是基于 Python 语言的机器学习工具包. Sklearn 主要用Python编写,建立在 Numpy.Scipy.Pa ...

  7. Python数模笔记-(1)NetworkX 图的操作

    1.NetworkX 图论与网络工具包 NetworkX 是基于 Python 语言的图论与复杂网络工具包,用于创建.操作和研究复杂网络的结构.动力学和功能. NetworkX 可以以标准和非标准的数 ...

  8. Python数模笔记-Sklearn(3)主成分分析

    主成分分析(Principal Components Analysis,PCA)是一种数据降维技术,通过正交变换将一组相关性高的变量转换为较少的彼此独立.互不相关的变量,从而减少数据的维数. 1.数据 ...

  9. Python数模笔记-Sklearn(4)线性回归

    1.什么是线性回归? 回归分析(Regression analysis)是一种统计分析方法,研究自变量和因变量之间的定量关系.回归分析不仅包括建立数学模型并估计模型参数,检验数学模型的可信度,也包括利 ...

随机推荐

  1. 铁人三项(第五赛区)_2018_seven

    铁人三项(第五赛区)_2018_seven 先来看看保护 保护全开,IDA分析 首先申请了mmap两个随机地址的空间,一个为rwx,一个为rw 读入的都shellcode长度小于等于7,且这7个字符不 ...

  2. java连接数据库(jdbc)的标准规范

    java连接数据库的标准规范 JDBC全称:java database connectivity ,是sun公司提供的Java连接数据库的标准规范. localhost和127.0.0.1 都是表示当 ...

  3. adb 简介与常用命令

    1. abd 简介 2. adb 常用命令 1. abd 简介 adb 的全称为 Android Debug Bridge,就是起到调试桥的作用. 借助 adb 工具,我们可以管理设备或手机模拟器的状 ...

  4. PHP 导出 Excel 兼容 CSV XlS格式

    class ExcelRead { /** * 获取Excel文件内容 * @param $file * @return mixed * @throws PHPExcel_Reader_Excepti ...

  5. LA2965侏罗纪(异或和为0的最大数字个数)

    题意:       给你n个字符串,让你在里面找到一个字符串集合使得这些字符串中所有的字母出现的次数和为偶数,输出集合的最大个数,和ASCII最小的解. 思路:       考虑到每个字符串中所有的字 ...

  6. 后渗透阶段之基于MSF的内网主机探测

    当我们通过代理可以进入某内网,需要对内网主机的服务进行探测.我们就可以使用MSF里面的内网主机探测模块了. 在这之前,先修改 /etc/proxychains.conf ,加入我们的代理. 然后 pr ...

  7. Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)

    SHADOW SSDT HOOK HOOK 和 UNHOOK SHADOW SSDT 跟之前的 HOOK/UNHOOK SSDT 类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还 ...

  8. windows核心编程-第一章 对程序错误的处理

    第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...

  9. sql常识-RIGHT JOIN

    SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行. RIGHT JOIN ...

  10. linux集群压测部署方案

    我们今天主要分享的内容从三方面讲解. 集群压力机部署 shell脚本简介 shell脚本搞定压力机部署 集群压力机部署   linux.png 分布式压测背景介绍 在企业项目实战时,如果被压的服务器处 ...