【Fusion】mosek.fusion基本模型
导航
- Variable and Constraint Management
- Variable duplication
- Linear operations
- Absolute value
- 1-norm
- Quadratic and Power operations
- Square
- 2-norm
- Powers
- p-norm
- Geometric mean
- Exponentials and Logarithms
- log
- exp
- Entropy
- Relative entropy
- Log-sum-exp
- Integer Modeling
- semicontinuous variable
- indicator variable
- Logical OR
- Logical NAND
- Cardinality bound
- Model assembly example
- Problem Modification and Reoptimization
- Example: Production Planning
- 改变线性约束矩阵
- 增加变量
- 加入新约束
- 改变bounds
- Reference
Variable and Constraint Management
Variable duplication
# x=y
def dup(M, x, y):M.constraint(Expr.sub(x, y), Domain.equalsTo(0.0))
Linear operations
Absolute value
t≥∣x∣t\geq |x|t≥∣x∣
def abs(M, t, x):M.constraint(Expr.add(t, x), Domain.greaterThan(0.0))M.constraint(Expr.sub(t, x), Domain.greaterThan(0.0))
1-norm
t≥∑i∣xi∣t\geq \sum_i|x_i|t≥∑i∣xi∣
def norm1(M, t, x):u=M.variable(x.getShape(), Domain.unbounded())abs(M, u, x) # u>=|x|M.constraint(Expr.sub(t, Expr.sum(u)), Domain.greaterThan(0.0))
Quadratic and Power operations
Square
t≥x2t\geq x^2t≥x2
def sq(M, t, x):M.constraint(Expr.hstack(0.5, t, x), Domain.inRotatedQCone())
2-norm
t≥∑ixi2t\geq \sqrt{\sum_i x_i^2}t≥∑ixi2
def norm2(M, t, x):M.constraint(Expr.vstack(t, x), Domain.inQCone())
Powers
t≥∣x∣p,p>1t\geq |x|^p, p\gt 1t≥∣x∣p,p>1
def pow(M, t, x, p):M.constraint(Expr.hstack(t, 1, x), Domain.inPPowerCone(1.0/p))
t≥1/xp,x>0,p>0t\geq 1/x^p, x>0, p>0t≥1/xp,x>0,p>0
def pow_inv(M, t, x, p):M.constraint(Expr.hstack(t, x, 1), Domain.inPPowerCone(1.0/(1.0+p)))
p-norm
t≥(∑i∣xi∣p)1/p,p>1t\geq (\sum_i |x_i|^p)^{1/p}, p>1t≥(∑i∣xi∣p)1/p,p>1
def pnorm(M, t, x, p):n=int(x.getSize())r=M.variable(n)M.constraint(Expr.sub(t, Expr.sum(r)), Domain.equalsTo(0.0))M.constraint(Expr.hstack(Var.repeat(t, n), r, x), Domain.inPPowerCone(1.0-1.0/p))
Geometric mean
t≥(x1×x2×⋯×xn)1/n,xi>0t\geq (x1\times x_2\times\dots\times x_n)^{1/n}, x_i>0t≥(x1×x2×⋯×xn)1/n,xi>0
def geo_mean(M, t, x):n=int(x.getSize())if n==1: abs(M, x, t)else:t2=M.variable()M.constraint(Expr.hstack(t2, x.index(n-1), t), Domain.inPPowerCone(1.0-1.0/n))geo_mean(M, t2, x.slice(0, n-1))
Exponentials and Logarithms
log
t≤logx,x>0t\leq \log x, x>0t≤logx,x>0
def log(M, t, x):M.constraint(Expr.hstack(x, 1, t), Domain.inPExpCone())
exp
t≥ext\geq e^xt≥ex
def exp(M, t, x):M.constraint(Expr.hstack(t, 1, x), Domain.inPExpCone())
Entropy
t≥xlogx,x>0t\geq x\log x, x>0t≥xlogx,x>0
def ent(M, t, x):M.constraint(Expr.hstack(1, x, Expr.neg(t)), Domain.inPExpCone())
Relative entropy
t≥xlogx/y,x,y>0t\geq x\log x/y, x,y>0t≥xlogx/y,x,y>0
def relent(M, t, x, y):M.constraint(Expr.hstack(y, x, Expr.neg(t)), Domain.inPExpCone())
Log-sum-exp
log∑iexi≤t\log\sum_i e^{x_i}\leq tlog∑iexi≤t
def logsumexp(M, t, x):n=int(x.getSize())u=M.variable(n)M.constraint(Expr.hstack(u, Expr.constTerm(n, 1.0), Expr.sub(x, Var.repeat(t, n))), Domain.inPExpCone())M.constraint(Expr.sum(u), Domain.lessThan(1.0))
Integer Modeling
semicontinuous variable
x∈{0}∪[a,b],b>a>0x\in\{0\}\cup [a, b], b>a>0x∈{0}∪[a,b],b>a>0
def semicontinuous(M, x, a, b):u=M.variable(x.getShape(), Domain.binary())M.constraint(Expr.sub(x, Expr.mul(a, u)), Domain.greaterThan(0.0))M.constraint(Expr.sub(x, Expr.mul(b, u)), Domain.lessThan(0.0))
indicator variable
x≠0⇒t=1x\neq 0\Rightarrow t=1x=0⇒t=1
def indicator(M, t, x):M.constraint(t, Domain.inRange(0, 1))t.makeInteger()abs(M, t, x)
Logical OR
逻辑或运算
# x or y
def logic_or(M, x, y):M.constraint(Expr.adds(x, y), Domain.greaterThan(1.0))
# x1 or .. or xn, x is a binary vector
def logic_or_vec(M, x):M.constraint(Expr.sum(x), Domain.greaterThan(1.0))
Logical NAND
not (x and y),最多有一个指示标量为真
def logic_sos1(M, x):M.constraint(Expr.sum(x), Domain.lessThan(1.0))def logic_nand(M, x, y):M.constraint(Expr.add(x, y), Domain.lessThan(1.0))
Cardinality bound
最多有kkk个变量非0,且∣xi∣≤1|x_i|\leq 1∣xi∣≤1
def card(M, x, k):t=M.variable(x.getShape(), Domain.binary())abs(M, t, x)M.constraint(Expr.sum(t), Domain.lessThan(k))
Model assembly example
求解模型
max−x2+y2+logy−x1.5s.t.x≥y+3\begin{aligned} &\max -\sqrt{x^2+y^2}+\log y-x^{1.5} \\ &s.t.\quad x\geq y+3 \end{aligned} max−x2+y2+logy−x1.5s.t.x≥y+3
等价转换为
max−t0+t1−t2s.t.{x≥y+3t0≥x2+y2t1≤logyt2≥x1.5\begin{aligned} &\max -t_0+t_1-t_2\\ &s.t. \begin{cases} x\geq y+3\\ t_0\geq \sqrt{x^2+y^2}\\ t_1\leq \log y\\ t_2\geq x^{1.5} \end{cases} \end{aligned} max−t0+t1−t2s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x≥y+3t0≥x2+y2t1≤logyt2≥x1.5
mosek
建模代码
def example():M=Model()x=M.variable()y=M.variable()t=M.variable(3)M.constraint(Expr.sub(x, y), Domain.greaterThan(3.0))norm2(M, t.index(0), Var.stack(x, y))log(M, t.index(1), y)pow(M, t.index(2), x, 1.5)# 目标函数M.objective(ObjectiveSense.Maximize, Expr.dot(t, [-1, 1, -1]))
Problem Modification and Reoptimization
当需要求解一系列相似优化问题时,可以将求解问题之间的不同分为以下几类
- 加入新的约束和变量
- 改变现有约束条件
Example: Production Planning
建立模型
max1.5x0+2.5x1+3.0x2s.t.{2x0+4x1+3x2≤1000003x0+2x1+3x2≤500002x0+3x1+2x2≤60000x0,x1,x2≥0\begin{aligned} &\max 1.5x_0+2.5x_1+3.0x_2\\ &s.t. \begin{cases} 2x_0+4x_1+3x_2\leq 100000\\ 3x_0+2x_1+3x_2\leq 50000\\ 2x_0+3x_1+2x_2\leq 60000\\ x_0, x_1, x_2\geq 0 \end{cases} \end{aligned} max1.5x0+2.5x1+3.0x2s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧2x0+4x1+3x2≤1000003x0+2x1+3x2≤500002x0+3x1+2x2≤60000x0,x1,x2≥0
mosek
建立模型
c=[1.5, 2.5, 3.0]
A=[[2, 4, 3], [3, 2, 3], [2, 3, 2]]
b=[100000, 50000, 60000]
nvar, ncon=len(c), len(b)with Model() as M:x=M.variable('x', nvar, Domain.greaterThan(0.0))con=M.constraint(Expr.mul(A, x), Domain.lessThan(b))M.objective(ObjectiveSense.Maximize, Expr.dot(c, x))M.solve()
改变线性约束矩阵
设置矩阵约束系数A00=3A_{00}=3A00=3
x0=x.index(0)
con.index(0).update(Expr.mul(3.0, x0), x0)
增加变量
加入一条新的数据信息后对模型进行更新
新模型为
max1.5x0+2.5x1+3.0x2+x3s.t.{3x0+4x1+3x2+4x3≤1000003x0+2x1+3x2≤500002x0+3x1+2x2+x3≤60000x0,x1,x2≥0\begin{aligned} &\max 1.5x_0+2.5x_1+3.0x_2+x_3\\ &s.t. \begin{cases} 3x_0+4x_1+3x_2+4x_3\leq 100000\\ 3x_0+2x_1+3x_2\leq 50000\\ 2x_0+3x_1+2x_2+x_3\leq 60000\\ x_0, x_1, x_2\geq 0 \end{cases} \end{aligned} max1.5x0+2.5x1+3.0x2+x3s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧3x0+4x1+3x2+4x3≤1000003x0+2x1+3x2≤500002x0+3x1+2x2+x3≤60000x0,x1,x2≥0
x3=M.variable('y', Domain.greaterThan(0.0))
x_new=Var.vstack(x, x3)
# 更新约束条件
con.update(Expr.mul(x3, [4, 0, 1]), x3)
# 更新目标函数
M.objective(ObjectiveSense.Maximize, Expr.dot(c+[1.0], x_new))
加入新约束
加入约束条件
x0+2x1+x2+x3≤30000x_0+2x_1+x_2+x_3\leq 30000 x0+2x1+x2+x3≤30000
con2=M.constraint(Expr.dot(x_new, [1, 2, 1, 1]), Domain.lessThan(30000))
改变bounds
根据下表更新upper bounds
Operation | Time available(old) | Time available(new) |
---|---|---|
Assembly | 100000 | 80000 |
Polishing | 50000 | 40000 |
Packing | 60000 | 50000 |
Quality control | 30000 | 22000 |
新模型为
max1.5x0+2.5x1+3.0x2+x3s.t.{3x0+4x1+3x2+4x3+20000≤1000003x0+2x1+3x2+10000≤500002x0+3x1+2x2+x3+10000≤60000x0+2x1+x2+x3+8000≤30000x0,x1,x2≥0\begin{aligned} &\max 1.5x_0+2.5x_1+3.0x_2+x_3\\ &s.t. \begin{cases} 3x_0+4x_1+3x_2+4x_3+20000\leq 100000\\ 3x_0+2x_1+3x_2+10000\leq 50000\\ 2x_0+3x_1+2x_2+x_3+10000\leq 60000\\ x_0+2x_1+x_2+x_3+8000\leq 30000\\ x_0, x_1, x_2\geq 0 \end{cases} \end{aligned} max1.5x0+2.5x1+3.0x2+x3s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧3x0+4x1+3x2+4x3+20000≤1000003x0+2x1+3x2+10000≤500002x0+3x1+2x2+x3+10000≤60000x0+2x1+x2+x3+8000≤30000x0,x1,x2≥0
cAll=Constraint.vstack(con, con2)
cAll.update([20000, 10000, 10000, 8000])
Reference
mosek fusion python API
【Fusion】mosek.fusion基本模型相关推荐
- RAC 核心概念 Cache Fusion
要了解RAC工作原理的中心需要知道Cache Fusion这个重要概念,这个文章就是用来说明什么是Cache Fusion.要发挥Cache Fusion的作用,要有一个前提条件,那就是互联网络的速度 ...
- ERP_Oracle Fusion Application新一代ERP介绍
2014-12-31 Created By BaoXinjian 一.摘要 官方对Oracle Fusion Applications 正式介绍: 1. Oracle融合应用软件是一套完整的模块化应用 ...
- 滴滴自研分布式 NoSQL 数据库 Fusion 的演进之路
https://www.infoq.cn/article/hcPzw431w*JIdelpZ6iO 本文来自滴滴的技术专家.Fusion 的负责人余汶龙在 2018 年北京 ArchSummit 全球 ...
- boost::fusion::for_each用法的测试程序
boost::fusion::for_each用法的测试程序 实现功能 C++实现代码 实现功能 boost::fusion::for_each用法的测试程序 C++实现代码 #include < ...
- boost::fusion::fold用法的测试程序
boost::fusion::fold用法的测试程序 实现功能 C++实现代码 实现功能 boost::fusion::fold用法的测试程序 C++实现代码 #include <boost/f ...
- Fusion组件库是如何支持多语言能力的
随着国际化发展,多语言的需求越来越常见,单一的语言已经远不能满足需求了.作为一个组件库,支持多语言也是基本能力. 多语言功能的本质其实是文本的替换,一个词汇"OK",在英文语境下是 ...
- mac虚拟机vm屏幕一直闪烁_VM虚拟机VMware Fusion Pro 11
VMware Fusion Pro中文版扩展版,这款VM虚拟机能够让用户在 Mac 上并行运行 Windows 和数百个其他操作系统或Mac应用,而不必重新启动.Fusion mac版对家庭用户而言, ...
- 分享 | 滴滴分布式NoSQL数据库Fusion的演进之路
出品 | 滴滴技术 作者 | 余汶龙 前言: Fusion 是滴滴自研的分布式 NoSQL 数据库,完全兼容 Redis 协议,支持超大规模数据持久化和高性能读写.在滴滴内部支撑了数百个业务,具有 P ...
- 可配置组件库Fusion Design 了解一下
前不久那篇爆?的文章 阿里重磅开源中后台UI解决方案 Fusion,相信大家很多人都看过.不少同学使用过 Fusion Design. Fusion Design 整个体系还是比较庞大的.接下来笔者从 ...
- 滴滴 NewSQL 演进之 Fusion 实践
本文根据滴滴数据库存储专家余汶龙,在DTCC中国第十届数据库大会的演讲整理而成. 余汶龙 滴滴出行技术专家,曾经在VMware.淘宝.阿里云从事虚拟网络及存储领域的工作.现负责滴滴自研的NoSQL存储 ...
最新文章
- 解决Visual Studio禁止使用strlen函数的问题
- SAP MM Vendor Rebate Process and Settings
- Iphone4涨到2万,相对VERTU有里子,面子也便宜
- 告诉你SUV到底两驱好还是四驱好
- redis实现轮询算法_基于zookeeper或redis实现分布式锁
- Visual Studio.net 2010 Windows Service 开发,安装与调试
- 声笔双拼单字效率分析
- sqlserver日志管理(转载)
- SAP License:SAP系统License查看申请及导入
- ASPxGridView1用法-
- vue-app之H5打开第三方app
- Fortify 5.1漏洞整改方案(1)
- Linux平台下rar, 7z, zip压缩文件密码破解
- Java一些零散知识点--9.19更
- Kprobe-based Event Tracing
- IntelliJ IDEA快速入门 | 第三十篇:如何来自定义模板呢?
- 企业的性质:诺奖得主科斯经典原文翻译及解读1
- 高分子物理名词解释归纳
- 基于51单片机的LCD1602显示温湿度
- ENVI中使用水体指数法NDWI提取水体