线性规划模型的Python解法_python如何计算数学规划模型-程序员宅基地

技术标签: # 数据分析与爬虫  线性规划  python  数学建模  开发语言  

1.线性规划

线性规划(Linear programming,简称LP),是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,是辅助人们进行科学管理的一种数学方法,是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。 线性规划是运筹学的一个重要分支,广泛应用于军事作战、经济分析、经营管理和工程技术等方面。

线性规划问题的目标函数及约束条件均为线性函数;约束条件记为 s.t.(即 subject to)。目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以 是小于号也可以是大于号。

一般线性规划问题的(数学)标准型为 :

在这里插入图片描述

数学建模中常见的线性规划类赛题:

题目中提到“怎样安排/分配”“尽量多(少)”“最多(少)”“利润最大”“最合理”等词,例如:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2.Python的解决方案

线性规划求解

例如:某数学题:

在这里插入图片描述

案例代码:

'''
线性规划算法
'''

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]}')

程序会输出最终的优化结果:

Welcome to the CBC MILP Solver 
Version: 2.10.3 
Build Date: Dec 15 2019 

command line - D:\CodeBox\enpython\lib\site-packages\pulp\apis\..\solverdir\cbc\win\64\cbc.exe D:\ϵͳ��Դ\ϵͳ����\b98f86280e894d38805560900a38bbfe-pulp.mps max timeMode elapsed branch printingOptions all solution D:\ϵͳ��Դ\ϵͳ����\b98f86280e894d38805560900a38bbfe-pulp.sol (default strategy 1)
At line 2 NAME          MODEL
At line 3 ROWS
At line 8 COLUMNS
At line 20 RHS
At line 24 BOUNDS
At line 25 ENDATA
Problem MODEL has 3 rows, 3 columns and 8 elements
Coin0008I MODEL read with 0 errors
Option for timeMode changed from cpu to elapsed
Presolve 3 (0) rows, 3 (0) columns and 8 (0) elements
0  Obj -0 Primal inf 29.25 (3) Dual inf 5.9999997 (3)
0  Obj -0 Primal inf 29.25 (3) Dual inf 5.1666667e+10 (3)
2  Obj 202
Optimal - objective value 202
Optimal objective 202 - 2 iterations time 0.002
Option for printingOptions changed from normal to all
Total time (CPU seconds):       0.01   (Wallclock seconds):       0.01

优化结果:202.0
参数取值:[101.0, 0.0, 0.0]

种菜问题

某数学题目:

在这里插入图片描述

案例代码:

'''
线性规划算法,种菜问题
'''

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'])

结果数据:

最大值为284230.0
各个变量的取值为:
[[0.0, 0.0, 6.0, 39.0, 31.0, 0.0],
 [0.0, 0.0, 0.0, 0.0, 29.0, 59.0],
 [2.0, 56.0, 38.0, 0.0, 0.0, 0.0],
 [40.0, 0.0, 0.0, 0.0, 0.0, 0.0]]
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Gherbirthday0916/article/details/126771376

智能推荐

如何通过C#来操作文件句柄_c# file句柄-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏12次。首先,来说一下什么是文件句柄。百度百科的解释是:在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即文件句柄(file handle),该文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,..._c# file句柄

vue 点击一个按钮触发两个事件_vue事件点击穿透解决大法-程序员宅基地

文章浏览阅读3.4k次。最近在做项目的过程中遇到一个非常奇葩的bug,在h5页面点击一个按钮弹出弹窗,但是这个弹窗刚出现就会自动消失,导致屏幕出现闪动现象,关键这个bug还是偶现的。经过一番研究才发现是vue事件点击穿透引起的,而且弹窗一定要在300ms内出现才会引发这个bug,接下来分析具体原因:一,click与300ms延迟vue框架内置指令v-on:click有300ms的延迟响应,这是为了判断区分单击和双击。vu..._vue双事件

dp优化入门学习_dp优化的学习路径-程序员宅基地

文章浏览阅读132次。dp优化_dp优化的学习路径

【学习笔记】杜教筛_杜教筛 csdn-程序员宅基地

