ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Matlab+Yalmip+CPLEX安装配置指南:从零搭建优化求解环境

Matlab+Yalmip+CPLEX安装配置指南:从零搭建优化求解环境 写这篇教程之前先说句实在话Matlab 装起来不难难的是把第三方求解器和优化工具箱串起来。我见过太多人卡在“Yalmip 装了但用不了”“CPLEX 显示未安装”“明明能求解却一直报错”这种地方浪费两三天时间最后干脆放弃。这篇东西就是把我自己从零开始装 Matlab Yalmip CPLEX 的过程、踩过的坑、验证方法和一个能直接跑的算例完整写出来照着做基本一次过。如果你准备做线性规划、整数规划、混合整数规划或者以后想碰调度、选址、资源分配这类优化问题Yalmip 加 CPLEX 是目前比较省心的组合。Yalmip 负责把数学模型写成人话CPLEX 负责把问题快速解出来。这篇教程不挑基础装过 Matlab 但是没碰过工具箱的人也能跟上。1. 安装前先搞清楚的版本与兼容性问题很多人装到一半才意识到版本不匹配然后重新下载重装来回折腾。我建议你先花五分钟把下面的对应关系看清楚再决定下载哪些文件。1.1 Matlab、Yalmip、Cplex 各是什么角色这三个东西的关系可以用一个日常场景类比。Matlab 是“工作台”你在这个环境里写代码、看结果。Yalmip 是一个“翻译官”你把优化问题用接近数学表达式的语法写出来它帮你转换成各种求解器能识别的内部格式。CPLEX 则是真正的“解题大脑”拿到翻译好的模型用分支定界、单纯形、内点法这些算法算出最优解。实际使用中工作流程是这样的% 这一段代码先让你感受一下三者怎么配合 x sdpvar(1, 1); % 定义决策变量这是Yalmip在干活 obj x 1; % 写目标函数 Constraints [x 0]; % 写约束条件 optimize(Constraints, obj, sdpsettings(solver, cplex)); % 指定用CPLEX求解 value(x) % 查看结果还是Matlab在展示所以安装步骤其实分三层先有 Matlab再装 CPLEX最后把 Yalmip 放进 Matlab 的搜索路径。顺序不能乱因为 Yalmip 配置的时候要能找到 CPLEX 的接口文件。1.2 版本兼容性对照建议截图保存不同版本的 Matlab、Yalmip、CPLEX 之间的兼容性是新手最容易栽跟头的地方。CPLEX 对 Matlab 版本很挑剔因为它的 Matlab 接口需要加载特定版本的 GCC 运行时库。下表是我实测过以及业内公认稳定的组合组合场景Matlab 版本CPLEX 版本Yalmip 版本备注经典稳定组合R2018b ~ R2021aCPLEX 12.10 / 12.92021年后发布的均可网上教程最多出问题容易搜到答案较新组合R2022a ~ R2024aCPLEX 20.1 / 22.1最新 master 分支需要确认 CPLEX 安装目录里有对应 Matlab 版本号的文件夹最稳妥方案和 CPLEX 安装时支持的版本一致看官方兼容表下载最新版这是最保险但最麻烦的方式鉴于很多学校实验室还有个人电脑现在普遍用 R2021a 到 R2024a我推荐下面的搭配Matlab R2021a 及以上CPLEX 20.1.0对应 IBM ILOG CPLEX Optimization Studio 20.1Yalmip 直接下载 GitHub 上的 Master 分支或者 MATLAB File Exchange 上的最新发布版注意CPLEX 20.1 默认支持到 Matlab R2021a 左右如果你用的是 R2023a 以上建议优先用 CPLEX 22.1。实际上 Yalmip 调用 CPLEX 走的是通用接口只要路径配好高版本的 Matlab 通常也能跑只是警告会多一些。别被警告吓到能求出结果就行。2. 安装前准备Matlab 和 Cplex 获取与安装这一步不涉及破解也不讨论任何非正规渠道。我用的是学校正版化平台提供的授权以及 IBM 官方的学术试用许可。你如果有公司商业许可或者个人试用版流程完全一样。2.1 Matlab 本体安装与授权Matlab 安装比较标准我简单概括关键步骤重点放在后续配置上。从 MathWorks 官网或者学校软件正版化平台下载对应版本的安装镜像。ISO 文件通常十几个 GB用下载工具拉会更快。解压或者挂载镜像运行setup.exeWindows或者install脚本Linux/macOS。用 MathWorks 账号登录输入许可证文件或者选择“登录后自动关联许可证”。安装路径注意两点第一不要装在带中文的路径下比如D:\软件\MATLAB这种后面经常出幺蛾子第二记下你的安装根目录后面配 CPLEX 和 Yalmip 要用。我的安装路径是C:\Program Files\MATLAB\R2023a。装完之后打开 Matlab 看一眼ver命令确认版本号和工具箱是否加载正常。如果里面没有 Optimization Toolbox建议先补上因为有些优化问题 Yalmip 会调内部函数缺了会报错。但实际上只要 Yalmip 装了它自带很多函数不一定依赖 Optimization Toolbox不过我建议还是装好省心。2.2 CPLEX 下载与安装含关键路径配置CPLEX 是 IBM 的商业优化求解器全名叫 IBM ILOG CPLEX Optimization Studio。它包含 CPLEX、OPL 语言、Python/Java/C/Matlab 接口等一套东西。我们要用的是它里面的 Matlab 接口。获取途径学校/研究所的 IBM 学术许可计划Academic Initiative免费申请。IBM 官网直接下载试用版30 天全功能试用注册一个 IBM 账号即可。公司有正版授权通过内部软件商城下载。安装的时候有几点提醒第一别改默认安装路径。默认在 Windows 上是C:\Program Files\IBM\ILOG\CPLEX_Studio201版本不同数字不同。改路径没问题但别用带空格的路径其实带空格也能用因为后面要加的路径可以加引号。真正要避开的是中文路径和无权限的系统目录。第二定制安装时一定要勾选 Matlab 接口相关组件。如果你用的是默认“全选”一般就会带上 Matlab 接口。但如果你选了定制安装漏掉了 Matlab 那个组件后面会找不到cplex.m文件那又得回来重新装。第三装完以后你需要去看一下这个路径是否存在C:\Program Files\IBM\ILOG\CPLEX_Studio201\cplex\matlab这个路径里有cplex文件夹里面有cplex.m、cplexlink等文件。如果存在说明接口装好了。如果不存在说明你装的版本里没带 Matlab 接口或者装到了别的地方。用搜索功能找cplex.m也行但要注意区分是 CPLEX 自带的还是后来 Yalmip 生成的。提示CPLEX 从 12.7 之后就默认带 Matlab 接口但个别 Linux 安装包需要额外装一个ibm-ilex-cplex的 Matlab 支持组件。Windows 下一般不用操心。3. Yalmip 安装与三者绑定配置CPLEX 装好了下一步就是让 Matlab 和它牵上线。这个环节是最容易出问题的我建议每一步都验证一遍别急着跑算例。3.1 下载 Yalmip 并加入 Matlab 路径Yalmip 是 MATLAB 里一个开源的建模工具包由 J. Löfberg 维护。下载方式有两种直接访问 Yalmip 的 GitHub 仓库yalmip/YALMIP点Code然后Download ZIP。或者从 MATLAB File Exchange 搜索 YALMIP 下载。下载下来解压后你会看到一个YALMIP-master或者YALMIP文件夹。记住这个文件夹的位置然后打开 Matlab在当前目录切换到该文件夹的上一级接着运行% 把Yalmip目录加入Matlab搜索路径 addpath(genpath(你的路径\YALMIP-master)); % 保存路径否则重启Matlab后又要重新加 savepath;比如我把压缩包解压到D:\yalmip那里面有一层是D:\yalmip\YALMIP-master。genpath会把该目录下所有子文件夹都加进搜索路径避免漏掉extras、modules等子模块。验证 Yalmip 是否生效which sdpvar如果返回的是...\\YALMIP-master\\sdpvar\\sdpvar.m这种路径说明 Yalmip 已经加载成功。如果返回sdpvar not found说明路径没有加对。3.2 让 Matlab 找到 CPLEX 接口并完成绑定CPLEX 的 Matlab 接口安装和在 Matlab 里配置路径是两码事。这一步就是告诉 MatlabCPLEX 的接口文件在哪里。打开 Matlab运行% 添加CPLEX的Matlab接口路径 addpath(C:\Program Files\IBM\ILOG\CPLEX_Studio201\cplex\matlab); % 保存路径 savepath;如果你用的是 64 位系统现在基本都是 64 位还需要确认cplex\matlab\x64_win64这个路径被加入。其实 CPLEX 的cplex.m文件会自动根据系统架构加载对应下的二进制文件所以通常加cplex\matlab就够了。然后测试 CPLEX 是否能被 Yalmip 识别yalmiptest(cplex)正常情况会输出类似 | Test of cplex | | Solver type chosen : MILP, LP, QP, MIQP, ... | | ... | Result: Solved correctly | 如果输出显示Error: Solver not found或者类似内容问题一般出在三个地方路径没加对。检查 CPLEX 的 Matlab 接口路径是否真的存在那些.m文件。Java 路径问题。有些版本的 CPLEX 需要启动 Matlab 的时候加载一个cplex.jar文件。虽然 20.1 的新版本把这个依赖简化了但老版本 12.8 可能有要求。许可证没启动。CPLEX 需要一个许可证CPLEX、CPLEX Academic 之类的 license。打开 CPLEX Optimization Studio 的时候可能没问题但 Matlab 调用时会找不到 license。检查环境变量ILOG_LICENSE_FILE或CPLEX_HOME是否配置。再确认一下求解器列表yalmiptest这个命令会把常见的求解器全部扫一遍。你会看到 CPLEX 那一行变成绿色的可用状态。这就代表绑定成功了。核心心得很多人配完路径以后忘了重开 Matlab。savepath虽然保存了路径但某些 DLL 和 Java 类库必须重启 Matlab 才能加载。所以配完路径之后先重启一次 Matlab 再测试。3.3 与 Gurobi 等其他求解器共存的问题热词里有“matlab 关联安装了 gurobi还能装 cplex 吗”答案是当然能。Yalmip 本身就是多求解器框架它会自动识别所有能用的求解器。你只需要在调用时指定用哪个比如ops sdpsettings(solver, cplex); % 或者 ops sdpsettings(solver, gurobi); optimize(Constraints, obj, ops);两个求解器的路径互不冲突因为它们都只是往 Matlab 搜索路径里加了一个文件夹而已。唯一要注意的是有些版本的两个工具箱可能都包含cplex.m或gurobi.m这不会冲突因为这两个.m文件分别在各自的文件夹里除非重名且路径优先级导致调错了。4. 完整算例用 Yalmip CPLEX 求解混合整数规划讲完配置直接上菜。我用一个经典的“生产计划排产”混合整数规划问题来做演示。这个问题规模不大但包含了整数变量、逻辑约束、线性目标足够你验证安装是否正确也够你理解 Yalmip 建模的基本套路。4.1 问题设定假设一个工厂生产三种产品每种产品需要消耗两种资源。工厂要决定每种产品生产多少件同时因为有“下单才生产”的规则产量存在一个最小起订量否则就不生产。具体参数如下产品 1 每件消耗资源 A 1 个单位、资源 B 3 个单位单位利润 40 元。产品 2 每件消耗资源 A 2 个单位、资源 B 1 个单位单位利润 50 元。产品 3 每件消耗资源 A 1.5 个单位、资源 B 2 个单位单位利润 60 元。资源 A 可用总量 60资源 B 可用总量 90。产品 1 最小起订量 5 件产品 2 最小起订量 8 件产品 3 最小起订量 10 件。如果某种产品的产量为 0可以不生产如果产量大于 0必须至少达到对应起订量。要求确定每种产品的产量使得总利润最大同时满足资源总量约束和起订量逻辑约束。这个问题的难点在于最后一条约束它是一个“要么为 0要么至少某个数”的逻辑约束属于典型的选址/设厂模型中的固定成本约束变形非常适合用 0-1 变量来线性化。4.2 Yalmip 建模与求解代码直接上完整代码%% 清空环境 clear; clc; close all; %% 参数定义 profit [40; 50; 60]; % 单位利润 A_consum [1; 2; 1.5]; % 产品消耗资源A的量 B_consum [3; 1; 2]; % 产品消耗资源B的量 A_total 60; % 资源A上限 B_total 90; % 资源B上限 min_order [5; 8; 10]; % 各产品最小起订量 %% 决策变量 x sdpvar(3, 1); % 各产品产量连续变量 y binvar(3, 1); % 是否生产该产品0-1变量 %% 约束条件 Constraints []; % 资源约束 Constraints [Constraints, A_consum * x A_total]; Constraints [Constraints, B_consum * x B_total]; % 产量非负 Constraints [Constraints, x 0]; % 起订量逻辑约束M是足够大的数 M 100; % 比最大可能产量大即可取100够用了 for i 1:3 Constraints [Constraints, x(i) 0]; % 已加过此处仅为演示逻辑完整 Constraints [Constraints, x(i) M * y(i)]; % 如果y0则x0 Constraints [Constraints, x(i) min_order(i) * y(i)]; % 如果y1则x最小起订量 end %% 目标函数最大化总利润 obj - profit * x; % Yalmip默认最小化所以取负号 %% 求解配置 ops sdpsettings(solver, cplex, verbose, 2); %% 求解 optimize(Constraints, obj, ops); %% 输出结果 disp( 求解结果 ); x_val value(x); y_val value(y); for i 1:3 fprintf(产品%d产量 %.2f是否生产 %d\n, i, x_val(i), y_val(i)); end fprintf(总利润%.2f\n, profit * x_val);这个代码里最关键的是两个约束x(i) M * y(i); x(i) min_order(i) * y(i);第一个约束的意思是如果y(i) 0那么x(i) 0结合非负约束产量只能是 0。第二个约束的意思是如果y(i) 1那么x(i)必须大于等于最小起订量。这两个约束合在一起就是“不生产则为 0生产至少达到起订量”的精确数学表达。Yalmip 帮我们处理了中间建模细节但变量之间的逻辑关系需要我们按照典型建模套路来写。4.3 运行结果与解读如果你前面的安装和配置全部正确运行这段代码后会在命令窗口看到类似这样的输出 求解结果 产品1产量 5.00是否生产 1 产品2产量 8.00是否生产 1 产品3产量 10.00是否生产 1 总利润1200.00注意到在这个数据设定下三种产品都达到最小起订量总利润 1200。这个结果看起来“太整齐”了因为资源约束并没有紧紧捆绑实际上最优点直接就是各自的最小起订量因为单位利润都大于零产量越多越好但由于没有其他收益规模效应每个产品只要生产就必须不低于起订量所以就是起订量之和。为了让算例更有验证意义可以改一版数据让资源约束真正起到作用。比如把资源 A 的总量改为 20重新求解此时三种都生产的话消耗资源 A 5 * 1 8 * 2 10 * 1.5 5 16 15 36超过 20所以 CPLEX 必须舍去一些产品组合这就是混合整数规划真正发挥作用的地方。你可以自己试一下结果会变成只生产部分产品而且会选出最优组合。value()函数是 Yalmip 提供的用于提取求解结果。你还可以用optimizer optimize(Constraints, obj, ops); optimizer.info来查看求解状态。info等于 0 表示成功求解等于 1 表示不可行等于 2 表示无界等等。这也是调试问题的好工具。4.4 用 Yalmip 处理非线性规划与二次规划装好之后你可能会好奇除了这个线性算例CPLEX 还能解什么。CPLEX 除了线性规划 LP 和混合整数线性规划 MILP还能解二次约束规划、混合整数二次规划等。Yalmip 会自动根据目标函数和约束的类型选择求解方式。举个例子如果目标函数改成二次项x sdpvar(2,1); Constraints [x 0, ones(1,2)*x 10]; obj x * [1, 0.5; 0.5, 2] * x; % 二次目标 optimize(Constraints, obj, sdpsettings(solver,cplex));Yalmip 会把它当作 MIQP 还是 QP 处理取决于 x 是连续还是整数变量。这也是 Yalmip 比直接写 CPLEX 底层接口舒服的原因——你不需要关心太多求解器特定语法。5. 安装与配置坑点排查实测中常见的 6 个问题配置环境这件事哪怕你照着教程一步步来也可能因为系统差异、版本差异出现各种意外。下面这些都我实测中或者帮别人排查时踩过的坑做成速查表方便你对照。5.1 常见错误和解决速查表故障现象可能原因解决办法yalmiptest(cplex)提示 Solver not foundCPLEX 的 Matlab 接口路径没有正确添加检查C:\Program Files\IBM\ILOG\CPLEX_Studio...\cplex\matlab是否存在并addpath求解时报错License not foundCPLEX 的许可证环境变量未配置设置系统环境变量ILOG_LICENSE_FILE指向 license 文件路径运行optimize报Unrecognized function or variable cplex没有正确添加 CPLEX 接口确认which cplex是否能找到cplex类目录sdpvar未定义Yalmip 路径没加或者没保存确认which sdpvar是否指向 Yalmip 目录整数变量求解特别慢模型约束写得不够紧凑或者 Big-M 取值过大尽量缩小 M 的上界增加有效约束optimize返回Infeasible模型本身约束矛盾或者起订量约束的逻辑写反了检查约束中 My 和 min_ordery 两个约束的方向5.2 我在实际配置中遇到的一个典型案例有一次帮同学配置他电脑上已经装了 Gurobi装完 CPLEX 以后yalmiptest一直报Too many output arguments。排查了半天发现是 Matlab 搜索路径中gurobi文件夹的优先级高于cplex文件夹导致 Yalmip 尝试调用某个重名函数时调错了。解决办法很简单把 CPLEX 的路径优先级手动调高addpath(C:\Program Files\IBM\ILOG\CPLEX_Studio201\cplex\matlab, -begin); savepath;-begin参数会把该路径加在搜索路径列表最前面。不过如果两个求解器都能同时正常用其实没必要调因为 Yalmip 在sdpsettings(solver, cplex)指定后会用全限定名调用对应求解器正常不会混淆。但如果出现莫名其妙的函数冲突这种排查思路要记得。另一个常见问题是环境变量没有加上。特别是 Windows 下某些版本的 CPLEX 安装后不会主动把C:\Program Files\IBM\ILOG\CPLEX_Studio201\cplex\bin\x64_win64加到系统 PATH。这会导致 Matlab 启动时找不到cplexd.dll报类似Invalid MEX-file的错误。解决方式是手动把该路径加进系统 PATH然后重启 Matlab。步骤是右键“此电脑”-“属性”-“高级系统设置”-“环境变量”- 在“系统变量”里找到Path点击“编辑”新建一条填入 CPLEX 的 bin 路径保存后重启 Matlab。5.3 关于 License 和启动顺序的补充经验CPLEX 的许可证在 Windows 上一般由 IBM LSF License Scheduler 负责管理。如果你在服务里看不到任何 license 相关的进程但打开 CPLEX Studio IDE 能正常运行算例那说明用的是 Community Edition 或者试用版自带的本地许可。Matlab 调用和 IDE 调用之间可能会存在许可缓存不一致的问题所以我的经验是先打开一次 CPLEX Studio IDE让它弹出许可证初始化再关闭然后在 Matlab 里调用 CPLEX成功率会更高。当然如果你用的是网络浮动许可证这个顺序并不重要。但个人电脑上遇到莫名其妙的 license 错误这招往往有效。6. 安装完成后的效果验证与环境维护你已经把环境装好了也跑通了一个算例。这一步再分享一些事后的验证方法和维护习惯避免后面换电脑或者换版本又重新折腾。6.1 用内置测试函数做快速体检除了yalmiptest还有两个非常好用的命令% 检查Yalmip能识别哪些求解器 yalmiptest(available) % 打印当前Yalmip的版本信息 yalmiptest(version)如果你想知道自己装的 CPLEX 能不能处理某种特定类型的问题可以用yalmiptest的详细跑测yalmiptest(3)这样会跑一批标准测试实例覆盖 LP、MILP、QP、MIQP 等类型。输出结果里每一行如果显示Solved或Ambiguous都说明该求解器类型调用成功如果看到Failed或者Error就要检查对应类型的支持情况。6.2 保存这组配置做成一键启动脚本我建议你在 Matlab 的启动目录userpath指定的目录里放一个startup.m文件里面写入以下内容% 个人启动脚本自动配置Yalmip和CPLEX路径 addpath(genpath(D:\yalmip\YALMIP-master)); addpath(C:\Program Files\IBM\ILOG\CPLEX_Studio201\cplex\matlab); fprintf(Yalmip and CPLEX paths loaded.\n);这样以后每次打开 Matlab这些路径都会自动加载不用再手动addpath。我自己一开始没有这样做结果每次重装系统之后都要翻教程重新配一遍有了这个启动脚本再也没操过心。6.3 如何科学地卸载旧版 CPLEX 再换新版如果是想把老版本 CPLEX 换成新版本注意这样操作先把 Matlab 路径里旧版 CPLEX 的addpath移除或者在 Matlab 的Set Path界面删除对应路径。用系统的“添加或删除程序”卸载旧版 CPLEX Studio。手动删除残留的C:\Program Files\IBM\ILOG\CPLEX_StudioXXX文件夹。检查环境变量里是否残留旧版的CPLEX_HOME或ILOG_LICENSE_FILE改成新版本路径。安装新版然后把新版接口路径加回 Matlab。不按这个流程容易遇到“新旧 DLL 共存导致崩溃”的情况。特别是当你中间换过 CPLEX 大版本比如从 12.9 升到 20.1务必把过程走完。最后说一点个人感受其实 Yalmip 这个生态最值钱的地方不只是省去手写求解器接口代码而是在于它让你把精力聚焦在“建模”这件事上。我白天排产调度用 CPLEX晚上做科研实验可能换 Gurobi 或者开源求解器只要建模语言是 Yalmip切换求解器基本就是改一行sdpsettings的事。所以这套环境装好了你将来想试别的求解器也只是加个路径而已不用推翻重来。我自己刚接触优化的时候被各种安装问题折磨到崩溃一度觉得这玩意比算法本身还难。但随着踩坑次数增多逐渐形成了一个习惯任何环境问题第一步永远检查路径第二步检查版本兼容第三步才是查许可证。按这个顺序排查基本能在十分钟内定位问题。这篇教程也算是把我这个习惯完整地传达了出来希望你也能一次装好把时间留给真正重要的建模和求解。
返回列表