Yalmip使用教程(7)-求解器的参数设置

        博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:https://yalmip.github.io/tutorials/

        这篇博客将详细介绍yalmip工具箱中常用的求解器设置选项。

1.求解器的基本设置

        使用sdpsettings函数可以对求解的相关参数进行设置。最常用的设置选项包括求解器的选择(solver)、命令行结果展示的详细程度(verbose)与步骤展示(showprogress)。例如,下面的代码就是将求解器选择为cplex,结果展示的详细程度为0(最少的命令行展示,最大值为3),不显示步骤(showprogress为0):

ops = sdpsettings('solver','cplex','verbose',0,'showprogress',0);

        也可以先对选项结构体进行赋值,然后通过结构体操作修改具体选项的内容,例如:

ops = sdpsettings;
ops.solver = cplex;
ops.verbose = 0;
ops.showprogress = 0;

        Yalmip求解器的参数非常多,如果想要查看完整的参数,可以先定义一个默认的参数选项ops,然后在工作区或者命令行查看该结构体的内容:

>> ops

ops = 

  包含以下字段的 struct:

                   solver: ''
                  verbose: 1
                    debug: 0
                    usex0: 0
                  warning: 1
             cachesolvers: 0
             showprogress: 0
                saveduals: 1
         removeequalities: 0
         savesolveroutput: 0
          savesolverinput: 0
          saveyalmipmodel: 0
        convertconvexquad: 1
    assertgpnonnegativity: 1
             thisisnotagp: 0
                   radius: Inf
                    relax: 0
                  dualize: 0
                savedebug: 0
                   expand: 1
                allowmilp: 1
           allownonconvex: 1
                    shift: 0
                   dimacs: 0
            beeponproblem: [-5 -4 -3 -2 -1]
            mosektaskfile: ''
                bisection: [1×1 struct]
                  bilevel: [1×1 struct]
                   bmibnb: [1×1 struct]
                      bnb: [1×1 struct]
                   cutsdp: [1×1 struct]
                      kkt: [1×1 struct]
                   moment: [1×1 struct]
                       mp: [1×1 struct]
                    mpcvx: [1×1 struct]
                     plot: [1×1 struct]
                   robust: [1×1 struct]
                      sos: [1×1 struct]
                  refiner: [1×1 struct]
                    baron: []
                 bintprog: [1×1 struct]
                   bonmin: []
                     cdcs: [1×1 struct]
                      cdd: [1×1 struct]
                      cbc: [1×1 struct]
                      clp: [1×1 struct]
                    cplex: [1×1 struct]
                 coneprog: []
                     csdp: [1×1 struct]
                     dsdp: [1×1 struct]
                     ecos: []
                 filtersd: [1×1 struct]
                  fmincon: [1×1 struct]
               fminsearch: [1×1 struct]
                    frlib: [1×1 struct]
                     glpk: [1×1 struct]
                   gurobi: [1×1 struct]
                    ipopt: [1×1 struct]
               intlinprog: [1×1 optim.options.Intlinprog]
                   knitro: [1×1 struct]
                  linprog: [1×1 struct]
                   lmilab: [1×1 struct]
                  lmirank: [1×1 struct]
                logdetppa: [1×1 struct]
                  lpsolve: [1×1 struct]
                lsqnonneg: [1×1 struct]
                   lsqlin: [1×1 struct]
                     kypd: [1×1 struct]
                    kktqp: [1×1 struct]
                      nag: [1×1 struct]
                    mosek: [1×1 struct]
                    nomad: []
                     ooqp: []
                   penbmi: [1×1 struct]
                   penlab: []
                   pensdp: [1×1 struct]
                      pop: [1×1 struct]
                  qpoases: []
                     osqp: []
                    qsopt: [1×1 struct]
                 quadprog: [1×1 struct]
               quadprogbb: [1×1 struct]
                     scip: [1×1 struct]
                      scs: [1×1 struct]
                     sdpa: [1×1 struct]
                    sdplr: [1×1 struct]
                    sdpt3: [1×1 struct]
                   sdpnal: [1×1 struct]
                   sedumi: [1×1 struct]
                sparsepop: [1×1 struct]
                    snopt: [1×1 struct]
               sparsecolo: [1×1 struct]
                     vsdp: [1×1 struct]
                   xpress: []
                  default: [1×1 struct]

2.常用参数详解

2.1 solver

        参数solver表示yalmip在求解优化问题的将调用的求解器,如果没有指定solver参数,yalmip将自动选择已有合适的求解器,yalmip支持的求解器很多,支持的求解器和各个求解器的适用范围可参考官方文档的介绍:

