📜  Karush-Kuhn-Tucker最优性必要条件(1)

📅  最后修改于: 2023-12-03 15:17:08.031000             🧑  作者: Mango

Karush-Kuhn-Tucker最优性必要条件

Karush-Kuhn-Tucker (KKT) 最优性必要条件是求解非线性规划问题中的必要条件。它基于拉格朗日乘数法,将约束问题转化为无约束问题,然后利用一系列条件找到潜在的最优解。

KKT条件的定义

对于非线性规划问题:

$$ \begin{aligned} \min_{x} f(x) \ &\text{s.t.} \ & g_i(x) \leq 0, i=1,\cdots,m \ & h_i(x) = 0, i=1,\cdots,p \end{aligned} $$

其中,$x \in \mathbb{R}^n$ 是决策变量, $m$ 和 $p$ 分别为不等式约束和等式约束的数量。同时,假设函数 $f(x)$、$g_i(x)$ 和 $h_i(x)$ 都是实值函数。

定义 Lagrange 函数如下:

$$ L(x, \lambda, \mu) = f(x) + \sum_{i=1}^{m} \lambda_i g_i(x) + \sum_{i=1}^{p} \mu_i h_i(x) $$

其中,$\lambda_i$ 和 $\mu_i$ 是拉格朗日乘数。根据 KKT 条件,我们可以得出以下详细的必要条件:

  1. Stationarity:

$$ \nabla_x L(x^, \lambda^, \mu^) = \nabla_x f(x^) + \sum_{i=1}^{m} \lambda_i^* \nabla_x g_i(x^) + \sum_{i=1}^{p} \mu_i^ \nabla_x h_i(x^*) = 0 $$

  1. Primal Feasibility:

$$ g_i(x^) \leq 0, \ i=1,\cdots,m \ h_i(x^) = 0, \ i=1,\cdots,p $$

  1. Dual Feasibility:

$$ \lambda_i^* \geq 0, \ i=1,\cdots,m $$

  1. Complementary Slackness:

$$ \lambda_i^* g_i(x^*) = 0, \ i=1,\cdots,m $$

代码片段

对于一个具体的非线性规划问题,我们可以使用某些数值优化库(如 Scipy)来求解。下面是使用 Scipy 计算 KKT 条件的简单代码片段:

import numpy as np
from scipy.optimize import minimize

def objective(x):
    return (x[0] - 1)**2 + (x[1] - 2.5)**2

def constraint(x):
    return x[0] + x[1] - 3

x0 = [0, 0]
bounds = [(None, None),(None, None)]
con1 = {'type': 'ineq', 'fun': constraint}

sol = minimize(objective, x0, method='SLSQP', bounds=bounds, constraints=[con1])

print(f"Optimal solution: {sol.x}")
print(f"Optimal objective: {sol.fun}")
print(f"Lagrange multipliers: {sol.slack}")
print(f"KKT conditions: {sol.message}")

可以看到,KKT 条件是通过 message 属性返回的。在上面的代码片段中,我们定义了以下变量:

  1. objective 函数是目标函数。
  2. constraint 函数是等式约束。
  3. x0 是初始解。
  4. bounds 是各个变量的取值范围。
  5. con1 是不等式约束。
  6. sol 是优化器的输出。

优化器使用的方法是 SLSQP。最优解以及拉格朗日乘数可以通过解决器的属性得出,而 KKT 条件则存储在 message 属性中。