首页 > 编程语言 >利用python处理线性规划问题

利用python处理线性规划问题

时间:2024-09-13 23:22:03浏览次数:10  
标签:None 处理 python solution 线性规划 result optimal eq ub

利用python处理线性规划问题


(例题和部分解答思路来自清风老师)

linprog函数

导入模块

from scipy.optimize import linprog

函数功能
Linear programming: minimize a linear objective function subject to linear equality and inequality constraints.
处理线性规划问题,在等式和不等式约束下最小化目标函数

函数定义

def linprog(c: Any,
            A_ub: Any = None,
            b_ub: Any = None,
            A_eq: Any = None,
            b_eq: Any = None,
            bounds: Optional[Iterable] = None )->result   
c: 目标函数的系数,表示要最大化或最小化的线性函数的各个变量的系数。
A_ub: 不等式约束的左侧系数矩阵,表示需要满足的上界约束条件的系数。
b_ub: 不等式约束的右侧边界,表示与 A_ub 中相应行相乘后的结果需要小于等于的值。
A_eq: 等式约束的左侧系数矩阵,表示需要满足的等式约束条件的系数。
b_eq: 等式约束的右侧边界,表示与 A_eq 中相应行相乘后的结果需要等于的值。
bounds: 变量的取值范围,定义每个决策变量的最小和最大值,可以是单个值或多个变量的范围
result.x:最优解。
result.fun:最小化后的目标函数值(需要取负以获取最大化值)。
result.status:优化结果状态。
0:成功且找到唯一解。优化过程成功完成,并找到了一个唯一的最优解。
1:达到最大迭代次数。优化过程未能收敛,达到预设的最大迭代次数。
2:多解。存在多个最优解,优化问题的解空间中有多个解都能够达到最优目标。
3:无解。表示没有找到满足约束条件的解。
4:问题无界。优化问题是无界的,即目标函数可以无限增大(或减小)。
5:其他错误。可能是由于输入参数不正确或其他原因导致的错误。

基本例题

例题1

最小化目标函数
z = − 5 x 1 − 4 x 2 − 6 x 3 z = -5x_1 -4x_2 - 6x_3 z=−5x1​−4x2​−6x3​

约束条件:

  1. x 1 − x 2 + x 3 ≤ 20 x_1 - x_2 + x_3 \leq 20 x1​−x2​+x3​≤20
  2. 3 x 1 + 2 x 2 + 4 x 3 ≤ 42 3x_1 + 2x_2 +4 x_3 \leq 42 3x1​+2x2​+4x3​≤42
  3. 3 x 1 + 2 x 2 ≤ 30 3x_1 + 2x_2 \leq 30 3x1​+2x2​≤30
  4. x 1 , x 2 , x 3 ≥ 0 x_1, x_2, x_3 \geq 0 x1​,x2​,x3​≥0
c=[-5,-4,-6]
A_ub=[[1,-1,1],[3,2,4],[3,2,0]]
b_ub=[20,42,30]


result=linprog(c,A_ub=A_ub,b_ub=b_ub,bounds=[(0,None),(0,None),(0,None)])

# 格式化结果
optimal_value = f"{result.fun:.2f}"
optimal_solution = [f"{x:.2f}" for x in result.x]

print('Optimal value:', optimal_value)  
print('Optimal solution:', optimal_solution)  

bound中的无穷边界可用None表示,或用float(‘inf’)或np.inf表示

例题2

最大化目标函数
z = 2 x 1 + 3 x 2 − 5 x 3 z = 2x_1 + 3x_2 - 5x_3 z=2x1​+3x2​−5x3​

约束条件:

  1. x 1 + x 2 + x 3 = 7 x_1 + x_2 + x_3 = 7 x1​+x2​+x3​=7
  2. 2 x 1 − 5 x 2 + x 3 ≥ 10 2x_1 - 5x_2 + x_3 \geq 10 2x1​−5x2​+x3​≥10
  3. x 1 + 3 x 2 + x 3 ≤ 12 x_1 + 3x_2 + x_3 \leq 12 x1​+3x2​+x3​≤12
  4. x 1 , x 2 , x 3 ≥ 0 x_1, x_2, x_3 \geq 0 x1​,x2​,x3​≥0