Solvers - YALMIP

2.2 verbose

        参数verbose表示yalmip在求解优化问题时候所展示的细节多少,取值为0时表示不展示求解的细节,取值为3时展示最多的求解细节。

2.3 debug

        参数debug表示yalmip在求解过程中是否采用catch语句处理报错。如果debug参数设置为1,表示yalmip求解过程中报错时将直接显示在命令行(也就是我们在命令行常见的红色文字),如果将debug参数设置为0,yalmip求解过程中如果如果遇到错误将直接使用catch语句对错误进行处理。如果对catch语句用法不太清楚,可以尝试搜索matlab中try-catch语句的用法。

2.4 warning

        参数warning表示yalmip是否在命令行显示警告,取1时表示显示警告,取0时表示不显示警告。

2.5 showprogress

        参数showprogress表示是否展示Yalmip工具箱当前的动作,取1时将进行展示,取0时不展示。该参数和verbose参数类似,但有一定区别。verbose参数的取值表示时求解优化问题时候的细节,showprogress表示是否展示yalmip工具箱的动作,包括对约束条件进行处理,识别优化问题的类型等。

2.6 relax

参数relax表示对非线性约束的处理方式,如果relax设置为1,则将忽略所有非线性和完整性约束,整数变量被松弛为连续变量,非线性变量被视为独立的变量(例如x和x^2将被视为两个独立的变量)。如果设置为2,则仅松弛整数约束,如果设置为3,则仅松弛非线性约束。

2.7 usex0

        参数usex0表示是否在求解优化问题时给定初值。如果将usex0参数设置为1,Yalmip会将变量的当前取值发送给求解器,作为求解时的初值。一般情况下,该参数可以和assign函数搭配使用。

        在求解一些大规模优化问题时,如果已知优化问题的一组可行解,如果可以使用assign函数将这组可行解赋值给优化变量,并将usex0参数设为1,很可能将大大加快求解速度。

3.gurobi求解器的参数详解

        从第一节所展示的ops所有参数可以看到,除了上述常用的参数选项之外,还有一些参数是结构体形式,点开后又有许多二级参数。其中最常用的就是求解器的参数,下面以常用的gurobi求解器为例进行讲解:

        点开ops.gurobi,可以发现又有许多参数:

ops.gurobi