文章浏览阅读629次。φ∗1idφ∗idn。_杜教筛 csdn

autojs模仿抖音logo效果_牙叔autojs源码-程序员宅基地

文章浏览阅读1.3k次。牙叔教程 简单易懂效果展示为什么做看到别人的头像是这种风格, 虽然我不会去修改自己的头像,但是我想知道如何实现这样的效果,虽然写出来了, 不过我感觉还是不完全像抖音的效果, 可能还缺点啥环境手机: Mi 11 ProAndroid版本: 11Autojs版本: 9.0.10思路抖音的logo看起来像两张图片重叠的效果两张图片是透明的还加了偏移从原图搞两张透明图片, 再叠加你将学到以下知识点设置seekbar监听事件在seekbar监听事件中, img设置图片, 然后_牙叔autojs源码

计算机基础知识_1 gb=1024 mb,fsg≤1gb.64~256m 15个节点。10gb大的txt文件存储需要-程序员宅基地

文章浏览阅读924次。1、 第一台计算机ENIAC淡生于1946年,是电子管计算机;第二代是晶体管计算机;第三代是中小规模集成电路;第四代是大规模集成电路; 3、 计算机的信息表示形式为二进制,它采用了冯。诺依曼的思想原理,即以0 和1两个数字形式用于展现,“逢二进一”;它的基本信息单位为位,即一个_1 gb=1024 mb,fsg≤1gb.64~256m 15个节点。10gb大的txt文件存储需要存多少个g

随便推点

网络7层协议详解——Network layer protocol_ors设置layer7 protocol-程序员宅基地

文章浏览阅读6.9k次,点赞4次,收藏9次。OSI是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。下面我简单的介绍一下这7层及其功能。 OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 其中高层,既7、6、5、4层定义了应用程序的功能,下面3层,既3、2、1层主要面向通过网络的_ors设置layer7 protocol

VS2019生成DLL-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏10次。1 生成DLL1.1 新建dll工程1.2 编写dll函数首先在头文件中进行函数声明,将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。通常它和extern“C”合用,形式如下:/*pch.h*/#ifndef PCH_H#define PCH_H// 添加要在此处预编译的标头#include "framework.h"extern "C" _declspec(dllexport) int myAdd(int a, int b);exter_vs2019生成dll

2021 不会还有人不会uniapp吧[狗头]_uniapp多少开发者-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏22次。UniAPP 快速入门学习一、UniAPP 介绍(1)什么是 UniAPP ?uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到 iOS、Android、H5,以及各种小程序(微信/支付宝/百度/头条/ QQ /钉钉)等多个平台,方便开发者快速交付,不需要转换开发思维,不需要更改开发习惯。(2)为什么要选择 UniAPP ?开发者/案例数量更多几十万应用、uni 统计月活12亿、70+ 微信 / QQ群平台能力不受限在跨端的同时,_uniapp多少开发者

SQL语句多表查询-程序员宅基地

文章浏览阅读1.7w次,点赞6次,收藏43次。SQL语句多表查询_多表查询

使用Gitee多人项目协作开发的流程实例_gitee可以只开放部分目录给协作者吗-程序员宅基地

文章浏览阅读7.3k次,点赞8次,收藏60次。上一篇文章主要是初学Gitee,实现代码托管的功能,这一篇文章主要是学习Gitee协作开发的使用。这里我们用了一个企业账号来和两个社区账号进行演示。1.首先,企业账号下新建一个名称为协作开发测试仓库的公司主仓库,同时在仓库下新建两个分支lhy和lxw,同时仓库成员添加小组成员A和B。lhy用来存放组员A开发的代码部分,lxw用来存放组员B开发的代码部分。组员A、B此时在各自的账户下可以看到..._gitee可以只开放部分目录给协作者吗

idea上的maven形式的java web项目打包部署到linux的tomcat上_idea 接口发到linux 的tomcat中-程序员宅基地

文章浏览阅读378次。项目写好后,按照上述打成war包,丢到tomcat 的webapp目录里面,重启tomcat,访问链接是ip:8080/项目名/index.jsp_idea 接口发到linux 的tomcat中

推荐文章

热门文章

相关标签