线性模型lp.py lpmod.py lpmethod.py

文章介绍了如何使用Gurobipy库处理线性模型,包括读取、求解、检查模型状态(包括不可行或无界的处理),以及演示了不同的求解策略如单纯形法、并发方法。还涉及了Presolve和不可还原不一致子系统(IIS)的概念。
摘要由CSDN通过智能技术生成

线性模型

lp.py

#这个例子从文件中读取LP模型并解决它。如果模型不可行或无界,则示例关闭,presolve并再次求解模型。如果模型不可行,示例计算一个不可还原的不一致子系统(IIS),并将其写入文件
import sys
import gurobipy as gp
from gurobipy import GRB

if len(sys.argv)<2:
    print('Usage:lp.py filename')
    sys.exit(0)
#阅读并求解模型
model=gp.read(sys.argv[1])
model.optimize()
if model.Status==GRB.INF_OR_UNBD:#型号状态==GRB.INF_OR_UNBD
    #关闭presolve off以确定模型是否不可行或无界
    model.setParam(GRB.Param.Presolve,0)
    model.optimize()
if model.Status==GRB.OPTIMAL:#解的状态为最优解
    print('Optimal objective : %g' %model.ObjVal)
    model.write('medel.sol')
    sys.exit(0)
elif model.Status!=GRB.INFEASIBLE:#解的状态为不可行
    print('optimization was stopped with status %d' %model.Status)
    #上式翻译:优化已停止,状态为:
    sys.exit(0)
#模型是不可行的,有互相矛盾的条件存在,计算一个不可约的不一致子系统(IIS)
print('')
print('Model is infeasible')
model.computeIIS()
model.write("model.ilp")
print("IIS written to file 'model.ilp'")
#IIS是一种Web服务器软件,它可以在Windows操作系统上提供Web服务

在查询解决方案值前应始终检查解决方案状态

model . optimize ()
if model . Status == GRB . INF_OR_UNBD :#解的状态为不可行或无界
# 关闭Presolve以确定模型是否不可行或无界
    model . setParam ( GRB . Param . Presolve , 0)
    model . optimize ()
if model . Status == GRB . OPTIMAL :#解的状态为最优解
    print ('Optimal objective : %g' % model . ObjVal )
    model . write ('model .sol ')
    sys . exit (0)
elif model . Status != GRB . INFEASIBLE :#解的状态为不可行
    print (' Optimization was stopped with status %d' % model . Status )
    #上式翻译:优化已停止,状态为
    sys . exit (0)

解的状态可以分为三种:具有最优解,具有无界解以及无可行解

Presolve

Gurobi Class2笔记_sos约束_yeah_panda的博客-CSDN博客

lpmethod.py

import sys
import gurobipy as gp
from gurobipy import GRB
if len(sys.argv)<2:
    print('Usage:lpmethod.py filename')
    sys.exit(0)
#读模型
m=gp.read(sys.argv[1])
#用不同值的方法求解模型
bestTime=m.pams.timelimit
bestMethod=-1#赋初值
for i in range(3):
    m.reset()#重置
    m.params.method=i
    m.optimize()
    if m.Status==GRB:
        bestTime=m.Runtime
        bestMethod=i
        #减少TiimeLimit(设定时间)参数,以节省时间与其他方法
        m.Params.TimeLimit=bestTime
#Report which method was fastest
if bestMethod==-1:
    print('Unable to solve this model')
else:
    print('Solved in %g secomgs with Method %d' %(bestTime,bestMethod))

此处的range(3)表示的就是0(单纯形法)-3(并发)的求解Method

lpmod.py

#这个例子从一个文件中读取一个LP模型并求解它
# 如果模型可以求解,那么它找到最小的正变量,将其上界设置为0,
# 并以两种方式对模型进行解析,首先有高级开始,然后没有高级开始即从头开始
import sys
import gurobipy as gp
from gurobipy import GRB
if len(sys.argv)<2:
    print('Usage:lpmod.py filename')
    sys.exit(0)#正常退出
#读取模型并判断是否为LP模型
model=gp.read(sys.argv[1])
if model.IsMIP==1:
    print('The model is not a linear program')
    sys.exit(1)#非正常退出
model.optimize()
status=model.Status
if status==GRB.INF_OR_UNBD or status==GRB.INFEASIBLE or status==GRB.UNBOUNDED:
    print('The model cannot be solved because it is infeasible or unbounded')
    sys.exit(1)
if status!=GRB.OPTIMAL:
    print('Optimization was stopped with status %d' % status)
    sys.exit(0)
#找到最小变量值
minVal=GRB.INFINITY
for v in model.getVars():
    if v.X>0.0001 and v.X<minVal and v.LB==0.0:
        minVal=v.X#(最小函数值=v.X)
        minVar=v#(最小变量=v)
print('\n*** Setting %s from %g to zero ***\n' %(minVar.VarName, minVal))
minVar.UB=0.0#设置上限为0
#从这个起点模型求解
model.optimize()
#节省迭代和时间信息
warmCount=model.IterCount
warmTime=model.Runtime
#重置模型并解析
print('\n*** Resetting and solving without an advanced start ***\n')
model.reset()
model.optimize()
coldCount=model.IterCount
coldTime=model.Runtime
print('')
print('***Warm start:%g iterations, %g seconds'%(warmCount,warmTime))#iteration:迭代次数
print('***Cold start:%g iterations, %g seconds'%(coldCount,coldTime))

sys.exit()函数

sys.exit()函数可以用于在程序执行过程中强制退出程序,会结束整个程序。

sys.exit()函数可以接受一个整数参数用于指定程序终止时的退出码。通常情况下,退出码为0表示程序正常退出,其他数值表示程序异常退出。

蓝色部分不计,橙色部分为第一个参数

从第一个参数开始遍历

下图的sys.argv即为绿色部分+紫色部分

绿色部分不计为参数,而紫色部分计。

总结

sys.argv[]是一个列表
sys.argv[0]是被调用的脚本文件名或全路径
sys.argv[1:]之后的元素就是我们从程序外部输入的,而非代码本身的,想要看到它的效果,就要将程序保存,从外部运行程序并给参数,这也是我们在cmd里面运行的原因。

Python 中 sys.argv 用法详解_ys.journey的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值