mosek使用记录

mosek

需求

求解mixed-integer problem

Introduction

优秀的数学优化求解器

官方网址:https://www.mosek.com/
其中,重要说明:

  1. 认证文件下载:https://docs.mosek.com/9.3/licensing/quickstart.html#i-don-t-have-a-license-file-yet
    按照要求放在指定的文件夹位置。python正常方法按照mosek包即可使用
  2. https://www.mosek.com/documentation/
    有比较比较多的使用说明,主要是两个API文档FusionAPIOptimizerAPI,一个是面向对象的一个是面向过程的用法,fusion更直观好用。尾页有一cookbook也可以更深入了解模型理论
    使用求解器首先要自己完成建模过程,分清楚三个要素:variable、constraint、cost

Study

FusionAPI整数线性规划的例题
例题

from mosek.fusion import *
def main(args):
    # constraint的系数,每行指代一个不等式
	A = [[50.0, 31.0],
		 [3.0, -2.0]]
	# cost的系数
	c = [1.0, 0.64]
	with Model('milo1') as M:
		# 1.设置变量,名称x,数量为2,限制为非负整数。greaterThan和lessThan都是包含了“=”
		x = M.variable('x', 2, Domain.integral(Domain.greaterThan(0.0)))
		
		# 2.设置constraints
		# 50.0 x[0] + 31.0 x[1] <= 250.0
		# 3.0 x[0] - 2.0 x[1] >= -4.0
		M.constraint('c1', Expr.dot(A[0], x), Domain.lessThan(250.0))
		M.constraint('c2', Expr.dot(A[1], x), Domain.greaterThan(-4.0))
		
		# 3.设置求解器terminate的条件约束,
		# 3.1 time-out时间为60(单位未知,maybe60ms,超时会返回目前suboptimal的答案)
		# Set max solution time
		M.setSolverParam('mioMaxTime', 60.0)
		# 3.2 类似精度的约束,详见FusionAPI13.4.5
		# Set max relative gap (to its default value)
		M.setSolverParam('mioTolRelGap', 1e-4)
		# Set max absolute gap (to its default value)
		M.setSolverParam('mioTolAbsGap', 0.0)
		
		# 4.键入目标函数cost为Maximize或者Minimize
		# Set the objective function to (c^T * x)
		M.objective('obj', ObjectiveSense.Maximize, Expr.dot(c, x))
		
		# Solve the problem
		M.solve()
		
		# x.level()返回求解情况即x值为多少的list,其余的也是求解精度
		print('[x0, x1] = ', x.level())
		print("MIP rel gap = %.2f (%f)" % (M.getSolverDoubleInfo(
		"mioObjRelGap"), M.getSolverDoubleInfo("mioObjAbsGap")))

Practice

网上随便找一道有答案的自我验证例题
网上随便找的一道例题

def mosek_fusion_integer_test():
    """
    网上找的游泳问题,测试一下是否正确
    测试完成,可以解
    求解结果
    0     0     0     1    甲自由泳
    1     0     0     0    乙蝶泳
    0     1     0     0    丙仰泳
    0     0     1     0    丁蛙泳
    0     0     0     0    戊不参加
    :return:
    """
    c = [[66.8, 75.6, 87, 58.6],
         [57.2, 66, 66.4, 53],
         [78, 67.8, 84.6, 59.4],
         [70, 74.2, 69.6, 57.2],
         [67.4, 71, 83.8, 62.4]]

    A = [[1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0],
         [0,0,0,0, 1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0],
         [0,0,0,0, 0,0,0,0, 1,1,1,1, 0,0,0,0, 0,0,0,0],
         [0,0,0,0, 0,0,0,0, 0,0,0,0, 1,1,1,1, 0,0,0,0],
         [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 1,1,1,1],
         [1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0],
         [0,1,0,0, 0,1,0,0, 0,1,0,0, 0,1,0,0, 0,1,0,0],
         [0,0,1,0, 0,0,1,0, 0,0,1,0, 0,0,1,0, 0,0,1,0],
         [0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1],
         ]
    # Create a model with the name 'swim'
    with Model("swim") as M:
        x = M.variable('x', 20, Domain.integral(Domain.greaterThan(0.0)))
        M.constraint(x, Domain.lessThan(1.0))

        # 每个队员最多只能选一种泳姿
        M.constraint("c1", Expr.dot(A[0], x), Domain.lessThan(1.0))
        M.constraint("c2", Expr.dot(A[1], x), Domain.lessThan(1.0))
        M.constraint("c3", Expr.dot(A[2], x), Domain.lessThan(1.0))
        M.constraint("c4", Expr.dot(A[3], x), Domain.lessThan(1.0))
        M.constraint("c5", Expr.dot(A[4], x), Domain.lessThan(1.0))

        # 每种泳姿必须一个人选
        M.constraint("ca", Expr.dot(A[5], x), Domain.equalsTo(1.0))
        M.constraint("cb", Expr.dot(A[6], x), Domain.equalsTo(1.0))
        M.constraint("cc", Expr.dot(A[7], x), Domain.equalsTo(1.0))
        M.constraint("cd", Expr.dot(A[8], x), Domain.equalsTo(1.0))

        # Set max solution time
        M.setSolverParam('mioMaxTime', 60.0)
        # Set max relative gap (to its default value)
        M.setSolverParam('mioTolRelGap', 1e-4)
        # Set max absolute gap (to its default value)
        M.setSolverParam('mioTolAbsGap', 0.0)

        # Set the objective function to (c^T * x)
        cc = [ii for i in c for ii in i]
        M.objective('obj', ObjectiveSense.Minimize, Expr.dot(cc, x))
        # Solve the problem
        M.solve()

        # Get the solution values
        print('[x] = ', x.level())
        print("MIP rel gap = %.2f (%f)" % (M.getSolverDoubleInfo(
            "mioObjRelGap"), M.getSolverDoubleInfo("mioObjAbsGap")))