ans = 

  包含以下字段的 struct:

          BarIterLimit: 1000
            BestBdStop: Inf
           BestObjStop: -Inf
                Cutoff: Inf
        IterationLimit: Inf
             NodeLimit: Inf
         SolutionLimit: Inf
             TimeLimit: 7200
            BarConvTol: 1.0000e-08
         BarQCPConvTol: 1.0000e-06
        FeasibilityTol: 1.0000e-06
            IntFeasTol: 1.0000e-05
          MarkowitzTol: 0.0078
                MIPGap: 0.0100
             MIPGapAbs: 1.0000e-10
         OptimalityTol: 1.0000e-06
                PSDTol: 1.0000e-06
           InfUnbdInfo: 0
            NormAdjust: -1
              ObjScale: 0
          PerturbValue: 2.0000e-04
                  Quad: -1
             ScaleFlag: -1
               Sifting: -1
            SiftMethod: -1
        SimplexPricing: -1
         BarCorrectors: -1
        BarHomogeneous: -1
              BarOrder: -1
             Crossover: -1
        CrossoverBasis: 0
               QCPDual: 0
             BranchDir: 0
        ConcurrentJobs: 0
         ConcurrentMIP: 1
            DegenMoves: -1
          Disconnected: -1
    DistributedMIPJobs: 0
            Heuristics: 0.0500
       ImproveStartGap: 0
     ImproveStartNodes: Inf
      ImproveStartTime: Inf
       LazyConstraints: 0
           MinRelNodes: -1
              MIPFocus: 0
           MIQCPMethod: -1
           NodefileDir: ''
         NodefileStart: Inf
            NodeMethod: -1
             NonConvex: -1
        PartitionPlace: 15
            PumpPasses: -1
                  RINS: -1
              SolFiles: ''
        SolutionNumber: 0
        StartNodeLimit: -1
           StartNumber: 0
           SubMIPNodes: 500
              Symmetry: -1
             VarBranch: -1
          ZeroObjNodes: -1
               AggFill: -1
             Aggregate: 1
        DualReductions: 1
              PreCrush: 0
             PreDepRow: -1
               PreDual: -1
          PreMIQCPForm: -1
             PrePasses: -1
         PreQLinearize: -1
              Presolve: -1
           PreSOS1BigM: -1
           PreSOS2BigM: 0
           PreSparsify: -1
         TuneCriterion: -1
              TuneJobs: 0
            TuneOutput: 2
           TuneResults: -1
         TuneTimeLimit: -1
            TuneTrials: 3
               PoolGap: Inf
        PoolSearchMode: 0
         PoolSolutions: 10
               BQPCuts: -1
                  Cuts: -1
            CliqueCuts: -1
             CoverCuts: -1
          CutAggPasses: -1
             CutPasses: -1
         FlowCoverCuts: -1
          FlowPathCuts: -1
          GomoryPasses: -1
          GUBCoverCuts: -1
           ImpliedCuts: -1
          InfProofCuts: -1
            MIPSepCuts: -1
               MIRCuts: -1
              ModKCuts: -1
           NetworkCuts: -1
       ProjImpliedCuts: -1
         RelaxLiftCuts: -1
               RLTCuts: -1
          StrongCGCuts: -1
            SubMIPCuts: -1
          ZeroHalfCuts: -1
        WorkerPassword: ''
            WorkerPool: ''
         CloudAccessID: ''
             CloudHost: ''
        CloudSecretKey: ''
             CloudPool: ''
         ComputeServer: ''
        ServerPassword: ''
         ServerTimeout: 60
            CSPriority: 0
        CSQueueTimeout: -1
              CSRouter: ''
               CSGroup: ''
         CSTLSInsecure: 0
         CSIdleTimeout: -1
                 JobID: ''
         CSAPIAccessID: ''
           CSAPISecret: ''
             CSAppName: ''
           CSAuthToken: ''
           CSBatchMode: 0
           CSClientLog: 0
             CSManager: ''
           TokenServer: ''
                TSPort: 41954
       DisplayInterval: 5
         FeasRelaxBigM: 1000000
        FuncPieceError: 1.0000e-03
       FuncPieceLength: 0.0100
        FuncPieceRatio: -1
            FuncPieces: 0
            FuncMaxVal: 1000000
           IgnoreNames: 0
             IISMethod: -1
         JSONSolDetail: 0
               LogFile: ''
          LogToConsole: 1
                Method: -1
        MultiObjMethod: -1
           MultiObjPre: -1
          NumericFocus: 0
             ObjNumber: 0
            OutputFlag: 1
                Record: 0
            ResultFile: ''
        ScenarioNumber: 0
                  Seed: 0
               Threads: 0
            UpdateMode: 1
         NoRelHeurWork: 0
         NoRelHeurTime: 0

        下面将对gurobi中常用的参数选项进行讲解。

3.1 MIPGap

        MIPGap参数是指gurobi求解器的偏差终止条件。当整数规划的偏差下降到设定值后,优化终止。Gurobi中该参数计算公式如下:

式中,ZP和ZD分别表示目标函数的上界和下界。当ZP=0且ZD≠0时,gap被视为无穷大。

        该参数的默认值为 10^(-4),实际中如果对求解精度要求不是特别高,一般可以设定为 0.05 或者 0.01。修改该参数有两种方法,分别如下:

ops = sdpsettings('solver' , 'gurobi' , 'gurobi.MIPGap' , 0.01);

        或

ops = sdpsettings('solver' , 'gurobi' );
ops .gurobi.MIPGap = 0.01;

        第3节所有提到的参数修改都可采用相同的方式,后面不再赘述。

3.2 TimeLimit

        TimeLimit参数表示gurobi求解器的时间终止条件。当达到规定的运行时间后,优化终止,该参数的单位为秒,默认值为inf(无穷大,即不限制求解时间)。但实际编程过程中,很多时候求解器会一直卡在某个进度,运行一天一夜也没有达到收敛,因此可以考虑对求解器的运行时间进行限制。

3.3 MIPFocus

        MIPFocus参数表示MIP(混合整数规划)问题求解时所采取的策略,其默认值为0,试图在最优值和可行解之间取得平衡,取1时以可行解为优先目标,取2时以得到最优解为目标,取3时以优化边界为目标。

3.4 Presolve

        Presolve参数表示gurobi求解优化问题时预优化的力度。其默认值为-1,表示,自动决定预优化力度。0:关闭预优化;1:保守;2:激进。

