python3实现线性规划求解

news2024/11/24 14:25:58

Background

  • 对于数学规划问题,有很多的实现。Matlab+YALMIP+CPLEX这个组合应该是比较主流的,尤其是在电力相关系统中占据着比较重要的地位。
  • MATLAB是一个强大的数值计算工具,用于数学建模、算法开发和数据分析。
  • Yalmip是一个MATLAB工具箱,用于建模和解决凸优化问题。它提供了一个简单的语法,使用户能够轻松地定义优化问题,并使用各种内置求解器求解这些问题。
  • Cplex是一个商业优化求解器,由IBM公司开发。它可以用于解决各种优化问题,包括线性规划、混合整数线性规划和二次规划等。在MATLAB中,用户可以使用Yalmip接口轻松地与Cplex集成。
  • 目前 cplex 对 python 的支持目前还不是太全,相关的学习资料比较少,ibm 自己出的资料对 python 包的介绍也很简略,例子及相关类方法的介绍也不详细,这一点远没有对 java 或 c++ 支持地好。
  • 关于一些求解简单线性规划问题,python中也有一些库可以实现:
  • z3-solver是由Microsoft Research(微软)开发的SMT求解器,它用于检查逻辑表达式的可满足性,可以找到一组约束中的其中一个可行解,缺点是无法找出所有的可行解(对于规划求解问题可以是scipy)。z3-solver可应用于软/硬件的验证与测试、约束求解、混合系统的分析、安全、生物,以及几何求解等问题。Z3 主要由 C++ 开发,提供了 .NET、C、C++、Java、Python 等语言调用接口。
  • scipy库中的函数scipy.optimize.linprog也可以进行线性规划求解,但不支持整数约束,只能求解出实数。
  • pulp库是一个专门进行规划求解的库。pulp库也不是万能的,虽然可以解决线性规划问题,但不能进行非线性的规划求解。当然对于规划求解,95%以上的场景都是线性规划求解,pulp就足够应对我们需要应对的场景。pulp库它将优化问题描述为数学模型,生成MPS或者LP文件,然后调用LP求解器,如CBC、GLPK、CPLEX、Gurobi等来进行求解。
  • 安装完pulp库默认就拥有了CBC求解器,其他求解器需要额外安装才能使用,这里我没有测试这个。
  • cvxpy库是一个用于凸优化的Python库,它提供了一个简洁的、符合数学约束的方式来定义和求解各种凸优化问题。cvxpy的目标是提供一个易于使用的界面,使用户能够以简洁的方式表达凸优化问题,并通过优化求解器快速求解。内建的凸优化问题集类:cvxpy包含了一系列常见的凸优化问题模型,如线性规划、二次规划、半正定规划等。支持多种求解器:cvxpy可以与多个优化求解器集成,包括open-source的solver(如SCS、ECOS等)以及商业求解器(如Gurobi、CPLEX等)。

1、单个决策变量-scipy

  • 线性规划案例
    在这里插入图片描述

1.1、matlab+yalmip+cplex实现

%% yalmip+cplex
%(1)设定决策变量X(1)、X(2)
%(2)sdpvar:实数变量;binvar:0—1变量;intvar:整型变量
%(3)Yalmip默认是对称的,要求非对称用full

% 清除工作区
clear;clc;close all;
% function [m1, m2]=test_cplex()
% 创建决策变量
x=sdpvar(2,1,'full'); 
% 添加约束条件
st=[];
st=[st,-3*x(1)+x(2)<=6];
st=[st,x(1)+2*x(2)>=4];
st=[st,x(1)+3*x(2)==4];
st=[st,x(2)>=-3];
% 配置求解器
ops = sdpsettings('solver','cplex','verbose',0);
% 目标函数,默认最小
z=-2*x(1)+4*x(2); 
% 求解,如果最大值用-z
reuslt = optimize(st,z,ops);
% 求解结果x的值
x=value(x);
% 目标函数的最优解,即最小值
z=value(z);
% 打印结果
fprintf('x:%s\n', join(string(x),', '))
fprintf('z:%d\n', z)
  • 运行结果
x:13, -3
z:-38

在这里插入图片描述

1.2、python3+scipy实现

  • scipy.optimize.linprog

这里只介绍后面要用到的几个参数。

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

  • 代码实现
import numpy as np
from scipy.optimize import linprog


def main():
    """主函数"""
    # 要最小化的线性目标函数的系数
    c = np.array([-2, 4])
    # 不等式约束矩阵
    A_ub = np.array([[-3, 1], [-1, -2]])
    B_ub = np.array([6, -4])
    # 等式约束矩阵
    A_ed = np.array([[1, 3]])
    B_ed = np.array([4])
    # 决策变量的最小值和最大值对序列
    bounds = [None, None], [-3, None]
    # 求解
    res = linprog(c, A_ub, B_ub, A_ed, B_ed, bounds=bounds)
    # 求解结果x的值
    x = list(res.x.round())
    # 目标函数的最优解,即最小值
    z = round(res.fun)
    print(f'x: {x}')
    print(f'z: {z}')
    print(f'msg: {res.message}')