[未完待续]

### 回答1: CVX 是一种在 MATLAB 环境下的优化建模工具包,可以简化数学优化问题的建模和求解过程。它提供了一种声明式的建模语言,使得用户只需要描述问题的目标函数和约束条件,而无需关注具体的求解方法。 MOSEK 是一种商用的数学优化软件包,可用于求解线性规划(LP)、二次规划(QP)、二次约束二次规划(QCQP)、半定规划(SDP)等优化问题。CVX 使用 MOSEK 作为其底层求解引擎,因为 MOSEK 在求解各种优化问题时具有高效、稳定和可靠的特性。 在使用 CVX 和 MOSEK 进行优化建模时,先要安装好 MATLAB、CVX 和 MOSEK 软件包。然后在 MATLAB 中引入 CVX 库,并加载相应的求解包,比如 MOSEK。接下来,通过定义变量、目标函数和约束条件来描述优化问题。CVX 的建模语言支持常见的线性代数运算、约束条件和优化目标的定义,使得问题建模变得方便快捷。最后,通过指定问题的求解方法和调用 CVX 的求解函数来求解优化问题。 CVX 的求解过程是透明的,用户只需要按照 CVX 的语法和规范进行建模,CVX 会自动调用 MOSEK 的求解算法来求解问题。求解完成后,CVX 会返回最优解和最优目标值,并提供一些其他的信息,比如收敛性、求解时间等。 综上所述,CVX 和 MOSEK 结合使用能够简化优化问题的建模和求解过程,为用户提供了一个高效、灵活和可靠的优化工具。无论是学术界还是工业界,CVX + MOSEK 都是经典的数学优化求解组合之一。 ### 回答2: CVX和MOSEK是一对常用的优化工具,用于求解凸优化问题。CVX是一个用于建模和求解凸优化问题的MATLAB工具箱,而MOSEK是一种商业化的数学优化软件。 CVX提供了一种非常方便的方式来表达和求解凸优化问题。用户只需要定义问题的变量、目标函数和约束条件,CVX就可以自动将问题转化为标准的凸优化形式,并调用底层的优化工具求解。CVX支持各种约束类型,如线性约束、半正定约束和二次约束等。此外,CVX还可以处理一些特殊的约束形式,如L1范数约束和矩阵低秩约束等。 MOSEK是CVX中默认的优化引擎,用于求解CVX转化后的凸优化问题。MOSEK采用了先进的内部算法,可以高效地求解大规模的凸优化问题。它支持各种凸优化问题的求解,如线性规划、二次规划、半正定规划和混合整数规划等。MOSEK还提供了一些高级功能,如线性矩阵不等式(LMI)约束的求解和多目标优化等。 CVX和MOSEK使用相对简单。首先,将CVX和MOSEK的安装文件下载并安装到MATLAB环境中。然后,在MATLAB中加载CVX和MOSEK的库文件。接下来,通过定义变量、目标函数和约束条件来创建一个凸优化问题。最后,调用CVX提供的命令来求解问题。 总之,CVX和MOSEK是一对强大的凸优化工具,可以方便地求解各种凸优化问题。通过使用这对工具,用户可以高效地解决许多实际问题。 ### 回答3: CVX是一种用于数学建模和优化问题求解的工具包,而MOSEK则是一种广泛使用的数学优化软件包。CVX MOSEK使用的过程可以概括为以下几个步骤: 1. 安装CVX和MOSEK:首先需要下载并安装CVX和MOSEK的软件包。CVX官方网站提供了免费的学术许可证,可以方便地获取安装包。MOSEK则需要购买并获得许可证才能使用。 2. 导入CVX和MOSEK库:在开始使用CVX MOSEK之前,需要在所使用的编程语言中导入CVX和MOSEK的库文件。CVX通常支持MATLAB和Python语言,可以根据需要选择合适的语言和版本。 3. 定义优化问题:接下来,需要定义待解决的数学优化问题。CVX提供了简洁的数学建模语法,可以轻松地定义线性规划、二次规划、半定规划等各种类型的优化问题。 4. 调用CVX和MOSEK求解器:使用CVX MOSEK可以方便地调用MOSEK的求解器来求解优化问题。CVX会自动将优化问题转化为MOSEK所需的格式,并调用相应的求解算法进行计算。 5. 获取优化结果:一旦求解器完成计算,CVX会返回求解得到的最优解以及相应的目标函数值。可以将这些结果用于后续的分析和决策。 使用CVX MOSEK可以极大地简化数学优化问题的建模和求解过程,尤其对于非专业的优化问题求解者来说更加友好和便捷。它的广泛应用包括供应链优化、数据分析、机器学习等领域,为解决实际问题提供了强大的工具和支持。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值