matlab+yalmip+cplex和python3+scipy两种方式实现线性规划求解

news2025/1/16 15:51:49

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求解器,其他求解器需要额外安装才能使用。所以这里以scipy库为例来实现与Matlab+YALMIP+CPLEX相同的功能。

1、scipy.optimize.linprog

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

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

2、线性规划案例

在这里插入图片描述

3、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

在这里插入图片描述

4、python3+scipy实现

  • 代码实现
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()

  • 运行结果

在这里插入图片描述

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

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

相关文章

无涯教程-Perl - splice函数

描述 此函数从LENGTH元素的OFFSET元素中删除ARRAY元素,如果指定,则用LIST替换删除的元素。如果省略LENGTH,则从OFFSET开始删除所有内容。 语法 以下是此函数的简单语法- splice ARRAY, OFFSET, LENGTH, LISTsplice ARRAY, OFFSET, LENGTHsplice ARRAY, OFFSET返回值 该函数…

非常炸裂!一个只有135行源码的插件!

今天&#xff0c;我们接着讨论图片图片懒加载。这是前端性能优化中老生常谈的话题了。旨在提升页面初始化渲染性能和用户体验。 问题 我们是不是会遇到这样的场景&#xff1a; 当访问一个图片展示比较多的网页时&#xff0c;页面加载速度很慢&#xff0c;尤其是其中的图片半天…

C#数据类型转换

目录 1.常用的数据类型: ​编辑1.1别名概念例子: 输出结果&#xff1a; 2.数值类型之间的相互转换: 2.1举例: ​编辑输出结果: 1.常用的数据类型: 1.1别名概念例子: 输出结果&#xff1a; 用GetType来获取数据类型的时候&#xff0c;就是指向System.Byte和System.Char这个…

MAVEN利器:一文带你了解MAVEN以及如何配置

前言&#xff1a; 强大的构建工具——Maven。作为Java生态系统中的重要组成部分&#xff0c;Maven为开发人员提供了一种简单而高效的方式来构建、管理和发布Java项目。无论是小型项目还是大型企业级应用&#xff0c;Maven都能帮助开发人员轻松处理依赖管理、编译、测试和部署等…

Java:集合体系:Collection集合的常用方法(API)

集合体系 用ArrayList 和 HashSet 打印出来的结果 Collection 集合的常用方法&#xff08;API&#xff09; 由于Collection是一个接口 所以不能直接new Collection 编译看左边&#xff0c;运行看右边 转成数组时是Object 类型&#xff0c;方便将来往集合里添加任何数据 拓展&am…

wsl2 Ubuntu子系统 yolov8测试

文章目录 前言安装依赖下载权重测试 前言 OLOv8是Ultralytics公司推出的基于对象检测模型的YOLO最新系列&#xff0c;它能够提供截至目前最先进的对象检测性能。 借助于以前的YOLO模型版本支持技术&#xff0c;YOLOv8模型运行得更快、更准确&#xff0c;同时为执行任务的训练…

小额配资和大额配资是什么?

小额配资和大额配资是股票配资领域中常用的两种方式。本文将会详细介绍小额配资和大额配资的概念&#xff0c;并对其区别进行分析。 首先&#xff0c;小额配资是指投资者通过股票配资机构借取相对较小的资金进行投资。一般而言&#xff0c;小额配资的金额较低&#xff0c;通常…

JVM - 垃圾收集器

目录 垃圾收集器 串行垃圾收集器 并行垃圾收集器 什么是 吞吐量优先 什么是 响应时间优先 &#xff1f; CMS&#xff08;并发&#xff09;垃圾收集器 G1 垃圾收集器 垃圾收集器 垃圾收集器大概可以分为&#xff1a; 串行垃圾收集器并行垃圾收集器CMS&#xff08;并发&a…

解析Python爬虫常见异常及处理方法

作为专业爬虫程序猿长期混迹于爬虫ip解决方案中&#xff0c;我们经常会遇到各种各样的异常情况。在爬虫开发过程中&#xff0c;处理这些异常是不可或缺的一部分。本文将为大家总结常见的Python爬虫异常&#xff0c;并分享相应的处理方法&#xff0c;帮助你避免绊倒在爬虫之路上…

深入了解API标准:为什么它如此重要?| SEO优化