if __name__ == '__main__':
    main()

  • 运行结果

在这里插入图片描述

2、多个决策变量-cvxpy

cvxpy几个决策变量都行哈,单个也行。我这里只是用不同的方式实现记录下。

2.1、matlab+yalmip+cplex实现

% 创建决策变量
x=sdpvar(2,1,'full'); 
y=sdpvar(2,1,'full'); 
% 添加约束条件
st=[];
st=[st,-3*x(1)+x(2)<=6];
st=[st,x(1)+2*x(2)>=4];
st=[st,x(1)+2*x(2)<=2*y(1)];
st=[st,x(1)+3*x(2)==4];
st=[st,x(1)+4*x(2)==y(2)];
st=[st,x(2)>=-3];
% 配置求解器
ops = sdpsettings('solver','cplex','verbose',0);
% 目标函数,默认最小
z=-2*x(1)+4*y(2); 
% 求解,如果最大值用-z
reuslt = optimize(st,z,ops);
% 求解结果x的值
x=value(x);
y=value(y);
% 目标函数的最优解,即最小值
z=value(z);
% 打印结果
fprintf('x:%s\n', join(string(x),', '))
fprintf('y:%s\n', join(string(y),', '))
fprintf('z:%d\n', z)
  • 运行结果
x:13, -3
y:3.5, 1
z:-22

在这里插入图片描述

2.2、python3+cvxpy+cplex实现

  • 需要先安装cvxpycplex
pip3 install cvxpy
pip3 install cplex
  • 实现代码
import cvxpy as cp

# 创建决策变量
x = cp.Variable(2)
y = cp.Variable(2)

# 添加约束条件
constraints = []
constraints += [-3 * x[0] + x[1] <= 6]
constraints += [x[0] + 2 * x[1] >= 4]
constraints += [x[0] + 2 * x[1] <= 2 * y[0]]
constraints += [x[0] + 3 * x[1] == 4]
constraints += [x[0] + 4 * x[1] == y[1]]
constraints += [x[1] >= -3]

# 定义目标函数
objective = -2 * x[0] + 4 * y[1]

# 创建模型求解
problem = cp.Problem(cp.Minimize(objective), constraints)
problem.solve(solver=cp.CPLEX, verbose=False)

# 打印结果
x = list(x.value)
y = list(y.value)
# 目标函数的最优解,即最小值
z = round(problem.value)
print(f'x: {x}')
print(f'y: {y}')
print(f'z: {z}')

  • 运行结果
    在这里插入图片描述
    最终可以看到不同的实现方式,运行结果都是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS2022 CMake报错解决小结

目录 一、问题背景 二、问题分析 三、问题解决 一、问题背景 VS2022中能够跨平台的工程类型就是CMake项目&#xff0c;一套代码能跨windows/Linux/Mac多种操作系统。而实际使用时&#xff0c;发现相关资料比较少&#xff0c;需要摸索一下。 碰到的问题简述&#xff1a; 1、C…

VMware虚拟机Ubuntu无法连接网络的解决方法

一、解决办法 网络适配器设置 终端依次执行下面命令即可 sudo nmcli networking off sudo nmcli networking onsudo service network-manager start #或者 sudo service NetworkManager start成功出现这个图标&#xff0c;即代表网络连接成功。

Ubuntu中安装OpenSSL

文章目录 一、前期准备1.1 压缩包下载1.2 gcc, make等的安装二、安装配置 一、前期准备 1.1 压缩包下载 在安装openssl之前&#xff0c;我们需要下载对应的压缩包 https://www.openssl.org/source/openssl-3.0.1.tar.gz 此压缩包可以选择win上下载后解压再复制到本地虚拟机中…

python学习笔记——软件安装

目录 1. 安装并验证Python环境 2. 安装并设置Visual Studio Code编辑器 3. 设置Visual Studio Code编辑器 4.软件安装包 1. 安装并验证Python环境 首先&#xff0c;双击打开python安装包。 注意⚠️ &#xff1a; 安装之前需要关闭杀毒软件&#xff0c;比如360。 然后&am…

盘点九个可使用免费CDN的云服务商(2023版)

CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络&#x…

利用文本探测(text-detection)手写一个文本区域mask的生成

今天遇到这样一个需求&#xff1a;需要针对用户输入的图片生成对应文本区域的mask&#xff0c;按理说这应该是一个很容易实现的问题。 初步设想 要生成对应区域的mask&#xff0c;首先要找到文本所在的位置&#xff0c;针对不同的图片&#xff0c;文本位置自然是不同的&#xf…

