运筹系列76:mps文件的读取与展示

本文详细介绍了MPS文件规则,通过实例展示如何构造一个数学规划问题的MPS文件,并使用pysmps库解析该文件,展示了目标函数、约束条件和变量边界等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. mps文件规则

通过一个例子来认识:
max x1 + 2 x2 + 3 x3 + x4
s.t. − x1 + x2 + x3 + 10 x4 ≤ 20
x1 − 3 x2 + x3 ≤ 30
x2 - 3.5 x4 = 0
0 ≤ x1 ≤ 40,x2 ≥ 0,x3 ≥ 0,2 ≤ x4 ≤3

对应的mps文件为:

NAME       MindOptExample  #NAME表示这个优化模型的名字,可不写内容
ROWS        #ROWS定义各行名字,包括目标函数与约束条件
 N  obj       #N表示自由行,obj是对目标函数的命名,可任意取名
 L  c1          #L表示该行小于等于, c1是对该行的命名,可任意取名
 L  c2      
 E  c3          #E表示该行等于
COLUMNS  #COLUMS定义各列名字
    x1               obj                 -1   c1                  -1
    x1                c2                   1  
    x2                obj                 -2   c1                   1
    x2                c2                  -3   c3                   1
    x3                obj                 -3   c1                   1
    x3                c2                   1    
    MARK0000  'MARKER'             'INTORG'
    x4                obj                 -1   c1                  10
    x4                c3                -3.5
    MARK0001  'MARKER'             'INTEND'
RHS  #RHS定义约束条件等号右边的值
    rhs               c1                  20   c2                  30   	            
BOUNDS  #BOUNDS定义决策变量的上界或下界
 UP bnd       x1                  40  #UP 表示上界
 LO bnd       x4                   2  #LO 表示下界
 UP bnd       x4                   3
ENDATA   #ENDATA表示MPS文件结束

2. 文件解析

使用pysmps解析文件,例如上面的例子的结果是:
在这里插入图片描述
前四行是命名行,分别是:项目名、目标函数名、行名(约束条件名)、列名(变量名)
接下来两行是变量类型和约束条件类型
接下来两行是目标函数和约束条件的参数
接下来两行是rhs列表和rhs对应的值
接下来两行是bound列表和bound对应的值
解析函数为:

import re
import numpy as np
from pysmps import smps_loader as smps


def displayMps(file_path, dis_name = True, dis_bound = True, dis_integral = True):
    m = smps.load_mps(file_path)
    # variable names
    obj_type = 'Min '
    ss = []
    xs = [symbols('%s_{%s}' % tuple(re.split('(\d+)', v)[:2])) for v in  m[3]]

    # objective
    cons = m[6]
    if np.all(m[6]<=0):
        obj_type = 'Max '
        cons = -m[6]
    obj = simplify(sum(xs*cons))
    ss.append(Math(latex(dis_name*('%s: '%m[1]))+latex(obj_type)+latex(obj)))

    # constraints
    rhs = list(m[9].values())[0]
    for i in range(len(m[2])):
        if m[5][i]=='L':
            eq = simplify(sum(xs*m[7][i])) <= rhs[i]
        elif m[5][i]=='G':
            eq = simplify(sum(xs*m[7][i])) >= rhs[i]
        elif m[5][i]=='E':
            eq = Eq(simplify(sum(xs*m[7][i])), rhs[i])
        ss.append(Math(latex(dis_name*('%s: '%m[2][i]))+latex(eq)))

    # bounds
    if dis_bound:
        bnd_list = []
        bnd=list(m[11].values())[0]
        for j in range(len(m[3])):
            if bnd['LO'][j]>0:
                eq = xs[j] >= bnd['LO'][j]
                bnd_list.append(latex(eq))
            if bnd['UP'][j]!=np.inf:
                eq = xs[j] <= bnd['UP'][j]
                bnd_list.append(latex(eq))
        ss.append(Math(','.join(bnd_list)))

    # integral
    if dis_integral:
        ids = np.where(np.array(m[4])=='integral')[0]
        if len(ids)>0:
            ss.append(Math('{'+','.join([latex(v) for v in list(np.array(xs)[ids])])+'}\in  Z'))
    
    for s in ss:
        display(s)
        
    return "NAME:%s, ROWS:%d, COLUMNS:%d" % (m[0], len(m[1]),len(m[2]))

displayMps('../CLionProjects/test2/1.mps')

解析结果如下:
在这里插入图片描述