深入了解API标准&#xff1a;为什么它如此重要&#xff1f; 什么是API标准&#xff1f; 在计算机科学领域中&#xff0c;API标准是指应用程序接口的规范和约定。它定义了应用程序之间相互通信和交互的方法和规则。API标准允许软件开发人员使用其他应用程序的功能和数据&#…

排序算法 - Java实现

冒泡排序 排序原理&#xff1a; 比较相邻的元素。如果前一个元素比后一个元素大&#xff0c;就交换这两个元素的位置。对每一对相邻元素做同样的工作&#xff0c;从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值 代码实现&#xff1a; import java.uti…

【AI绘画】3分钟学会ikun幻术图

目录 前言一、效果展示二、准备工作三、操作步骤3.1平台创建实例3.2 启动SD 四、安装QR Code Monster 模型五、成图 前言 大家热爱的ikun幻术在今天的分享中将呈现。在本文中&#xff0c;我们将揭示一个备受欢迎的图像幻术技术&#xff0c;让您感受到令人惊叹的视觉创造力。 …

超详细 | 蜣螂优化算法DBO原理及其实现(Matlab)

蜣螂优化算法(dung beetle optimizer&#xff0c;DBO)是JiankaXue 和Bo Shen在2022 年提出的一种新型群体智能优化算法[1]&#xff0c;其灵感来自于蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为。该算法同时考虑了全局探索和局部开发&#xff0c;从而具有收敛速度快和准确率高的特点…

每日一题leetcode--使循环数组所有元素相等的最少秒数

相当于扩散&#xff0c;每个数可以一次可以扩散到左右让其一样&#xff0c;问最少多少次可以让整个数组都变成一样的数 使用枚举&#xff0c;先将所有信息存到hash表中&#xff0c;然后逐一进行枚举&#xff0c;计算时间长短用看下图 考虑到环形数组&#xff0c;可以把首项n放…

数字技术能让古籍“活过来”吗?

数字技术能让古籍“活过来”吗&#xff1f; 本篇目录&#xff1a; 一、写在前面的话 二、前言 三、你觉得数字技术能让古籍活过来吗&#xff1f; 四、你觉得利用现代技术修复古籍可能遇到的难点是什么&#xff1f; 五、如果有机会为古籍活化助力&#xff0c;你想参与哪部分…

C语言实现16k、48kpcm数据的双向重采样

文章目录 注意事项重采样代码int16_t数据溢出测试代码测试结果 注意事项 音频重采样过程中使用有符号数&#xff0c;确保计算过程正确。在48k->16k的下采样过程中&#xff0c;3个采样点数据相加取平均值不用担心溢出问题。已使用测试代码确认在Linux、Windows均正常。 重采…

生活随笔,记录我的日常点点滴滴.

前言 &#x1f618;个人主页&#xff1a;曲终酣兴晚^R的小书屋&#x1f971; &#x1f615;作者介绍&#xff1a;一个莽莽撞撞的&#x1f43b; &#x1f496;专栏介绍&#xff1a;日常生活&往事回忆 &#x1f636;‍&#x1f32b;️每日金句&#xff1a;被人暖一下就高热&…

Nuxt3_1_路由+页面+组件+资源+样式 使用及实例

1、 简介 1.1 开发必备 node版本 v16.10.0 我使用的是16.14.0编辑器推荐使用Volar Extension 的VS code插件Terminal 运行nuxt指令 1.2 环境搭建 安装项目&#xff1a; npx nuxilatest init [first_nuxt3]进入项目目录&#xff1a; cd [first_nuxt3]安装依赖&#xff1a;n…

day06-点赞系统

当热心用户或者老师给学生回答了问题以后&#xff0c;所有学员可以给自己心仪的回答点赞&#xff0c;点赞越高&#xff0c;排名也越靠前。 1.1.业务需求 首先我们来分析整理一下点赞业务的需求&#xff0c;一个通用点赞系统需要满足下列特性&#xff1a; 1.2.实现思路 要保…

服务器数据恢复-HP EVA存储常见故障的数据恢复流程

EVA存储原理&#xff1a; EVA系列存储是以虚拟化存储为实现目的的中高端存储设备&#xff0c;内部的结构组成完全不同于其他的存储设备&#xff0c;RAID在EVA内部称之为VRAID。 EVA会在每个物理磁盘&#xff08;PV&#xff09;的0扇区写入签名&#xff0c;签名后PV会被分配到不…