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. kubectl create / replace 与kubectl apply 的区别

    kubectl create / replace 以ngnix 的 nginx.yaml为例: apiVersion: apps/v1 kind: Deployment metadata: name: ...

  2. 曾侯乙编钟引发的遐想之Java设计模式:状态模式

    目录 示例 简单例子 改进代码 状态模式 定义 意图 主要解决问题 何时使用 优缺点 曾侯乙编钟 状态模式-命令模式-策略模式 示例 一个类对外提供了多个行为,同时该类对象有多种状态,不同状态下对外的 ...

  3. Dubbo学习笔记(一) 基础知识HelloWorld

    Dubbo是由阿里巴巴研发出的一款基于Java实现的RPC框架,现由Apache进行维护管理,笔记中使用zookeeper作为注册中心,dubbo+zookeeper环境安装教程:https://ww ...

  4. ArrayList扩容机制以及底层实现

    简介 来源:博客园    作者:吾王彦 博客链接:https://www.cnblogs.com/qinjunlin/p/13724987.html ArrayList动态数组,是 java 中比较常 ...

  5. 一篇博文让你学会HTML5

    HTML 什么是HTML HTML(HyperText Markup Language,超文本标记语言)是用来描述网页的一种语言,它不是一种编程语言,而是一种标记语言. 认识HTML HTML5是构建 ...

  6. 06- Linux Ubuntu下sublime下载与使用与安装包

    我有Linux下全套的安装包,如sublime,pycharm等.不用再苦逼的下软件了.需要的加我微信:chimu sublime text 3文本编辑器 启动命令:Linux命令行输入subl 或者 ...

  7. git平时用到的仓库

    github茫茫仓库 若水三千,取一瓢饮 doocs/technical-books doocs/leetcode lepture/editor pandao/editor.md 未完..待续!!积累 ...

  8. 【工具类】获取请求头中User-Agent工具类

    public class AgentUserKit { private static String pattern = "^Mozilla/\\d\\.\\d\\s+\\(+.+?\\)&q ...

  9. Python小程序 -- 人民币小写转大写辅助工具

    大家应该都知道,银行打印账单有时候会跟上人民币的阿拉伯数字以及人民币汉字大写写法,转换的过程中有一定的逻辑难度,较为麻烦,所以笔者心血来潮,花了点时间简单实现了一下这一转换过程,以供初学者参考. 输入 ...

  10. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round C

    题意:       这个是The 2014 ACM-ICPC Asia Mudanjiang Regional First Round 的C题,这个题目当时自己想的很复杂,想的是优先队列广搜,然后再在 ...