一般常数

COPT有三种类型的常量。

  1. 用来构建模型的,比如优化方向,约束类型等;

  2. 用来查询求解结果的,比如API函数返回值,基、解值等;

  3. 用来监视求解进程的,比如回调函数的触发条件。

版本信息

  • VERSION_MAJOR

    软件大版本号

  • VERSION_MINOR

    软件小版本号

  • VERSION_TECHNICAL

    软件修复版本编号

优化方向

在不同的优化场景中,需要最大化或最小化目标函数。为此,我们提供了两种优化方向的常数:

  • MAXIMIZE

    最大化目标函数

  • MINIMIZE

    最小化目标函数

当读取一个文件时,优化方向会自动设置。此外,COPT提供相应函数,通过指定参数 sense 的值,让用户手动设置优化方向。在不同的编程接口中的函数如 表 10 所示:

表 10 设置目标函数优化方向的函数

编程接口

函数

C

COPT_SetObjSense

C++

Model::SetObjSense()

C#

Model.SetObjSense()

Java

Model.setObjSense()

Python

Model.setObjSense()

注意: 在不同编程接口中的函数名称、调用方式以及参数名称略有不同,详细请参考各编程语言 API 参考手册。

无边界和未定义

无边界

在COPT中,我们使用一个很大的量表达无边界的情况。这个量以常数提供:

  • INFINITY

    代表无边界的量的默认值(1e30)

未定义

在COPT中,我们使用另一个很大的量表达数据未定义的情况。例如,初始解文件( ".mst" )中省略的变量的赋值。这个量以常数提供:

  • UNDEFINED

    代表数据未定义的默认值(1e40)

约束类型

在优化领域最初兴起的时候,人们往往用约束类型( sense )来定义一个约束。常见的类型有:

  • LESS_EQUAL

    形如 \(g(x) \leq b\) 的约束

  • GREATER_EQUAL

    形如 \(g(x) \geq b\) 的约束

  • EQUAL

    形如 \(g(x) = b\) 的约束

  • FREE

    无边界约束的表达式

  • RANGE

    同时有上下边界的,形如 \(l \leq g(x) \leq u\) 的约束

注意: COPT支持使用约束类型来定义约束,但不推荐,我们推荐直接使用上下边界来定义约束。

变量类型

变量类型指的是一个变量是连续变量、二进制变量或者整数变量。COPT支持将决策变量设置为以下三种类型:

  • CONTINUOUS

    连续变量

  • BINARY

    二进制变量(0-1变量)

  • INTEGER

    整数变量

SOS约束类型

SOS约束(Special Ordered Set)是一类限制一组变量取值的特殊约束。目前,COPT支持两种SOS约束:

  • SOS_TYPE1

    SOS1约束

    该类型约束中指定的一组变量至多有一个变量可取非零值

  • SOS_TYPE2

    SOS2约束

    该类型约束中指定的一组变量至多有两个变量可取非零值,且取非零值的变量顺序要求相邻

注意: SOS约束中的变量类型可取连续变量、二进制变量和整数变量。

Indicator约束类型

Indicator约束是COPT中表示逻辑关系的条件约束,用于刻画0-1变量 \(y\) 的取值和线性约束 \(a^{T}x \leq b\) 是否被满足的关系。 目前,COPT支持三种Indicator约束:

  • INDICATOR_IF

    If-Then:

    如果 \(y=f\) ,则线性约束满足;

    如果 \(y\ne f\) ,则线性约束无效(可以被违反)。

(7)\[\begin{split}y &= f \rightarrow a^{T}x \leq b\\ f &\in \{0, 1\}\end{split}\]
  • INDICATOR_ONLYIF

    Only-If:

    如果线性约束 \(a^{T}x \leq b\) 满足,则 \(y=f\)

    如果线性约束 \(a^{T}x \leq b\) 不满足,则 \(y\) 可以取值为0或1。

(8)\[\begin{split}a^{T}x &\leq b \rightarrow y = f\\ f &\in \{0, 1\}\end{split}\]
  • INDICATOR_IFANDONLYIF

    If-and-Only-If:

    线性约束 \(a^{T}x \leq b\)\(y=f\) 必须同时满足,或者同时不满足。

(9)\[\begin{split}a^{T}x &\leq b \leftrightarrow y = f\\ f &\in \{0, 1\}\end{split}\]

二阶锥约束类型

二阶锥约束是一类特殊的二次约束,COPT支持两种二阶锥约束:

  • CONE_QUAD : 标准二阶锥

(10)\[Q^n= \left\{x\in \mathbb{R}^n\ \left|\ x_0\geq\sqrt{\sum_{i=1}^{n-1} x_i^2}, x_0\geq0 \right. \right\}\]
  • CONE_RQUAD : 旋转二阶锥

(11)\[Q^n_r= \left\{x\in \mathbb{R}^n\ \left|\ 2x_0x_1\geq\sum_{i=2}^{n-1} x_i^2, x_0\geq0, x_1\geq 0 \right. \right\}\]

指数锥约束类型

COPT支持两种指数锥约束:

  • EXPCONE_PRIMAL : 原始指数锥

