导航

  • 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≥∑i​xi2​​

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≤log⁡x,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≥xlog⁡x,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≥xlog⁡x/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∑i​exi​≤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+log⁡y−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≤log⁡yt2≥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​−t2​s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧​x≥y+3t0​≥x2+y2​t1​≤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

当需要求解一系列相似优化问题时,可以将求解问题之间的不同分为以下几类

  1. 加入新的约束和变量
  2. 改变现有约束条件

Example: Production Planning

建立模型
max⁡1.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.0x2​s.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)

增加变量

加入一条新的数据信息后对模型进行更新
新模型为
max⁡1.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​+x3​s.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

新模型为
max⁡1.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​+x3​s.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基本模型相关推荐

  1. RAC 核心概念 Cache Fusion

    要了解RAC工作原理的中心需要知道Cache Fusion这个重要概念,这个文章就是用来说明什么是Cache Fusion.要发挥Cache Fusion的作用,要有一个前提条件,那就是互联网络的速度 ...

  2. ERP_Oracle Fusion Application新一代ERP介绍

    2014-12-31 Created By BaoXinjian 一.摘要 官方对Oracle Fusion Applications 正式介绍: 1. Oracle融合应用软件是一套完整的模块化应用 ...

  3. 滴滴自研分布式 NoSQL 数据库 Fusion 的演进之路

    https://www.infoq.cn/article/hcPzw431w*JIdelpZ6iO 本文来自滴滴的技术专家.Fusion 的负责人余汶龙在 2018 年北京 ArchSummit 全球 ...

  4. boost::fusion::for_each用法的测试程序

    boost::fusion::for_each用法的测试程序 实现功能 C++实现代码 实现功能 boost::fusion::for_each用法的测试程序 C++实现代码 #include < ...

  5. boost::fusion::fold用法的测试程序

    boost::fusion::fold用法的测试程序 实现功能 C++实现代码 实现功能 boost::fusion::fold用法的测试程序 C++实现代码 #include <boost/f ...

  6. Fusion组件库是如何支持多语言能力的

    随着国际化发展,多语言的需求越来越常见,单一的语言已经远不能满足需求了.作为一个组件库,支持多语言也是基本能力. 多语言功能的本质其实是文本的替换,一个词汇"OK",在英文语境下是 ...

  7. mac虚拟机vm屏幕一直闪烁_VM虚拟机VMware Fusion Pro 11

    VMware Fusion Pro中文版扩展版,这款VM虚拟机能够让用户在 Mac 上并行运行 Windows 和数百个其他操作系统或Mac应用,而不必重新启动.Fusion mac版对家庭用户而言, ...

  8. 分享 | 滴滴分布式NoSQL数据库Fusion的演进之路

    出品 | 滴滴技术 作者 | 余汶龙 前言: Fusion 是滴滴自研的分布式 NoSQL 数据库,完全兼容 Redis 协议,支持超大规模数据持久化和高性能读写.在滴滴内部支撑了数百个业务,具有 P ...

  9. 可配置组件库Fusion Design 了解一下

    前不久那篇爆?的文章 阿里重磅开源中后台UI解决方案 Fusion,相信大家很多人都看过.不少同学使用过 Fusion Design. Fusion Design 整个体系还是比较庞大的.接下来笔者从 ...

  10. 滴滴 NewSQL 演进之 Fusion 实践

    本文根据滴滴数据库存储专家余汶龙,在DTCC中国第十届数据库大会的演讲整理而成. 余汶龙 滴滴出行技术专家,曾经在VMware.淘宝.阿里云从事虚拟网络及存储领域的工作.现负责滴滴自研的NoSQL存储 ...

最新文章

  1. 解决Visual Studio禁止使用strlen函数的问题
  2. SAP MM Vendor Rebate Process and Settings
  3. Iphone4涨到2万,相对VERTU有里子,面子也便宜
  4. 告诉你SUV到底两驱好还是四驱好
  5. redis实现轮询算法_基于zookeeper或redis实现分布式锁
  6. Visual Studio.net 2010 Windows Service 开发,安装与调试
  7. 声笔双拼单字效率分析
  8. sqlserver日志管理(转载)
  9. SAP License:SAP系统License查看申请及导入
  10. ASPxGridView1用法-
  11. vue-app之H5打开第三方app
  12. Fortify 5.1漏洞整改方案(1)
  13. Linux平台下rar, 7z, zip压缩文件密码破解
  14. Java一些零散知识点--9.19更
  15. Kprobe-based Event Tracing
  16. IntelliJ IDEA快速入门 | 第三十篇:如何来自定义模板呢?
  17. 企业的性质:诺奖得主科斯经典原文翻译及解读1
  18. 高分子物理名词解释归纳
  19. 基于51单片机的LCD1602显示温湿度
  20. ENVI中使用水体指数法NDWI提取水体

热门文章

  1. maven+Tomcat热部署
  2. 语音信号的LPC特征提取
  3. 服务器自动访问iis,设置IIS服务器定时自动重启的方法以Windows Server 2008为例
  4. BM3D算法半解,带python代码
  5. 深入探讨apply()方法的作用
  6. PMP 11章 项目风险管理
  7. U2000北向 CORBA客户端代码Java编程示例
  8. oracle数据库:约束
  9. tomcat启动报错解决org.jaxen.util.AncestorOrSelfAxisIterator
  10. Java中的类加载器详解