首页 > 其他分享 >非线性优化-NLopt

非线性优化-NLopt

时间:2023-02-14 16:57:24浏览次数:29  
标签:std opt NLopt data 非线性 grad vector nlopt 优化

通过 对 一个 数学 模型 的求解 来介绍 NLopt的使用方法

数学模型:

这个是目标函数 求满足 条件的情况下 x2的开平方最小

边界约束

非线性不等式约束如下

有两个参数 x1 和 x2 ,其中 a和b是模型的参数可以设为任意的固定值,这个模型设为a1=2,b1=0,a2=-1,b2=1

绘制这两条曲线 如下图

可行性区域在交汇的上方,最优点在交汇处,最优值大约为0.5443

下面通过NLopt的方式来求解这个数学模型。

通过图片上的曲线可以看出,x2>0的约束没有什么用,因为可行性区域的都在0之上
但是在使用NLopt的时候最好也把这个条件加上去。

nlopt.cc

#include <nlopt.hpp>
#include <iostream>
#include <math.h>
using namespace std;
int count = 0;
typedef struct {
    double a, b;
} my_constraint_data;
double myfunc(const std::vector<double>& x, std::vector<double>& grad, void *my_func_data)
{

    count++;
    if(!grad.empty())
    {
        grad[0] = 0.0;
        grad[1] = 0.5 / sqrt(x[1]);
    }
    return sqrt(x[1]);
}

double myconstraint(const std::vector<double>& x, std::vector<double>& grad, void *data)
{
    //声明对应外部数据刚定义的结构体 数据 然后赋值就可以了
    my_constraint_data *d = (my_constraint_data *) data;
    //获得a和b
    double a = d->a, b = d->b;
    if(!grad.empty())
    {
        grad[0] = 3 * a * (a*x[0] + b) * (a*x[0] + b);//对x0求偏导
        grad[1] = -1.0;//对x1求偏导
    }
    return ((a*x[0] + b) * (a*x[0] + b) * (a*x[0] + b) - x[1]);//返回 不等函数
 }

int main()
{
    my_constraint_data data[2] = { {2,0}, {-1,1} };//不等式的外部参数  上面定义的结构体
    nlopt::opt opt(nlopt::LD_SLSQP, 2);
    opt.set_min_objective(myfunc, NULL);
    opt.add_inequality_constraint(myconstraint, &data[0], 1e-8);
    opt.add_inequality_constraint(myconstraint, &data[1], 1e-8);
    opt.set_xtol_rel(1e-4);
        /*优化参数的边界约束*/
    std::vector<double> lb {0.1,0.1};//注意参数的个数要对应上
    std::vector<double> ub {10000,10000};//注意参数的个数要对应上
        //设置 参数 边界
    opt.set_lower_bounds(lb);//设置参数下限
    opt.set_upper_bounds(ub);//设置参数上限


    std::vector<double> x(2);
    x[0] = 2.5;
    x[1] = 4.3;
    double minf;
    
    std::cout << "start optimize" << std::endl;
    nlopt::result result = opt.optimize(x, minf);
    std::cout << "count:" << count << endl;
    std::cout << "found minimum at x1:" << x[0] << "x2:" << x[1] << "minf:" << minf << std::endl;

    return 0; 
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(nloptDemo)

find_package(Eigen3 REQUIRED)

find_package(
  nlopt
)

include_directories( 
    ${Eigen3_INCLUDE_DIRS} 
    ${nlopt_INCLUDE_DIRS}
)

link_directories(${nlopt_LIBARIES})
add_definitions(${nlopt_DEFINITIONS})

set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS} -O0 -Wall")

add_executable(nloptDemo nlopt.cc)
target_link_libraries( nloptDemo
    ${nlopt_LIBRARIES} 
    )  

运行结果:

start optimize
count:9
found minimum at x1:0.333333x2:0.296296minf:0.544331

经过实验,发现初值对程序运行比较重要

标签:std,opt,NLopt,data,非线性,grad,vector,nlopt,优化
From: https://www.cnblogs.com/penuel/p/17120117.html

相关文章

  • TDengine 3.0.2.5 查询再优化!揭秘索引文件的工作原理
    TDengine 3.0虽然对底层做了大规模的优化重构,但是相对于数据文件的工作逻辑和2.0相比是整体保持不变的。本系列文章的主旨在于帮助用户深入理解产品,并且拥有基本的性......
  • jvm优化base java GC垃圾回收
    OutOfMemoryError错误Java堆内存的OutOfMemoryError异常是实际应用中常见的内存溢出异常情况。当出现Java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着......
  • nginx开启Gzip压缩,Vue性能优化之使用gzip压缩打包
    一、前言不管是vue项目还是react项目在使用webpack打包之后都会生成一个动辄一两兆甚至更大的js文件,在某些情况下严重影响项目性能,打开页面的时候白屏时间会很长,本文将介绍......
  • Nginx优化HTTPS提速30%
    在上一篇文章我们已经通过HTTP缓存优化静态文件访问速度,今天我们再来聊聊 HTTP协议优化 的问题。HTTP协议优化主要分为开启HTTP/2和ssl缓存优化,下面我们单独对这两种......
  • Cash Machine (POJ 1276)(多重背包——二进制优化)
    链接:POJ-1276题意:给你一个最大金额m,现在有n种类型的纸票,这些纸票的个数各不相同,问能够用这些纸票再不超过m的前提下凑成最大的金额是多少?题解:写了01背包直接暴力,结......
  • GaussDB(DWS)性能调优:indexscan导致的性能问题识别与优化
    摘要:通常跑批加工场景下,都是大数量做关联操作,通常不建议使用索引。有些时候因为计划误判导致使用索引的可能会导致严重的性能问题。本文从一个典型的索引导致性能的场景重......
  • ClickHouse 查询优化详细介绍
     你想要的ClickHouse优化,都在这里。ClickHouse是OLAP(Onlineanalyticalprocessing)数据库,以速度见长[1]。ClickHouse为什么能这么快?有两点原因[2]:架构优越......
  • maven 工程pom依赖优化及常用命令
    本文为博主原创,转载请注明出处:1.mvndependency:list----列出项目的所有jar包mvndependency:list-Dverbose该命令可以列出项目依赖的所有jar包,-Dverbose参数......
  • Spark性能优化
    参考博客之一:https://tech.meituan.com/2016/04/29/spark-tuning-basic.html参考博客之一:https://tech.meituan.com/2016/05/12/spark-tuning-pro.html上面是非常好的博......
  • m基于GA遗传优化的三维工程施工设施布局算法matlab仿真,显示二维和三维布局优化效果
    1.算法描述GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”......