一、功能简介 《大样文件阅读器》是北大方正或潍坊华光电子出版系统的大样文件(又称为二扫文件)的浏览软件。本软件不需要任何硬件支持,便可在中文MS-Windows9X、WindowsNT、Win2000和WindowsXP环境下显示和打印二扫文件。 本软件适用于以下用户: 1、任何使用方正系统排版的个人。特别适合于科研工作者将自己著述的二扫文件直接放在Internet上进行交流。 2、国家机关和公司。既可以使用二扫文件作为电子公文、电子文档的标准格式进行局域网络上的传递或者在Internet上对外发布,又可以将二扫文件建成全文数据库系统或者刻制CDROM,使用本软件进行二扫文件的浏览打印。 3、出版社、杂志社、报社。使用本软件实现电子出版和网络出版,尤其适用于科技书籍和期刊杂志的电子出版和网络出版。 二、主要特性 1、良好的平台无关性 《大样文件阅读器》是一个完全独立的应用程序,不需要外挂任何软硬件产品,Windows系列操作系统具有良好的兼容性。由于它的独特设计,完全可以兼容未来的Windows系统。随着操作系统发展日新月异,我们的所有产品将会兼容其它操作系统,例如Linux。 2、完备的文件格式兼容性 《大样文件阅读器》不仅可以阅读老的方正二扫文件,如PS2、S72、S2,而且能阅读最新的大样文件格式:MPS和S92。 3、支持图片显示 《大样文件阅读器》能支持JPG、GIF、BMP、TIF、PCD、PBM、TAG、PNG、PCX等图形文件格式。 4、方便的浏览设计 《大样文件阅读器》提供了方便快捷的操作设计。下面是每一种操作及其对应的快捷键。 5、独特的文本选择模式 《大样文件阅读器》为用户提供了方便的文本选择模式设计,系统分为“拖拽模式”和“选择模式”。 6、文本导出功能 选择“文件”菜单的“另存为”子菜单,可以将当前大样文件导出为文本文件。 7、完全支持GBK标准汉字和图形符号 《大样文件阅读器》完全支持GBK的标准汉字和符号,GBK标准定义的21008个汉字以及1038个符号在《大样文件阅读器》中都能显示和打印。 8、支持方正字库   《大样文件阅读器》不带任何字库,但它提供了两种显示字体方案。 如果你的系统中安装了方正字库,你可以在“设置”菜单的“显示字体方案”中选择使用“方正字库”,此时所有字体均使用方正字库显示和打印。 如果你的系统中没有安装了方正字库,你可以在“设置”菜单的“显示字体方案”中选择使用“系统字库”,此时文件使用的所有字体均会使用系统中的相似字体显示和打印。 9、支持大样文件打印
### 使用杉树求解器创建 MPS 文件时出现错误的原因分析 当使用杉树求解器生成 MPS 文件并遇到 `Process finished with exit code -1073740791 (0xC0000409)` 错误时,这通常表示程序遇到了严重的内存访问冲突或非法操作。此类问题可能由多种原因引起: #### 1. 内存管理不当 如果应用程序尝试访问未分配或已释放的内存空间,则可能会触发此异常。确保所有动态分配的对象在其生命周期内被正确初始化和销毁。 #### 2. 数据结构损坏 在构建复杂的数学模型过程中,任何对内部数据结构(如矩阵、向量等)的操作都应遵循严格的规范。一旦这些对象遭到破坏,就可能导致不可预测的行为甚至崩溃[^1]。 #### 3. 软件版本兼容性 不同版本之间的API变更也可能引发类似的致命错误。建议确认所使用的库及其依赖项均为最新稳定版,并相互匹配良好。 #### 解决方案 针对上述潜在因素,可以采取以下措施来排查和修复该问题: - **验证输入数据的有效性和一致性**:仔细检查用于定义线性规划(LP) 或混合整数规划(MIP) 的各项系数以及约束条件是否合理合法; - **更新至最新的SDK和服务包**:获取官方发布的最新补丁以消除已知漏洞; - **启用调试模式运行环境变量配置**:通过设置特定标志位让程序抛出更详细的诊断信息以便定位具体位置; - **简化测试案例逐步增加复杂度**:先从最基础的情形做起,在每一步成功后再加入新的要素直至重现原场景为止。 ```python from coptpy import Model, readModel try: model = readModel('diet.mps') except Exception as e: print(f"Error reading MPS file: {e}") else: try: # 设置时间限制和其他必要参数 model.setParam("TimeLimit", 10) # 开始优化过程 status = model.optimize() if status == Model.OPTIMAL or status == Model.INTERRUPTED: solution_file = 'solution.txt' model.writeSolution(solution_file) print(f'Solution written to {solution_file}') else: print('Optimization failed.') except RuntimeError as re: print(f'Runtime error during optimization: {re}') finally: del model # 显式删除model实例以确保资源回收 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值