python3实现线性规划求解

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云Alibaba Cloud Linux镜像系统介绍_常见问题解答FAQ

阿里云服务器操作系统Alibaba Cloud Linux镜像怎么样&#xff1f;可以代替CentOS吗&#xff1f;Alibaba Cloud Linux兼容性如何&#xff1f;有人维护吗&#xff1f;漏洞可以修复吗&#xff1f;Alibaba Cloud Linux完全兼容CentOS&#xff0c;并由阿里云官方免费提供长期维护。 …

【不带权重的TOPSIS模型详解】——数学建模

目录索引 定义&#xff1a;问题引入&#xff1a;不合理之处&#xff1a;进行修改&#xff1a; 指标分类&#xff1a;指标正向化&#xff1a;极小型指标正向化公式&#xff1a;中间型指标正向化公式&#xff1a;区间型指标正向化公式&#xff1a; 标准化处理(消去单位)&#xff…

UML-时序图

目录 时序图 时序图构成: 对象: 消息: 生命线(激活): 活动条: 时序图举例: 时序图 时序图也叫顺序图、序列图. 时序图描述按照时间的先后顺序对象之间的动作过程&#xff0c;是由生命线和消息组成 时序图构成: 对象: 对象是类的实例&#xff0c;对象是通过类来创建的&…

远程桌面配置指南:保留TCP地址、配置隧道和使用固定TCP地址

远程桌面配置指南&#xff1a;保留TCP地址、配置隧道和使用固定TCP地址 文章目录 远程桌面配置指南&#xff1a;保留TCP地址、配置隧道和使用固定TCP地址第一步&#xff1a;保留TCP地址第二步&#xff1a;为远程桌面隧道配置固定的TCP地址第三步&#xff1a;使用固定TCP地址远程…

前端练手小项目--自定义时间(html+css+js)

自定义时间 写文章的因 关于要写这篇文章的原因 是记录在工作上遇到的困难需求&#xff0c;是希望能给大家提供一些解决问题的思路 接下来我描述这个需求的多样性&#xff0c;难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。取消勾选框开始时间与结束时间清空。…

6.1 安全漏洞与网络攻击

数据参考&#xff1a;CISP官方 目录 安全漏洞及产生原因信息收集与分析网络攻击实施后门设置与痕迹清除 一、安全漏洞及产生原因 什么是安全漏洞 安全漏洞也称脆弱性&#xff0c;是计算机系统存在的缺陷 漏洞的形式 安全漏洞以不同形式存在漏洞数量逐年递增 漏洞产生的…

【100天精通python】Day38:GUI界面编程_PyQT从入门到实战(中)

目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新&#xff1a; 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…

【C++学习手札】一文带你初识C++继承

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C类 ♈️今日夜电波&#xff1a;napori—Vaundy 1:21 ━━━━━━️&#x1f49f;──────── 3:23 …

车规级半导体分类(汽车芯片介绍)

车规级半导体&#xff0c;也被称为“汽车芯片”&#xff0c;主要应用于车辆控制装置、车载监控系统和车载电子控制装置等领域。这些半导体器件主要分布在车体控制模块上&#xff0c;以及车载信息娱乐系统方面&#xff0c;包括动力传动综合控制系统、主动安全系统和高级辅助驾驶…

谷歌浏览器安装不上【搬代码】

winR 输入regedit 计算机\HKEY_CURRENT_USER\SOFTWARE\Google 然后重新安装谷歌

如何通过本地搭建wamp服务器并实现无公网IP远程访问

文章目录 前言1.Wamp服务器搭建1.1 Wamp下载和安装1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置 3. 公网访问测试4. 结语 前言 软件技术的发展日新月异&#xff0c;各种能方便我们生活、工作和娱乐的新软件层出不穷&…

编程练习(2)

一.选择题 第一题&#xff1a; 考察转义字符和strlen函数求解字符串长度 进一步在VS中可以智能看出哪些字符是转义字符&#xff1a; 因此本体答案选择B 第二题&#xff1a; 本体较为简单&#xff0c;宏定义了三个数N,M,NUM,N值为2,M值为3&#xff0c;因此NUM值为8&#xff0c;…

uniapp微信小程序区分正式版,开发版,体验版

小程序代码区分是正式版&#xff0c;开发版&#xff0c;还是体验版 通常正式和开发环境需要调用不同域名接口&#xff0c;发布时需要手动更换 或者有些东西不想在正式版显示&#xff0c;只在开发版体验版中显示&#xff0c;也需要去手动隐藏 官方没有明确给出判断环境的方法&a…

pytorch @操作符

今天发现一个操作符 import torch a torch.tensor([[1,2],[2,3],[5,6]]) b torch.tensor([[2,1],[8,5],[3,2]]) c a*b d a b.t() ## [3,2] [2,3] print(*,c) print(,d)结果如下 import torch# Define matrices A torch.randn(3, 4) B torch.randn(4, 5)# Matrix mult…

强化学习:用Python训练一个简单的机器人

一、介绍 强化学习&#xff08;RL&#xff09;是一个令人兴奋的研究领域&#xff0c;它使机器能够通过与环境的交互来学习。在这篇博客中&#xff0c;我们将深入到RL的世界&#xff0c;并探索如何使用Python训练一个简单的机器人。在本文结束时&#xff0c;您将对 RL 概念有基本…

多元最短路(Floyd)

是一个基于动态规划的全源最短路算法。它可以高效地求出图上任意两点之间的最短路 时间复杂度 O(n^3) 状态转移方程 f[i][j]min(f[i][j],f[i][k]f[k][j]) 核心代码 void floyd(){for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)s[i][j]min(s[i][j],s[i][k…

ZooKeeper的应用场景(命名服务、分布式协调通知)

3 命名服务 命名服务(NameService)也是分布式系统中比较常见的一类场景&#xff0c;在《Java网络高级编程》一书中提到&#xff0c;命名服务是分布式系统最基本的公共服务之一。在分布式系统中&#xff0c;被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等一这…

7.1 Redis基础

1、Redis概述 Redis是开源的、高性能的key-value数据库&#xff0c;Redis缓存有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据&#x…

LangChain手记 Memory

整理并翻译自DeepLearning.AILangChain的官方课程&#xff1a;Memory&#xff08;源码可见&#xff09; Memory 使用open ai的API调用GPT都是单次调用&#xff0c;所以模型并不记得之前的对话&#xff0c;多轮对话的实现其实是将前面轮次的对话过程保留&#xff0c;在下次对话…