(12)\[ \begin{align}\begin{aligned}\mathrm{cl}(S_1) = S_1 \cup S_2\\\begin{split}\begin{aligned} S_1 &= \left\{\begin{pmatrix} t \\ s \\ r \end{pmatrix}\in \mathbb{R}^3\ |\ s > 0,\ t \geq s\ \mathrm{exp}\left(\frac{r}{s} \right) \right\}, \\ S_2 &= \left\{\begin{pmatrix} t \\ s \\ r \end{pmatrix}\in \mathbb{R}^3\ |\ s=0,\ t\geq 0,\ r\leq 0 \right\} \end{aligned}\end{split}\end{aligned}\end{align} \]
  • EXPCONE_DUAL : 对偶指数锥

(13)\[ \begin{align}\begin{aligned}\mathrm{cl}(S_1) = S_1 \cup S_2\\\begin{split}\begin{aligned} S_1 &= \left\{\begin{pmatrix} t \\ s \\ r \end{pmatrix}\in \mathbb{R}^3\ |\ r < 0,\ t \geq -r\ \mathrm{exp}\left(\frac{s}{r}-1\right) \right\}, \\ S_2 &= \left\{\begin{pmatrix} t \\ s \\ r \end{pmatrix}\in \mathbb{R}^3\ |\ r = 0,\ t\geq 0,\ s\geq 0 \right\} \end{aligned}\end{split}\end{aligned}\end{align} \]

基状态

对于一个有 \(n\) 个变量、\(m\) 个约束的优化模型,它在内部计算时,\(m\) 个约束会被当做 \(m\) 个松弛变量看待。 这样一共就有 \(n+m\) 个变量了。

当使用单纯形法求解模型时,它会把 \(n\) 个变量固定在其有限边界上,并计算另外 \(m\) 个变量的取值。 这 \(m\) 个计算取值的变量叫做 变量,而另外那 \(n\) 个变量叫做 非基 变量。 单纯形法的求解过程,以及最终的解,都可以用变量的基状态来表达。COPT中变量/约束基状态取值及其含义如 表 11 所示:

表 11 基状态码对应取值及其含义

基状态码

取值

含义

BASIS_LOWER

0

非基变量,取值下边界

BASIS_BASIC

1

基变量

BASIS_UPPER

2

非基变量,取值上边界

BASIS_SUPERBASIC

3

非基变量,但取值非上下边界

BASIS_FIXED

4

非基变量,固定在它唯一的边界(上下边界相等)

解状态

优化问题的求解状态即为解状态。模型解状态可取值如 表 12

表 12 解状态码及其含义

解状态码

取值

含义

UNSTARTED

0

尚未开始求解

OPTIMAL

1

找到了最优解

INFEASIBLE

2

模型是无解的

UNBOUNDED

3

目标函数在优化方向没有边界

INF_OR_UNB

4

模型无解或目标函数在优化方向没有边界

NUMERICAL

5

求解遇到数值问题

NODELIMIT

6

在时间限制到达前未能完成求解

IMPRECISE

7

求解结果不准确

TIMEOUT

8

在时间限制到达前未能完成求解

UNFINISHED

9

求解终止。但是由于数值问题,求解器无法给出结果

INTERRUPTED

10

用户中止

注意

  • 在Java API和C# API的常量类中,关于解状态的常数定义在 Status 类里;

  • 在Python API中,解状态定义在COPT的一般常数类中,通过 "COPT." 前缀或 Model.status 访问;

  • 通过属性 "LpStatus" 可以获取连续模型的解状态,通过属性 "MipStatus" 可以获取整数规划解状态。

  • 通过Callback信息 "NodeStatus" 可以获取当前节点LP松弛问题的求解状态。除去 NODELIMIT, UNSTARTED, INF_OR_UNB ,其他均为其可能取值。

回调函数的触发条件

  • CBCONTEXT_INCUMBENT

    当找到当前最优可行解时,触发回调函数。

  • CBCONTEXT_MIPRELAX

    当找到MIP线性松弛解时,触发回调函数。

  • CBCONTEXT_MIPSOL

    当找到MIP可行解时,触发回调函数。

  • CBCONTEXT_MIPNODE

    当处理完成MIP节点并求解线性松弛问题完成时,触发回调函数。

客户端配置参数

对于浮动和集群服务器的客户端,用户可以通过调用接口函数设置客户端配置参数,目前提供的配置参数有:

  • CLIENT_CLUSTER

    远程服务器的IP地址。

  • CLIENT_FLOATING

    令牌服务器的IP地址。

  • CLIENT_PASSWORD

    远程服务器的密码。

  • CLIENT_PORT

    令牌服务器的通信端口。

  • CLIENT_WAITTIME

    客户端连接等待时间。

注意:

这里的客户端配置参数,仅支持通过 EnvrConfig 进行设置。

访问常数相关操作

在不同的编程接口中,访问常数的方式略有差别,在C语言接口中常数名称多加前缀 "COPT_" (形如 COPT_MAXIMIZE )。具体请参考各编程语言API参考手册的对应章节部分: