CPXXcopyquadCPXcopyquad

例程 CPXXcopyquad/CPXcopyquad 用于在 Q 不是对角项时复制二次目标矩阵 Q。

int  CPXXcopyquad( CPXCENVptr 环境, CPXLPptr lp, CPXNNZ const * qmatbeg, CPXDIM const * qmatcnt, CPXDIM const * qmatind, double const * qmatval )

int  CPXcopyquad( CPXCENVptr 环境, CPXLPptr lp, int const * qmatbeg, int const * qmatcnt, int const * qmatind, double const * qmatval )

描述

例程 CPXXcopyquad/CPXcopyquad 用于在 Q 不是对角项时复制二次目标矩阵 Q。 参数 "qmatbeg、"qmatcnt、"qmatind和 "qmatval用于指定矩阵 Q 的非零系数。 The meaning of these vectors is identical to the meaning of the corresponding vectors matbeg, matcnt, matind and matval, which are used to specify the structure of A in a call to CPXXcopylp/CPXcopylp.

此函数复制时,Q 必须是对称的。 因此,如果代数格式的二次系数为 2x1x2,那么 x2 应该在 x1 的列表中,x1 应该在 x2 的列表中,在每个条目中系数将为 1.0。 请参见相应示例 C 程序以查看如何实现对称需求。

注:CPLEX 在评估相应目标时,会在二次目标项前面加上系数 "0.5

使用此例程构建或修改模型时,可在应用程序开发期间验证结果是否符合通过调用 CPXcheckcopyquad 预期得到的结果。

如何存取数组

假设 CPLEX 想要访问 "j列中的条目。 这些假设由数组条目给出:


 qmatval[qmatbeg[j]],..,qmatval[qmatbeg[j]+qmatcnt[j]-1]
 

对应列/索引条目为:


 qmatind[qmatbeg[j]],..,qmatind[qmatbeg[j]+qmatcnt[j]-1
 

qmatind[k] 中的条目无需按列顺序来排列。 不允许单列内的 qmatind 中存在重复的条目。 请注意,仅具有线性目标项的任何列 j 具有 qmatcnt[j] = 0,在 qmatindqmatval 中不具有条目。

参数

env
一个指向 CPXXopenCPLEX/CPXopenCPLEX 所返回 CPLEX 环境的指针。
lp
一个指向 CPXXcreateprob/CPXcreateprob 所返回 CPLEX 问题对象的指针。
qmatbeg
一个数组,其 qmatcntqmatindqmatval 定义二次系数矩阵。
qmatcnt
一个数组,其 qmatbegqmatindqmatval 定义二次系数矩阵。
qmatind
一个数组,其 qmatbegqmatcntqmatval 定义二次系数矩阵。
qmatval
一个数组,其 qmatbegqmatcntqmatind 定义二次系数矩阵。 数组 qmatbegqmatcnt 的长度至少应该为 CPXgetnumcols(env,lp)。 数组 qmatindqmatval 的长度至少应该为 qmatbeg[numcols-1]+qmatcnt[numcols-1]。 CPLEX 仅需要数组 qmatval 中按列分组的非零系数。 每一列的非零元素都必须按顺序存储在数组中,"qmatbeg[j]包含j列的起始索引,"qmatcnt[j]包含 "j列的条目数。 请注意,"qmatbeg的各组成部分必须按升序排列。 对于每个 kqmatind[k] 均指示对应系数 qmatval[k] 的列号。 这些数组按以上所述存取。

返回

如果例程成功,那么例程会返回零,而如果发生错误,那么会返回非零。

示例


 status = CPXcopyquad (env, lp, qmatbeg, qmatcnt, qmatind,
                       qmatval);