3.5 Method

        Method参数表示gurobi求解优化问题时所采用的方法。其默认值为-1,自动决定优化方法。其他选项包括:0-原始单纯形,1-对偶单纯形,2-barrier,3-并发,4-确定性并发。

        其中,并发方法不适用于QP和QCP。只有单纯形和barrier算法可用于连续QP模型。如果选择barrier算法来求解MIQP模型的根,则还需要为节点松弛选择barriel(即设置NodeMethod=2)。只有barrier算法可用于连续QCP模型。但是,如果选择LP松弛来求解MIQCP,也可以选择单纯形算法(方法=0或1)。

        并发优化器在多个线程上同时运行多个解算器,并选择首先完成的解算器。并发运行的解算器可以使用ConcurrentMethod参数进行控制。确定性并发每次都会给出完全相同的结果,而非确定性并发(方式=3)通常更快,但在多次运行时可以产生不同的结果。

        如果LP模型内存紧张,则应考虑使用对偶单纯形法。通常在使用默认设置时选择并发优化器,它比单独使用对偶单纯形消耗更多的内存。

3.6 ImproveStartTime和ImproveStartGap

        ImproveStartTime和ImproveStartGap参数分别表示是否在一定时间或达到一定精度后改变gurobi的寻优策略,其中ImproveStartTime参数的单位为秒。ImproveStartTime和ImproveStartGap参数的默认值为inf和0,表示求解过程中不更改gurobi的寻优策略。如果将ImproveStartTime参数修改为10,表示gurobi求解器在运行10秒后将目标转为寻找可行解;同理,如果将ImproveStartGap参数修改为0.05,表示收敛精度达到0.05后将目标转为寻找可行解。

3.7 NoRelHeurTime和NoRelHeurWork

        NoRelHeurTime和NoRelHeurWork参数分别表示gurobi在求解MIP问题时采用NoRel启发式算法的时间和工作量。其中NoRelHeurTime参数的单位为秒,NoRelHeurWork参数的单位为1。对于求解困难的混合整数规划问题,可以考虑使用这两个参数。两个参数主要的不同之处在于NoRelHeurTime所求结果具有不确定性,而NoRelHeurWork所得结果是具有确定性的。

3.6 Heuristics

        Heuristics参数表示gurobi在求解优化问题时采用启发式算法的时间占比,其单位为1。默认值是0.05,表示gurobi求解过程中大约有5%的时间采用启发式方法。如果手中有一个很难找到初始可行解的混合整数规划问题,可以尝试增加Heuristics参数的取值。

3.7其他求解器参数设置

        对于其他常用的cplex,mosek等求解器,也有许多参数选项,某些时候可以通过设置求解器参数提高求解效率,其中各自的参数选项均可从各自的使用手册上找到对应的含义和用法,此处不再赘述。

        Cplex求解器参数选项文档:

List of CPLEX parameters - IBM Documentation

        Mosek求解器参数选项文档:

15.5 Parameters (alphabetical list sorted by type) — MOSEK Optimizer API for C 10.1.28

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

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

相关文章

【操作系统】STM32-操作系统——持续更新

【操作系统】STM32-操作系统——持续更新 文章目录 前言一、ucosii二、freertos1.介绍2.移植 总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、ucosii UCOSII移植到STM32F103C8T6上之移植记录(一) UCOSII移植到ST…

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽,配置为:16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京,京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图: 京东云16核64G云服务器…

通用爬虫的概念简述

一、🌈什么是通用爬虫 通用爬虫(General Purpose Web Crawler或Scalable Web Crawler)是一种网络爬虫,其设计目标是对整个互联网或尽可能广泛的网络空间进行数据抓取。通用爬虫主要用于搜索引擎构建其庞大的网页索引数据库&#…

LaTeX 空格与换行

任意多个空格与一个空格的功能相同。只有字符后面的空格是有效的,每行最前面的空格被忽略。单个换行被视作一个空格,连续两个换行表示分段。~被称作一种不可打断的空格,排版系统不会在这种空格之间换行。西文的逗号、句号和分号等标点后面应该…

二分查找 -- 力扣(LeetCode)第704题

题目 https://leetcode.cn/problems/binary-search/description/ 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例…

【毕业论文】酒店价格采集与可视化查询设计与实现开题报告2000字

酒店价格采集与可视化查询设计与实现开题报告 研究背景 随着互联网技术的飞速发展,人们获取信息的途径越来越多样化。特别是在旅游行业中,消费者对于酒店价格的透明度和实时性要求越来越高。美团、大众点评、抖音等平台作为信息聚合和分享的重要渠道&a…

SpringMVC框架简介