c=[-2,-3,5]
A_ub=[[1,3,1],[-2,5,-1]]
b_ub=[12,-10]
A_eq=[[1,1,1]]
b_eq=[7]

result=linprog(c,A_ub=A_ub,b_ub=b_ub,A_eq=A_eq,b_eq=b_eq,bounds=[(0,None),(0,None),(0,None)])

# 格式化结果
optimal_value = f"{-result.fun:.2f}"
optimal_solution = [f"{x:.2f}" for x in result.x]

print('Optimal value:', optimal_value)  
print('Optimal solution:', optimal_solution)

典型例题

例一:生产决策问题

在这里插入图片描述
建模
在这里插入图片描述
代码

c=[0]*9
c[0]=-(1-0.25)
c[1]=-(1-(321*7/10000))
c[2]=250*6/4000
c[3]=783*4/7000
c[4]=200*7/4000
c[5]=300*10/6000
c[6]=321*9/10000
c[7]=-(1.65-250*8/4000)
c[8]=-(2.3-321*12/10000-783*11/7000)

A_ub=[[5,0,0,0,0,10,0,0,0],[0,7,0,0,0,0,9,0,12],[0,0,6,0,0,0,0,8,0],[0,0,0,4,0,0,0,0,11],[0,0,0,0,7,0,0,0,0]]
b_ub=[6000,10000,4000,7000,4000]
A_eq=[[1,1,-1,-1,-1,0,0,0,0],[0,0,0,0,0,1,1,-1,0]]
b_eq=[0,0]

bound=[(0,None)]

result=linprog(c,A_ub=A_ub,b_ub=b_ub,A_eq=A_eq,b_eq=b_eq,bounds=bound*9)

# 格式化结果
optimal_value = f"{-result.fun:.2f}"
optimal_solution = [f"{x:.2f}" for x in result.x]

print('Optimal value:', optimal_value)  
print('Optimal solution:', optimal_solution)  

结果

Optimal value: 1146.57
Optimal solution: ['1200.00', '230.05', '0.00', '858.62', '571.43', '0.00', '500.00', '500.00', '324.14']

例一:生产决策问题

在这里插入图片描述

建模
在这里插入图片描述

代码(难点:双下标与单下标转化)

import numpy as np
import math
#料场坐标 (a_i,b_i) i=1,2
loc_sup=[[5,1],[2,7]]
#工地坐标(p_j,q_j) j=1,2,...,6
loc_wok=[[1.25,1.25],[8.75,0.75],[0.5,4.75],[5.75,5],[3,6.5],[7.25,7.25]]
#工地日需求量
need_wok=[3,5,4,7,6,11]
max_sup=20
#决策变量 i->j x_ij  x_(6i+j) 表示从料场i送向工地j的水泥吨数
#决策变量系数:表示表示从料场i送向工地j的距离 (a_i-p_j)^2+(b_i-q_j)^2
c=[0]*12
for k in range(12):
    i=k//6
    j=k%6
    c[k]=math.sqrt((loc_sup[i][0]-loc_wok[j][0])**2+(loc_sup[i][1]-loc_wok[j][1])**2)
#约束条件:
#1 x_1j+x_2j=d_j 工地水泥需求
A_eq=np.zeros((6,12))
i=0
for j in range(6):
    A_eq[j][i],A_eq[j][i+6]=1,1
    i=i+1
b_eq=need_wok
#2 每个料场运输<=20 Σ_j x_ij<=20
A_ub=np.zeros((2,12))
A_ub[0,0:6]=1
A_ub[1,6:]=1
b_ub=[20,20]

bound=[(0,None)]

result=linprog(c,A_ub=A_ub,b_ub=b_ub,A_eq=A_eq,b_eq=b_eq,bounds=bound*12)

