You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matlab中调用Google OR-Tools的Glop线性优化求解器?

解决方案:Matlab调用Glop求解线性规划

一、Matlab调用Python的Glop求解器

Glop没有官方Matlab接口,最可行的方式是通过Matlab的Python交互功能,将Matlab矩阵传递给Python脚本完成求解,同时解决格式转换问题。

1. 配置Matlab的Python环境

  • 在Matlab中执行pyenv查看当前关联的Python版本
  • 若需切换,使用pyenv('Version','你的Python安装路径')指定已安装ortools的环境
  • 在对应Python环境下执行pip install ortools安装依赖

2. 编写Python封装函数(批量处理约束)

以下函数可直接接收Matlab传递的矩阵(自动转为NumPy数组),批量添加约束无需逐个输入:

from ortools.linear_solver import pywraplp

def solve_lp(c, A, b, sense, lb, ub):
    # sense: 约束符号数组,元素为'<=', '=', '>='
    solver = pywraplp.Solver.CreateSolver('GLOP')
    if not solver:
        return None, None
    
    # 创建变量
    n_vars = len(c)
    variables = [solver.NumVar(lb[i], ub[i], f'x{i}') for i in range(n_vars)]
    
    # 批量添加约束
    n_cons = len(b)
    for i in range(n_cons):
        expr = solver.Sum(A[i][j] * variables[j] for j in range(n_vars))
        if sense[i] == '<=':
            solver.Add(expr <= b[i])
        elif sense[i] == '=':
            solver.Add(expr == b[i])
        elif sense[i] == '>=':
            solver.Add(expr >= b[i])
    
    # 设置最小化目标函数(与linprog默认逻辑一致)
    objective = solver.Sum(c[j] * variables[j] for j in range(n_vars))
    solver.Minimize(objective)
    
    # 求解并返回结果
    status = solver.Solve()
    if status == pywraplp.Solver.OPTIMAL:
        x_opt = [variables[j].solution_value() for j in range(n_vars)]
        f_opt = solver.Objective().Value()
        return x_opt, f_opt
    else:
        return None, None

3. Matlab端调用代码

直接复用你已构建好的矩阵参数,调用上述Python函数:

% 示例LP参数(与linprog格式完全兼容)
c = [-1; -2]; % 目标权重(最小化)
A = [1 4; 2 3; 2 1]; % 约束矩阵
b = [1700; 1500; 1000]; % 约束右端项
sense = {'<=', '<=', '<='}; % 约束符号
lb = [0; 0]; % 变量下界
ub = [inf; inf]; % 变量上界

% 关联Python脚本路径
py.sys.path.append(pwd);
% 调用求解函数
[x_opt, f_opt] = py.solve_lp(c, A, b, sense, lb, ub);

% 转换为Matlab格式输出
x_opt = double(x_opt);
f_opt = double(f_opt);

disp('最优解:');
disp(x_opt);
disp('最优目标值:');
disp(f_opt);

二、替代方案:Matlab原生兼容的开源求解器

若不想依赖Python交互,可直接使用与Matlab格式无缝兼容的开源LP求解器:

  • CLP(COIN-OR Linear Programming):通过Matlab的coinor-clp接口安装使用,输入格式与linprog完全一致,无需额外转换
  • CVX:建模框架,支持配置Glop作为后端求解器,可直接接收Matlab矩阵参数

三、关于Glop的批量约束输入说明

Glop的Python接口确实没有直接接收矩阵A和b的方法,但通过循环遍历矩阵行添加约束的开销极小,对于常规规模的LP问题几乎可以忽略,无需担心效率问题。


内容的提问来源于stack exchange,提问作者user24707743

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:31:14