这里就不扯咸蛋了,主要介绍两个优化问题,一个线性优化,一个就是让我蛋疼的二次优化。
Linear Optimization
一般形式:
通过实例来看:
处理流程:
1. 创建环境; 2. 创建一个优化任务; 3. 载入一个问题进入任务对象; 4. 优化; 5. 获取求解结果
按照处理流程我们来分析代码:
1. 创建环境
r = MSK_makeenv(&env, NULL);
2. 创建优化任务
/* Create the optimization task. */
r = MSK_maketask(env, numcon, numvar, &task);
/* Directs the log task stream to the 'printstr' function. */
if (r == MSK_RES_OK)
r = MSK_linkfunctotaskstream(task, MSK_STREAM_LOG, NULL, printstr);
3. 载入一个优化问题进入任务对象
变量与限制条件必须被加入到优化问题。
/* Append 'numcon' empty constraints. The constraints will initially have no bounds. */
if (r == MSK_RES_OK)
r = MSK_appendcons(task, numcon);
/* Append 'numvar' variables. The variables will initially be fixed at zero (x=0). */
if (r == MSK_RES_OK)
r = MSK_appendvars(task, numvar);
这样,新的变量能够引入通过索引:index 0,...,numvar - 1
新的约束能够被引入通过索引:index 0,...,numcon - 1
通过索引,循环的输入数据,来设置问题数据。我们首先设置对象参数cj = c[j]
/* Set the linear term c_j in the objective.*/
if (r == MSK_RES_OK)
r = MSK_putcj(task, j, c[j]);
4. 设置变量边界
const MSKboundkeye bkx[] = {MSK_BK_LO, MSK_BK_RA, MSK_BK_LO, MSK_BK_LO };
const double blx[] = {0.0, 0.0, 0.0, 0.0 };
const double bux[] = { +MSK_INFINITY, 10.0, +MSK_INFINITY, +MSK_INFINITY };
/* Set the bounds on variable j.
blx[j] <= x_j <= bux[j] */
if (r == MSK_RES_OK)
r = MSK_putvarbound(task,
j, /* Index of variable.*/
bkx[j], /* Bound key.*/
blx[j], /* Numerical value of lower bound.*/
bux[j]); /* Numerical value of upper bound.*/