# 格式化结果
optimal_value = f"{result.fun:.2f}"
optimal_solution = [f"{x:.2f}" for x in result.x]

print('Optimal value:', optimal_value)  
print('Optimal solution:', optimal_solution)   

结果

Optimal value: 135.28
Optimal solution: ['3.00', '5.00', '0.00', '7.00', '0.00', '1.00', '0.00', '0.00', '4.00', '0.00', '6.00', '10.00']

标签:None,处理,python,solution,线性规划,result,optimal,eq,ub
From: https://blog.csdn.net/2301_79376014/article/details/142235619

相关文章

  • Clean code: Python Builder模式
    在Python中,Builder模式(构建者模式)是一种创建型设计模式,通常用于构建复杂对象。它将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的对象。虽然Python语言由于其动态特性,不像Java、C#等语言那样强制使用Builder模式,但它在某些情况下仍然非常有用,尤其是当你需要......
  • python logging 限制文件大小
    环境window10,pycharm23.0.2logging的配置使用logging模块时,你可以通过logging.handlers.RotatingFileHandler类来限制日志文件的大小。当日志文件达到指定大小时,RotatingFileHandler会自动创建一个新的日志文件,并将后续的日志记录到新的文件中。代码importloggingfro......
  • Python XML 解析
    什么是XML?Python对XML的解析1.SAX(simpleAPIforXML)2.DOM(DocumentObjectModel)3.ElementTree(元素树)python使用SAX解析xmlContentHandler类方法介绍make_parser方法parser方法parseString方法Python解析XML实例使用xml.dom解析xml什么是XML?XML......
  • Python 多线程
    开始学习Python线程线程模块使用Threading模块创建线程线程同步线程优先级队列(Queue)多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事......
  • Python SMTP发送邮件
    使用Python发送HTML格式的邮件Python发送带附件的邮件在HTML文本中添加图片使用第三方SMTP服务发送SMTP(SimpleMailTransferProtocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方......
  • Windows下批处理文件导入sql文件到MySQL5.5.50
    用来试验的MySQL的版本为5.5.50run.bat::DOS的UTF-8字符集chcp65001@ECHOOFF::到MySQL下新建文件夹set/pvar="请输入MySQL安装路径(如“C:\ProgramFiles(x86)\MySQL\MySQLServer5.5”):"set/pdirsql="请输入sql文件路径(如“C:\Users\Administrator\Desktop”):"c......
  • Hash Table 哈希表工作原理介绍及C/C++/Python实现
    HashTable哈希表工作原理介绍及C/C++/Python实现哈希表(HashTable),也称为散列表,是一种通过哈希函数将键(Key)映射到表中一个位置以便快速访问记录的数据结构。它提供了非常高效的数据检索、插入和删除操作。哈希表的基本原理是使用一个哈希函数将输入(通常是字符串)转换为一个......
  • 自然语言处理系列六十八》搜索引擎项目实战》搜索引擎系统架构设计
    注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】文章目录自然语言处理系列六十八搜索引擎项目实战》搜索引擎系统架构设计搜索引擎项目代码实战总结自然语言处理系......
  • YOLO【避免重复造轮子】开发中积累的一些数据集处理python脚本分享!!
    YOLO【避免重复造轮子】开发中积累的一些数据集处理python脚本分享!!预览内容YOLO【避免重复造轮子】开发中积累的一些数据集处理python脚本分享!!前言代码分享1、坐标转换2、读取标签文件3、cv2快速读取和保存中文路径图片4、单独绘制检测框BBOX和实例分割MASK5、数据集分......
  • opencv-python学习笔记9-图像分割
    目录一、图像分割的概述、技术现状、应用:技术现状:传统图像分割技术:深度学习驱动的图像分割技术:应用领域:二、 图像分割的方法和分类:(1)基于阈值的分割方法:(2)基于区域的分割方法:(3)基于边缘的分割方法:(4)基于特定理论的分割方法:(5)基于深度学习的分割方法:三、图像分割的原理:......