最优化方法----有约束优化问题C++实现

问题描述

在可行域内,沿着目标函数的负梯度方向移动;沿着被破坏的约束的梯度方向与目标函数梯度方向的和向量移动。

优化问题:

                                                        min x^2+2*y^2

                                                        s.t.  x+y>=4                                  起始点:z=[1,4.5]         固定步长k=1

             

                由KKT条件可以解出 x* = [8/3,4/3]

 

代码实现:

#include
#include
#include
#include
using namespace std;

double C = 0;
vector B={0,0};
vector> A={{2,0},{0,4}};
vector&)> sub_to;
vector (*)(const vector&)> sub_to_grad;

// 约束1:x1+x2>=4
int sub1(const vector& x){
    double ans = 0;
    for(auto it : x) ans += it;
    return (ans>=4.0);
}
// 约束1梯度
vector get_sub1_grad(const vector& x){
    vector ans;
    double coef = 1.0 / sqrt(2.0);
    for(auto it : x) ans.push_back(coef);
    return ans;
}

vector get_targte_grad(const vector& x){
    vector grad;
    int m = A.size(),n = A[0].size();
    double coef = 0.0;
    for(int i=0;i& grad,const vector& d){
    auto tmp = get_targte_grad(d);
    for(int i=0;i& x){
    stack sk;
    for(int i=0;i d;
    for(auto it : grad) d.push_back(-it);
    if(!sk.empty()){
        int idx = sk.top();
        sk.pop();
        auto tmp = sub_to_grad[idx](x);
        for(int i=0;i x = {1,4.5};
    sub_to.push_back(sub1);
    sub_to_grad.push_back(get_sub1_grad);
    for(int i=1;i<=10;++i){
        cout<<"-------------------------"<

运行结果

最优化方法----有约束优化问题C++实现_第1张图片

迭代到第十五次接近理论上的最优值[2.666666666,1.333333333]

你可能感兴趣的:(最优化方法)