前言 现在由于功能以及业务的复杂性,大部分系统从技术上就拆分开为前后端分离,单体应用我都很少没接触了,导致现在对springMVC那套都忘记了很多东西,因此这篇文章在来回忆一下SpringMVC这个框架;很多时候因为业务的需…

SQL语言

一、DDL数据库定义语言 1、登录mySQL mysql -u"用户名" -p"密码" -h"登录地址 -h:默认为本机 示例: 2、查看当前存在的数据库 show databases; 示例: 3、创建数据库database create…

Jenkins (五) - Docker SonarQube

Jenkins (五) - Docker SonarQube Jenkins 集成 SonarQube,编译项目并通过SonarQube分析项目 前提 基于已有的环境 Jenkins (四) - Docker SonarQube 基于 Jenkins (三) - 拉取编译 上的mockito-demo工程 配置工程 Administration -> Projects -> Manage…

Java数据结构队列

队列(Queue) 概念 队列的使用 注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。 import java.util.LinkedList; import java.util.Queue;public class Test {public static void main(String[]…

使用GPT需要注意的事项

GPT出来之后,基本就告别浏览器搜索问题答案了。将问题原封不动的copy给GPT基本可以得到解答。 但是这个也有弊端,那就是太依赖GPT了。 1,使用GPT需要更强的专业知识:除了能问对问题,还要具备识别GPT&q…

VPDN(L2TP、PPTP)

1、虚拟专用拨号网络 远程接入VPN,客户端可以是PC机 技术:L2TP、PPTP 术语:LAC:L2TP的访问集中器 --- 提供用户的接入 LNS:L2TP的网络服务器 --- 提供L2TP服务的服务器 2、技术 1)PPTP 点对点隧道…

深入理解Java匿名内部类(day21)

在Java编程中,匿名内部类是一种非常有用的特性,它允许我们定义和实例化一个类的子类或实现一个接口,而无需给出子类的名称。这种特性使得代码更加简洁、紧凑,尤其适用于一些只使用一次的临时对象。本文将深入探讨Java匿名内部类的…

租用阿里云的服务器多少钱?30元、61元、99元、165元、199元

租个阿里云的服务器多少钱?很便宜,云服务器2核2G3M固定带宽99元一年、2核4G服务器30元3个月、199元一年,轻量应用服务器2核2G3M配置61元一年、2核4G4M带宽165元一年,可以在阿里云CLUB中心查看 aliyun.club 当前最新的优惠券和活动…

基于Socket简单的TCP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看:Linux操作系统入门 ⭐代码仓库:Linux代码仓库 ❤关注我一起讨论和学习Linux系统 TCP单例模式的多线程版本的英汉互译服务器 我们先来认识一下与udp服务器实现的不同的接口: TCP服务器端 socket()&…

基于单片机电子密码锁系统设计

**单片机设计介绍,基于单片机电子密码锁系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电子密码锁系统设计概要主要包括以下几个方面: 一、系统概述 基于单片机电子密码锁系统是一个…

打造你的专属云开发环境:支持任意 IDE,任意云服务 | 开源日报 No.215

loft-sh/devpod Stars: 6.9k License: MPL-2.0 devpod 是一个开源的、仅限客户端的、不受限制的工具,可以与任何集成开发环境(IDE)一起使用,并允许您在任何云端、Kubernetes 或本地 Docker 上进行开发。 使用 devcontainer.json…

贪心算法|45.跳跃游戏II

力扣题目链接 class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0;int curDistance 0; // 当前覆盖最远距离下标int ans 0; // 记录走的最大步数int nextDistance 0; // 下一步覆盖最远距离下标for (int i 0;…

qt-C++笔记之QLabel加载图片

qt-C笔记之QLabel加载图片 —— 2024-04-06 夜 code review! 文章目录 qt-C笔记之QLabel加载图片0.文件结构1.方法一&#xff1a;把图片放在项目路径下&#xff0c;在 .pro 文件中使用 DISTFILES添加图片文件1.1.运行1.2.qt_test.pro1.3.main.cpp 2.方法二&#xff1a;不在 .pr…

深入浅出 -- 系统架构之分布式集群的分类

一、单点故障问题 集群&#xff0c;相信诸位对这个概念并不陌生&#xff0c;集群已成为现时代中&#xff0c;保证服务高可用不可或缺的一种手段。 回想起初集中式部署的单体应用&#xff0c;因为只有一个节点&#xff0c;因此当该节点出现任意类型的故障&#xff08;网络、硬件…