Python 数学建模——cvxpy 规划求解器

devtools/2024/9/20 1:27:46/ 标签: 数学建模, python, 线性规划, 非线性规划

文章目录

    • 前言
    • cvxpy 介绍
    • 核心步骤
    • 代码实例

前言

  在数学建模的过程中,难免会遇到规划问题。特别是国赛 C 题,问题往往被描述为一个非线性的复杂规划问题,在各问中调整约束条件或者目标函数,从而得到各问的答案。
  诚然,当一个规划问题过于复杂时,我们更偏向于使用遗传算法模拟退火粒子群算法等智能算法,这类算法具有比较高的灵活度,可以面对各种各样复杂的约束条件。但是,当约束条件没那么复杂的时候,直接使用 Python 内部的规划求解器可能是一个更好的选择。

cvxpy 介绍

参考文献:Solver Features — CVXPY 1.5 documentation
  cvxpy 可以求解线性规划、整数规划和非线性规划,是一个高适配度的规划求解器。还有一些求解器:

核心步骤

  • import cvxpy as cp
  • 通过x = cp.Variable(shape)创建形状为shape连续型变量,比如x = cp.Variable((11,45))创建变量 X 11 × 45 X_{11\times45} X11×45。设置参数integer=True创建整数变量
  • 通过obj = cp.Minimize(expr)设置最小化的目标函数expr
  • 设置约束条件cons
  • 通过prob = cp.Problem(obj,cons)构建问题模型。
  • 通过prob.solve()求解问题。

有两个参数,求解器solver和是否显示求解的详细信息verbose
默认solver=None,会自动选择最佳求解器。常用求解器GLPK_MI(目前我安装的求解器中,只有它和CPLEX可以解决整数规划),还可以安装其他的求解器,见参考文献。
默认verbose=False,也就是求解的时候不会打印详细信息。(这些详细信息没有什么价值)

  • 通过prob.value打印目标函数的最优解,通过x.value打印最优解下对应变量的值。

代码实例

整数规划

