前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python数学建模系列(一):规划问题之线性规划

Python数学建模系列(一):规划问题之线性规划

作者头像
海轰Pro
发布于 2021-08-31 09:04:51
发布于 2021-08-31 09:04:51
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

@

目录

前言

Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,有幸拿过一些国奖、省奖...已保研。目前正在学习C++/Linux/Python 学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语! 初学Python 小白阶段 文章仅作为自己的学习笔记 用于知识体系建立以及复习 题不在多 学一题 懂一题 知其然 知其所以然! 本文仅从Pyhton如何解决建模问题出发 未对建模思路等进行深一步探索

线性规划

​ 线性规划求解需要清晰两部分,目标函数(max, min) 和 约束条件 ,求解前应转化为标准形式:

样例1:求解下列线性规划问题

\[max z = 2x_1 + 3x_2 - 5x_3 \]

\[ s.t. = \begin{cases} x_1 + x_2 + x_3 = 7 \\ 2x_1 - 5x_2 + x_3 >= 10\\ x_1 + 3x_2 + x_3 <= 12\\ x_1,x_2,x_3 >= 0 \end{cases} \]

scipy库求解

涉及知识点

  • optimize.linprog

Demo代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from scipy import optimize
import numpy as np
c = np.array([2,3,-5])
A = np.array([[-2,5,-1],[1,3,1]])
B = np.array([-10,12])
Aeq = np.array([[1,1,1]])
Beq = np.array([7])
res = optimize.linprog(-c,A,B,Aeq,Beq)
res

运行结果

注:x结果为array数组,从左到右依次表示x1 x2 x3....

对很大/小的数不使用科学计数法 np.set_printoptions(suppress=True)

Demo代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from scipy import optimize
import numpy as np
np.set_printoptions(suppress=True)
c = np.array([2,3,-5])
A = np.array([[-2,5,-1],[1,3,1]])
B = np.array([-10,12])
Aeq = np.array([[1,1,1]])
Beq = np.array([7])
res = optimize.linprog(-c,A,B,Aeq,Beq)
res

运行结果

样例2:求解下列线性规划问题

pulp库求解

设计知识点

  • LpProblem(name='NoName', sense=LpMinimize)
  • solve(solver=None, **kwargs)
  • LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)

Demo代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pulp as pp

# 目标函数的系数
z = [2, 3, 1]
a = [[1, 4, 2], [3, 2, 0]]
b = [8,6]
aeq = [[1,2,4]]
beq = [101]

# 确定最大最小化问题,当前确定的是最大化问题
m = pp.LpProblem(sense=pp.LpMaximize)

# 定义三个变量放到列表中
x = [pp.LpVariable(f'x{i}', lowBound=0) for i in [1, 2, 3]]

# 定义目标函数,并将目标函数加入求解的问题中
m += pp.lpDot(z, x) # lpDot 用于计算点积

# 设置比较条件
for i in range(len(a)):
    m += (pp.lpDot(a[i], x) >= b[i])

# 设置相等条件
for i in range(len(aeq)):
    m += (pp.lpDot(aeq[i], x) == beq[i])

# 求解
m.solve()
# 输出结果
print(f'优化结果:{pp.value(m.objective)}')
print(f'参数取值:{[pp.value(var) for var in x]}')

运行结果:

注:

  • 最优结果为202
  • x1 = 101 x2=0 x3=0

样例3.运输问题

Demo代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pulp
import numpy as np
from pprint import pprint

def transportation_problem(costs, x_max, y_max):
    row = len(costs)
    col = len(costs[0])
    prob = pulp.LpProblem('Transportation Proble',sense=pulp.LpMaximize)
    var = [[pulp.LpVariable(f'x{i}{j}',lowBound=0,cat=pulp.LpInteger) for j in range(col)] for i in range(row)]
    # 转为一维
    flatten = lambda x:[y for l in x for y in flatten(l)] if type(x) is list else [x]
    prob += pulp.lpDot(flatten(var),costs.flatten())
    for i in range(row):
        prob += (pulp.lpSum(var[i]) <= x_max[i])
    for j in range(col):
        prob += (pulp.lpSum([var[i][j] for i in range(row)]) <= y_max[j])
    prob.solve()
    return {'objective':pulp.value(prob.objective),'var':[[pulp.value(var[i][j]) for j in range(col)] for i in range(row)]}