每日一题——不同路径的数目(一)

题目 一个机器人在mn大小的地图的左上角&#xff08;起点&#xff09;。 机器人每次可以向下或向右移动。机器人要到达地图的右下角&#xff08;终点&#xff09;。 可以有多少种不同的路径从起点走到终点&#xff1f; 数据范围&#xff1a;0<n,m≤100&#xff0c;保证计算结…

129.【Spring 注解 IOC】

Spring 注解 (一)、组件注册1. Configuration 与 Bean 容器注册组件(1).无注解注入方式(2).注解注入方式 2. ComponentScan 自动扫描组件和自动扫描规则(1).无注解扫描方式(2).注解扫描注入方式(3).指定扫描或不扫描的包 (过滤) 3. 自定义TypeFilter指定过滤规则 Filter(1).自定…

宝塔端口监听不到端口

场景&#xff1a; 两个服务器同时在安装nginx 出问题导致20011没有在监听&#xff0c;重新删除nginx 就行了 当时一直以为是安全组没有放过端口&#xff0c;其实是没有监听 排查问题 php -S 0.0.0.0:端口 如果可以访问说明链接可以到服务器只是nginx没监听 sudo netstat …

Linux 发送信号

进程可以通过系统调用kill函数向包括它本身在内的其他进程发送一个信号。如果程序没有发送该信号的权限&#xff0c;对kill函数的调用就将失败&#xff0c;失败的常见原因是目标进程由另一个用户所拥有。这个函数和shell命令完成相同的功能。 一、kill函数的定义 发送信号的k…

01- 中断

中断 中断1.1 NVIC中断优先级分组1.2 外部中断<1> 映射中断线<2> 设置中断触发方式<3> 编写中断服务函数外部中断常用的库函数&#xff1a;中断函数初始化外部中断的一般配置步骤&#xff1a;部分示例&#xff1a; 中断 1.1 NVIC中断优先级分组 《stm32中文…

自动驾驶——车辆动力学模型

/*lat_controller.cpp*/ namespace apollo { namespace control {using apollo::common::ErrorCode;//故障码 using apollo::common::Status;//状态码 using apollo::common::TrajectoryPoint;//轨迹点 using apollo::common::VehicleStateProvider;//车辆状态信息 using Matri…

分模块开发的意义及开发步骤

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Maven进阶 一、分模块开发1.1分模块开发的意义1.2分模块开…

FlexTools plugin and 3dWindow plugin for SketchUp Crack

FlexTools v2.3.6 plugin for SketchUp 3dWindow v.4.5 plugin for SketchUp 建筑师和3D艺术家使用FlexTools创建SketchUp门、窗、楼梯和其他建筑元素&#xff0c;具有卓越的速度和控制水平。 SketchUp功能强大但易于使用的扩展。对于在施工图或建筑图中使用SketchUp的每个人…

Python 学习笔记——代码基础

目录 Python基础知识 变量 赋值 数据类型 print用法 print格式化输出 运算符 if-else 数据结构 元组 in运算符 列表 切片 [ : ] 追加 append() 插入 insert&#xff08;&#xff09; 删除 pop() 字典 循环 for循环 for循环应用——遍历 for循环应用——累加…

企业如何有效进行远程控制权限管理?向日葵权限管理能力解析

企业对于远程控制这一技术的管理&#xff0c;主要分为两部分&#xff0c;一种管理的目的是提升效率&#xff0c;另一种的目的是降低风险&#xff0c;我们这里着重聊聊后者。 企业管理远控行为&#xff0c;核心关键词是“权限”&#xff0c;通过不同的权限策略和能力&#xff0…

通信模块和光模块有什么区别?通信模块是光模块吗?

在现代科技高速发展的时代&#xff0c;通信技术扮演着举足轻重的角色&#xff0c;促进着全球信息的传递与交流。而在通信技术领域&#xff0c;通信模块与光模块是两个重要的组成部分。它们都在数据传输中发挥着关键作用&#xff0c;但又有着一些显著的区别。本文易天光通信将对…

一文看尽R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD详解

一文看尽R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD详解 以下六篇文章总结详细&#xff1a; 1. 一文读懂目标检测&#xff1a;R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD 2. 【深度学习】R-CNN 论文解读及个人理解 3、R-CNN论文详解 4、一文读懂Faster RCNN 5、学一百遍都…

Dockerfile概念、镜像原理、制作及案例讲解

1.Docker镜像原理 Linux文件操作系统讲解 2.镜像如何制作 3.Dockerfile概念 Docker网址&#xff1a;https://hub.docker.com 3.1 Dockerfile关键字 4.案例

基于YOLOv8模型的人体摔倒行为检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的人体摔倒行为检测系统可用于日常生活中检测与定位摔倒行人&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…