一般常数
COPT有三种类型的常量。
用来构建模型的,比如优化方向,约束类型等;
用来查询求解结果的,比如API函数返回值,基、解值等;
用来监视求解进程的,比如回调函数的触发条件。
版本信息
VERSION_MAJOR
软件大版本号
VERSION_MINOR
软件小版本号
VERSION_TECHNICAL
软件修复版本编号
优化方向
在不同的优化场景中,需要最大化或最小化目标函数。为此,我们提供了两种优化方向的常数:
MAXIMIZE
最大化目标函数
MINIMIZE
最小化目标函数
当读取一个文件时,优化方向会自动设置。此外,COPT提供相应函数,通过指定参数 sense
的值,让用户手动设置优化方向。在不同的编程接口中的函数如 表 10 所示:
编程接口 |
函数 |
---|---|
C |
|
C++ |
|
C# |
|
Java |
|
Python |
|
注意: 在不同编程接口中的函数名称、调用方式以及参数名称略有不同,详细请参考各编程语言 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\) ,则线性约束无效(可以被违反)。
INDICATOR_ONLYIF
Only-If:
如果线性约束 \(a^{T}x \leq b\) 满足,则 \(y=f\) ;
如果线性约束 \(a^{T}x \leq b\) 不满足,则 \(y\) 可以取值为0或1。
INDICATOR_IFANDONLYIF
If-and-Only-If:
线性约束 \(a^{T}x \leq b\) 和 \(y=f\) 必须同时满足,或者同时不满足。
二阶锥约束类型
二阶锥约束是一类特殊的二次约束,COPT支持两种二阶锥约束:
CONE_QUAD
: 标准二阶锥
CONE_RQUAD
: 旋转二阶锥
指数锥约束类型
COPT支持两种指数锥约束:
EXPCONE_PRIMAL
: 原始指数锥
EXPCONE_DUAL
: 对偶指数锥
基状态
对于一个有 \(n\) 个变量、\(m\) 个约束的优化模型,它在内部计算时,\(m\) 个约束会被当做 \(m\) 个松弛变量看待。 这样一共就有 \(n+m\) 个变量了。
当使用单纯形法求解模型时,它会把 \(n\) 个变量固定在其有限边界上,并计算另外 \(m\) 个变量的取值。 这 \(m\) 个计算取值的变量叫做 基 变量,而另外那 \(n\) 个变量叫做 非基 变量。 单纯形法的求解过程,以及最终的解,都可以用变量的基状态来表达。COPT中变量/约束基状态取值及其含义如 表 11 所示:
基状态码 |
取值 |
含义 |
---|---|---|
|
0 |
非基变量,取值下边界 |
|
1 |
基变量 |
|
2 |
非基变量,取值上边界 |
|
3 |
非基变量,但取值非上下边界 |
|
4 |
非基变量,固定在它唯一的边界(上下边界相等) |
解状态
优化问题的求解状态即为解状态。模型解状态可取值如 表 12 :
解状态码 |
取值 |
含义 |
---|---|---|
|
0 |
尚未开始求解 |
|
1 |
找到了最优解 |
|
2 |
模型是无解的 |
|
3 |
目标函数在优化方向没有边界 |
|
4 |
模型无解或目标函数在优化方向没有边界 |
|
5 |
求解遇到数值问题 |
|
6 |
在时间限制到达前未能完成求解 |
|
7 |
求解结果不准确 |
|
8 |
在时间限制到达前未能完成求解 |
|
9 |
求解终止。但是由于数值问题,求解器无法给出结果 |
|
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参考手册的对应章节部分:
C 接口:C API参考手册:常量章节
C++ 接口: C++ API参考手册:常量章节
C# 接口: C# API参考手册:一般常数章节
Java 接口: Java API参考手册:一般常数章节
Python 接口: Python API参考手册:一般常数章节