costs = np.array([[500,550,630,1000,800,700],
                [800,700,600,950,900,930],
                [1000,960,840,650,600,700],
                [1200,1040,980,860,880,780]])
max_plant = [76,88,96,40]
max_cultivation = [42,56,44,39,60,59]
res = transportation_problem(costs, max_plant, max_cultivation)
print(f'最大值为{res["objective"]}')
print("各个变量的取值为:")
pprint(res['var'])

运行结果:

说明

运行环境:Vs Code

结语

学习来源:B站及其课堂PPT,对其中代码进行了复现

链接:https://www.bilibili.com/video/BV12h411d7Dm? from=search&seid=5685064698782810720

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
react源码解析19.手写迷你版react
react源码解析19.手写迷你版react 视频课程(高效学习):进入课程 课程目录: 1.开篇介绍和面试题 2.react的设计理念 3.react源码架构 4.源码目录结构和调试 5.jsx&核心api 6.legacy和concurrent模式入口函数 7.Fiber架构 8.render阶段 9.diff算法 10.commit阶段 11.生命周期 12.状态更新流程 13.hooks源码 14.手写hooks 15.scheduler&Lane 16.concurrent模式 17.contex
全栈潇晨
2021/06/24
8120
【React进阶-3】从零实现一个React(下)
这篇文章给大家介绍一下我们如何自己去实现一个类似于React这样的框架,当然,我们并不会去实现React里面所有的内容,只是去将React基础性的功能实现一遍,让大家对React的认识更加的深入。因为篇幅有限,所以我将这篇文章拆分成了上、下两部分,此文是下篇。
X北辰北
2022/02/21
7590
【React进阶-3】从零实现一个React(下)
手写简易版 React 来彻底搞懂 fiber 架构
React 16 之前和之后最大的区别就是 16 引入了 fiber,又基于 fiber 实现了 hooks。整天都提 fiber,那 fiber 到底是啥?它和 vdom 是什么关系?
神说要有光zxg
2022/03/03
8510
手写简易版 React 来彻底搞懂 fiber 架构
实现一个小而全的React
我们需要一个可以转换 jsx 的 vanilla js 环境,使用 vite 可以很方便设置好我们的开发环境
玖柒的小窝
2021/10/06
5440
实现一个小而全的React
手写系列-实现一个铂金段位的React
为什么是铂金呢,因为和王者还有很远的距离。本文仅实现简单版本的 React,参考 React 16.8 的基本功能,包括虚拟 DOM、Fiber、Diff 算法、函数式组件、hooks 等。
winty
2021/07/27
9060
从零开始的 React 再造之旅
https://segmentfault.com/a/1190000021689852
ConardLi
2020/02/24
8850
从零开始的 React 再造之旅
怎样徒手写一个React
下面先实现一个最简单的页面渲染,快速了解 JSX、React、DOM 元素的联系。
helloworld1024
2022/10/13
6700
从实现一个React到深度理解React框架核心原理
这篇文章循序渐进地介绍实现以下几个概念,遵循本篇文章基本就能搞懂为啥需要fiber,为啥需要commit和phases、reconciliation阶段等原理。本篇文章又不完全和原文一致,这里会加入我自己的一些思考,比如经过performUnitOfWork处理后fiber tree和element tree的联系等。
夏天的味道123
2022/10/17
6160
React核心技术浅析
这段代码的意思是通过 ReactDOM.render() 方法将 h1 包裹的JSX元素渲染到id为“root”的HTML元素上. 除了在JS中早已熟知的 document.getElementById() 方法外, 这段代码中还包含两个知识点:
夏天的味道123
2022/09/26
1.7K0
手写React的Fiber架构,深入理解其原理
熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化的部分,而不重新渲染整个页面,大大提高渲染效率。到了16.x,React更是使用了一个被称为Fiber的架构,提升了用户体验,同时还引入了hooks等特性。那隐藏在React背后的原理是怎样的呢,Fiber和hooks又是怎么实现的呢?本文会从jsx入手,手写一个简易版的React,从而深入理解React的原理。
蒋鹏飞
2020/10/15
1.7K1
手写React的Fiber架构,深入理解其原理
react fiber 到底有多细
Fiber 是对 React 核心算法的重构,facebook 团队使用两年多的时间去重构 React 的核心算法,在 React16 以上的版本中引入了 Fiber 架构,极大的提高了大型react项目的性能,也激发了我对其实现的好奇。在研究源码的过程中,能发现很多比较细的点,有任务单元拆分的细,有任务调度、双缓冲、节点复用等优化的细,都非常值得我们学习,接下来就带大家看看react fiber 到底有多细。
有赞coder
2021/05/14
8030
react fiber 到底有多细
【React进阶-2】从零实现一个React(上)
这篇文章给大家介绍一下我们如何自己去实现一个类似于React这样的框架,当然,我们并不会去实现React里面所有的内容,只是去将React基础性的功能实现一遍,让大家对React的认识更加的深入。因为篇幅有限,所以我将这篇文章拆分成了上、下两部分,此文是上篇。
X北辰北
2022/02/21
1.3K0
【React进阶-2】从零实现一个React(上)
这可能是最通俗的 React Fiber 打开方式
作者:荒山 https://juejin.im/post/5dadc6045188255a270a0f85
Nealyang
2019/10/24
2.3K1
这可能是最通俗的 React Fiber 打开方式
读懂React原理之调和与Fiber
Fiber 架构是React16中引入的新概念,目的就是解决大型 React 应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是React的虚拟DOM,更新Fiber的过程叫做调和,每一个fiber都可以作为一个执行单元来处理,所以每一个 fiber 可以根据自身的过期时间expirationTime,来判断是否还有空间时间执行更新,如果没有时间更新,就要把主动权交给浏览器去渲染,做一些动画,重排( reflow ),重绘 repaints 之类的事情,这样就能给用户感觉不是很卡。
xiaofeng123aa
2022/10/03
4650
这可能是最通俗的 React Fiber 打开方式
写一篇关于 React Fiber 的文章, 这个 Flag 立了很久,这也是今年的目标之一。最近的在掘金的文章获得很多关注和鼓励,给了我很多动力,所以下定决心好好把它写出来。我会以最通俗的方式将它讲透, 因此这算是一篇科普式的文章。不管你是使用React、还是Vue,这里面的思想值得学习学习!
前端劝退师
2019/12/02
6220
由浅入深React的Fiber架构
JavaScript是单线程运行的。在浏览器环境中,他需要负责页面的JavaScript解析和执行、绘制、事件处理、静态资源加载和处理。而且只能一个任务一个任务的执行,如果其中某个任务耗时很长,那后面的任务则执行不了,在浏览器端则会呈现卡死的状态。
Careteen
2022/02/14
1.8K0
由浅入深React的Fiber架构
React源码之深度理解diff算法
上一章中 react 的 render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 中做的事情就是 react 知名的 diff 过程,本章会对 diff 算法进行讲解。
goClient1992
2022/12/09
4310
React.createElement和ReactDom.render方法简单思路
实际上,JSX 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖,因此,使用 JSX 可以完成的任何事情都可以通过纯 JavaScript 完成。 例如,用 JSX 编写的代码: class Hello extends React.Component { render() { return <div>Hello {this.props.toWhat}</div>; } } ReactDOM.render( <H
刘嘿哈
2022/10/25
3080
【Fiber】: [转]React 为什么使用链表遍历 Fiber 树
To educate myself and the community, I spend a lot of time reverse-engineering web technologies and writing about my findings. In the last year, I’ve focused mostly on Angular sources which resulted in the biggest Angular publication on the web — Angular-In-Depth. Now the time has come to dive deep into React. Change detection has become the main area of my expertise in Angular, and with some patience and a lot of debugging, I hope to soon achieve that level in React.
WEBJ2EE
2021/02/26
7470
【Fiber】: [转]React 为什么使用链表遍历 Fiber 树
【Fiber】:[译]深入解析React的新协调算法
深入研究 React 的新架构 Fiber,了解新协调算法的两个主要阶段。我们将详细了解 React 如何更新组件状态(state)、属性(props)以及如何处理子元素(children)。
WEBJ2EE
2021/02/26
6700
【Fiber】:[译]深入解析React的新协调算法
相关推荐
react源码解析19.手写迷你版react
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验