运筹系列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、支持大样文件打印
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值