min ⁡ z = 40 x 1 + 90 x 2 s . t . { 9 x 1 + 7 x 2 ≤ 56 7 x 1 + 20 x 2 ≥ 70 x 1 , x 2 ≥ 0 ; x 1 , x 2 ∈ Z \begin{matrix}\min{}&z=40{{x}_{1}}+90{{x}_{2}}\\&\\\mathrm{s.t.}&\left \{{\begin{matrix}9{{x}_{1}}+7{{x}_{2}}\le 56\\7{{x}_{1}}+20{{x}_{2}}\ge 70\\{{x}_{1}},{{x}_{2}}\ge 0;{{x}_{1}},{{x}_{2}}\in \mathbb Z\end{matrix}}\right .\end{matrix} mins.t.z=40x1+90x2 9x1+7x2567x1+20x270x1,x20;x1,x2Z  对于上面这个整数规划问题,使用下面的代码求解:

import cvxpy as cp
import numpy as npa = np.array([[9,7],[-7,-20]])
b = np.array([56,-70])
c = np.array([40,90])x = cp.Variable(2,integer=True)
obj = cp.Minimize(c * x)
cons = [a@x<=b, x>=0]
prob = cp.Problem(obj,cons)
prob.solve(solver='GLPK_MI',verbose=False)
print('最优值为:',prob.value)
print('最优解为:\n',x.value)

注:一般@用于矩阵相乘。*用于标矢相乘,或者矩阵按元素对应相乘之和。

  求解的结果是:

Long-step dual simplex will be used
最优值为: 350.0
最优解为:[2. 3.]

  假设构造的未知数矩阵是 X 11 × 45 X_{11\times45} X11×45,代码cons = [cp.sum(x,axis = 0) <= 1]可以表示按列求和 X 11 × 45 X_{11\times45} X11×45 得到的 45 45 45 个结果都小于等于 1 1 1axis=1按行求和。和np.sum用法一样,只是cp.sum是针对含有未知数的版本。
  注意:cvxpy 库在进行规划求解前,会使用 DCP 规则验证目标函数的凸性,不满足 DCP 规则时会报错。只要不出现x*x这类变量和变量相乘的式子,一般不会有问题。

线性规划

min ⁡ z = x 1 2 + x 2 2 + 3 x 3 2 + 4 x 4 2 + 2 x 5 2 − 8 x 1 − 2 x 2 − 3 x 3 − x 4 − 2 x 5 s . t . { x 1 + x 2 + x 3 + x 4 + x 5 ≤ 100 x 1 + 2 x 2 + 2 x 3 + x 4 + 6 x 5 ≤ 800 2 x 1 + x 2 + 6 x 3 ≤ 200 x 3 + x 4 + 5 x 5 ≤ 200 0 ≤ x i ≤ 99 , x i ∈ Z ( i = 1 , 2 , ⋯ , 5 ) \begin{matrix}\min{}&z={{x}_{1}^{2}}+{{x}_{2}^{2}}+3{{x}_{3}^{2}}+4{{x}_{4}^{2}}+2{{x}_{5}^{2}}-8{{x}_{1}}-2{{x}_{2}}-3{{x}_{3}}-{{x}_{4}}-2{{x}_{5}}\\&\\\mathrm{s.t.}&\left \{{\begin{matrix}{{x}_{1}}+{{x}_{2}}+{{x}_{3}}+{{x}_{4}}+{{x}_{5}}\le 100\\{{x}_{1}}+2{{x}_{2}}+2{{x}_{3}}+{{x}_{4}}+6{{x}_{5}}\le 800\\2{{x}_{1}}+{{x}_{2}}+6{{x}_{3}}\le 200\\{{x}_{3}}+{{x}_{4}}+5{{x}_{5}}\le 200\\0\le {{x}_{i}}\le 99,{{x}_{i}}\in \mathbb Z(i=1,2,\cdots ,5)\end{matrix}}\right .\end{matrix} mins.t.z=x12+x22+3x32+4x42+2x528x12x23x3x42x5 x1+x2+x3+x4+x5100x1+2x2+2x3+x4+6x58002x1+x2+6x3200x3+x4+5x52000xi99,xiZ(i=1,2,,5)  可以使用下面的代码求解这个问题:

import cvxpy as cp
import numpy as np
c1=np.array([1, 1, 3, 4, 2])
c2=np.array([-8, -2, -3, -1, -2])
a=np. array ([ [1, 1, 1, 1, 1], [1, 2, 2, 1, 6], [2, 1, 6, 0, 0],
[0, 0, 1, 1, 5]])
b=np. array ([400, 800, 200, 200])
x=cp.Variable(5,integer=True)
obj=cp.Minimize(c1*x**2+c2*x)
con=[0<=x, x<=99, a*x<=b]
prob= cp.Problem(obj, con)
prob.solve()
print("最优值为:",prob.value)
print("最优解为: \n",x.value)

  然而,并不是说能够解决所有的非线性规划。涉及到 log ⁡ x \log x logx或者 2 / x 2/x 2/x 之类的非线性目标函数,用目前的求解器还是无法进行。


http://www.ppmy.cn/devtools/113818.html

相关文章

二、Servlet

文章目录 1. Servlet技术1.1 什么是Servlet1.2 手动实现 Servlet 程序1.3 url 地址到 Servlet 程序的访问1.4 Servlet 的生命周期1.5 GET 和 POST 请求的分发1.6 通过继承 HttpServlet 实现 Servlet 程序1.7 使用 IDEA 创建 Servlet 程序1.8 Servlet 类的继承体系 2. ServletCo…

C++学习笔记(28)

十四、实现 strchr()和 strrchr()函数 示例&#xff1a; #define _CRT_SECURE_NO_WARNINGS // 使用 C 风格字符串操作的函数需要定义这个宏 #include <iostream> using namespace std; // 返回在字符串 s 中第一次出现 c 的位置&#xff0c;如果找不到&#xff0c;返回 0…

Python数据可视化

json数据格式 json是一种轻量级的数据交互格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据&#xff08;就是字符串&#xff09; json格式数据转化 通过json.dumps(data)方法把Python数据转化为json数据 datajson.dumps(data)如果有中文可以带上&#xf…

如何对企业源代码进行加密?10个保护企业源代码防泄密方法

在现代企业中&#xff0c;源代码不仅是核心技术的体现&#xff0c;更是公司竞争优势的重要部分。因此&#xff0c;源代码的保护变得至关重要。无论是防止黑客攻击&#xff0c;还是防止内部人员泄露&#xff0c;企业都需要采取全面的防护措施&#xff0c;确保源代码的安全。以下…

网络爬虫到底难在哪里?

如果你是自己做爬虫脚本开发&#xff0c;那确实难&#xff0c;因为你需要掌握Python、HTML、JS、xpath、database等技术&#xff0c;而且还要处理反爬、动态网页、逆向等情况&#xff0c;不然压根不知道怎么去写代码&#xff0c;这些技术和经验储备起码得要个三五年。 比如这几…

python数据分析知识点大全

Python数据分析知识点大全可以归纳为以下几个主要方面&#xff1a; 一、基础概念与目的 数据分析定义&#xff1a;数据分析是指用适当的统计分析方法对收集来的大量数据进行分析&#xff0c;提取有用信息和形成结论&#xff0c;对数据加以详细研究和概括总结的过程。其目的在…

切换淘宝最新镜像源npm详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 在中国大陆&#xff0c;npm&#xff08;Node Package Manager&#xff09;的默认源由于网络限制&#xff0c;速度可能较慢。为了解决这个问题&#xff0c;淘宝提供了一个镜像源&#xff0c;它同步了 npm 的…

Python编程 - 进程

目录 前言 一、进程的使用 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;什么是进程 &#xff08;三&#xff09;多进程 &#xff08;四&#xff09;常用功能 &#xff08;五&#xff09;应用场景 &#xff08;六&#xff09;总结 二、多进程通信 &…

其他图嵌入方法(6)

前面写了图神经网络可以把节点或图映射到一个低维空间&#xff0c;我们将其称为图嵌入。然而&#xff0c;除了图神经网络还有许多的图嵌入方法。本节将介绍其他浅层图嵌入方法。早在图神经网络发明之前&#xff0c;图嵌入的概念就经常出现在流形学习和网络分析的研究中。相对于…

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网&#xff08;IoT&#xff09;和人工智能技术的发展&#xff0c;智能家居语音控制系统已经成为现代家庭的一部分。通过语音控…

Python协程详解

文章目录 Python协程详解一、引言二、协程的基本概念与优势1、协程的定义2、协程的优势 三、Python中协程的实现1、使用生成器实现协程2、asyncio模块与async/await语法3、协程的生命周期管理 四、协程在实际应用中的使用1、网络爬虫2、Web服务器 五、总结 Python协程详解 一、…

ubuntu20.4安装Qt5.15.2

ubantu20.4镜像下载地址&#xff1a; https://releases.ubuntu.com/focal/ubuntu-20.04.6-desktop-amd64.iso Qt5.15.2下载地址&#xff1a; https://download.qt.io/official_releases/online_installers/ 安装步骤 1、进入地址后选择对应安装包&#xff0c;我这是ubuntu…

【多线程】常见的锁策略

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 我们之前详细分析过java标准库中的synchronized锁&#xff0c;事实上&#xff0c;这只是各种锁实现方式中的一种&#xff0c;不同的语言锁的实现策略都是有所不同的&#xff0c…

掌握ChatGPT:高效利用AI助手

2023 年 3 月 15 日&#xff0c;ChatGPT-4 的诞生标志着人类进入了一个全新的 人机协作时代。这个时代就像一个混沌初开的新世界&#xff0c;而 ChatGPT 则是这个新世界里诞生的一个新物种。 这个新物种的心智如同一个四五岁的小孩&#xff0c;在与它频繁互动中&#xff0c;人…

个人随想-gpt-o1大模型中推理链的一个落地实现

​首先祝大家中秋节快乐。 最近openai又推出了新的模型openai o1​还有它的mini版。官网的介绍&#xff0c;就是它的推理能力很强&#xff0c;比gpt-4o​有很大的提升。 最近也跟同行在聊这个o1&#xff0c;​看看落地方面有哪些可行性。在我们自己的实验上&#xff0c;把o1用…

GPT如何理解人类语言:从向量化到智能涌现

近年来&#xff0c;人工智能领域发生了革命性变化&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;方面&#xff0c;GPT&#xff08;Generative Pretrained Transformer&#xff09;模型展示了前所未有的语言理解和生成能力。我们习惯于用“词语接龙”来简单描述G…

mysql笔记7(单表查询)

文章目录 1. select① 从伪表里查数据(可以结合第3点dual理解数据来源)select 文字 ;做计算&#xff1a;select 算式;select 文字( 或算式) as 别名;(as 用于起别名&#xff0c;可省略) ② 从真实表里查数据select * from 表名;select 字段名&#xff0c;字段名 from 表名; 2. …

TDengine 与飞腾腾锐 D2000 完成兼容互认证,推动国产软硬件深度融合

在国家信息安全和自主可控技术日益受到重视的背景下&#xff0c;国产软硬件的发展已成为推动数字经济的重要力量。随着全球科技竞争加剧&#xff0c;企业在选择技术解决方案时&#xff0c;越来越倾向于采用国产产品以降低对外部技术的依赖。这一趋势不仅是为了确保数据安全与隐…

C++:类和对象全解

C&#xff1a;类和对象全解 一、类的定义和初始化&#xff08;一&#xff09;类的定义1、类的成员变量&#xff08;1&#xff09;成员变量&#xff08;2&#xff09;成员函数 2、实例化对象&#xff08;1&#xff09;采用普通构造函数&#xff08;2&#xff09;采用初始化列表 …

408算法题leetcode--第一天

参考 参考题单 1523. 在区间范围内统计奇数数目 1523. 在区间范围内统计奇数数目思路&#xff1a;数据量有 1 0 9 10^9 109&#xff0c;所以遍历求解会超时&#xff1b;而(low, high)区间中的奇数 (0, high) - (0, low - 1)的奇数时间和空间复杂度&#xff1a;O(1) class …