到底什么是非线性规划?

2023-10-27

本文转自新浪博客《到底什么是非线性优化?》作者:那些年的那些偏执
网址:http://blog.sina.com.cn/s/blog_7445c2940102x3x4.html
作者系在读博士生。文章写的非常浅显易懂。本文除转载之外,做简单修改整理,重新编辑公式,并加入个人注释。

你是否也对非线性规划这个领域望而却步?​​​
你是否也在思索非线性规划求解方法的根源?​​​
你是否也苦恼于非线性规划到底在研究什么?
如果你的回答是肯定的,说明我们是一样的。那么,让我们从这里开始,一起尝试去移走上面的三座大山。​


到底什么是非线性规划?​

其实,在上高中的时候我们就已经对非线性规划的求解方法了然于心了。可见,非线性优化并不是我们想的那么困难,只不过在后来由于学习了大量的新知识,而迷失其中。你可能不相信,那么让我们一同回到高中的数学课上。数学老师给了如下的问题:​​ y=x2+2x+1 y = x 2 + 2 x + 1 的最小值是什么?

如何找到上面这个函数的最小值?相信你很快的就能想起上面这个问题的解法,并且求出上面这个函数的极值。而至此,我们已经解决了一个非线性规划的问题。​为什么这么说呢?请看下面的公式:

minxf(x) min x f ( x )

当这个公式中的 f(x) f ( x ) 是一个非线性函数的时候,上面的问题就是一个非线性规划的问题。​也就是说,非线性优化问题是针对一个非线性函数求最值的问题。那么,再让我们回过头看一看数学老师出的问题,这不就是一个非线性优化问题吗?​而且,求解方法也很简单,就是对函数求导,再令导数为零,我们就找到了极值点。可见,非线性优化并不是一个高不可攀的山峰。​

对于有约束条件的问题,如果约束条件是非线性的,那么这个问题也属于非线性规划问题范畴。

那么,我们是否可以对所有的非线性优化问题,都可以用上面的解法呢?很遗憾,对于很多情况,通过导数为零求解析的求出极值点,是做不到的。如下式:​​

f(x,y)=x3+yex+y2+xy+4 f ( x , y ) = x 3 + y ⋅ e x + y 2 + x y + 4

我们对 x,y x , y 分别求偏导,得到:​​
xf(x,y)=3x2+yex+yyf(x,y)=2y+ex+x ∂ ∂ x f ( x , y ) = 3 x 2 + y ⋅ e x + y ∂ ∂ y f ( x , y ) = 2 y + e x + x

我们很难直接的从上面的式子中,求出导数为 0 0 的点。一方面,是因为该函数已经不是初等函数。另一方面,是因为增加了未知数(变量)的个数。为了解决这个难题,我们重新回到数学老师给的问题,如下:​

y=x2+2x+1

这个函数是一个单变量的非线性函数,而且极值点只有一个。即使,增加 x x 的幂次方,不过是增加了几个极值点。我们还是可以通过之前的办法,只不过将每个极值点的值都带回方程进行比较,找到整个函数上的最小值。无论,这个单变量函数如何复杂,都可以画在一个二维坐标中,如下:

复杂的单变量函数

上图中,点x1和点 x3 x 3 是极小值点,点 x2 x 2 是极大值点,而点 x4 x 4 既不是极大值点,也不是极小值点。通过比较我们知道,点 x3 x 3 是全局最小值点,而点 x1 x 1 是局部最小值点。

但是,如果增加函数的自变量个数(维度)会发生什么呢?比如,只再增加一个变量 y y ,此时函数变为f(x,y),而这个函数在x和y的方向上都有多个极值点。这时,我们还能将这个函数表示在三维坐标系下,如下:
多变量函数

此时,极值点的分布就比一维的情况复杂了许多。当变量个数继续增加的时候,极值点的个数会成几何倍增加,显然也就无法通过求解出所有极值点再比较大小的方法,实现对问题的求解。​

如何求解复杂的非线性优化问题?

上面的方法是一种贪心解法,希望直接找到问题的解。俗话说,饭得一口一口吃,不能一口吃个胖子。这里要注意的一点就是,虽然我们不能直接找到导数值为零的点。但是,非线性函数常常是可微的,也就可以计算出每一点的微分。也就是说,既然不能直接找到极值点,我们就应该一步一步的逐渐逼近函数的极值点。​

我们将原问题找 f(x) f ( x ) 的极小值(此处 x x n n 维向量,不是一维的),变为找到fx+Δx)的极小值,再依此迭代多次,逼近 f(x) f ( x ) 的最小值。此时, x x 变为已知,而 Δx Δ x 未知(当然也可以理解为方向,因为 n n 维向量表示了一个方向)。也就是说,我们希望找到一个Δx,使得函数 fx+Δx) f ( x + Δ x ) 在点 f(x) f ( x ) 处取得最小值。那么,一个自然的想法就是将 fx+Δx) f ( x + Δ x ) Δx Δ x 求微分,再令 fx+Δx)=0 f ′ ( x + Δ x ) = 0 就可以找到 Δx Δ x 的值。然而,这其实又回到了上面说的问题,即求 fx+Δx) f ( x + Δ x ) fx) f ( x ) 是一样不可微的。那么怎么办呢?​这就要祭出一个大杀器——泰勒级数展开​(有人称为线性化,其实不太准确。在一阶泰勒的情况下却是是线性的,但是如果加了高阶则不是线性了。)

这一段我认为原作者写的不太好。重写如下:
···
首先我们给定一个起始点 x x (注意,这里的 x x 是一个向量,包含所有自变量)。我们不能直接找到极小值点,那么我们就先观察这个起始点附近一定范围内最小的点。以 x x 为中心,附近的点的函数值可以表示为 fx+Δx) f ( x + Δ x ) 。这样,问题变成了求函数 ψ(Δx)=f(x+Δx) ψ ( Δ x ) = f ( x + Δ x ) 的极小值点。如果我们找到了 ψ(Δx) ψ ( Δ x ) 的极小值点,就可以将这个极小值点设为新的观测点 x x ′ ,再次寻找 x x ′ 附近的极小值点,就这样一步一步靠近真正的函数 f(x) f ( x ) 极值点。
ψ(Δx) ψ ( Δ x ) 仍然不可微,那么如何求函数 ψ(Δx) ψ ( Δ x ) 的极小值点呢?这就要祭出一个大杀器——泰勒级数展开​(有人称为线性化,其实不太准确。在一阶泰勒的情况下却是是线性的,但是如果加了高阶则不是线性了。)

因为,我们求的 fx+Δx) f ( x + Δ x ) 处于 x x 的邻域中,所以就可以用泰勒级数在点 x x 处展开,如下:

ψ(Δx)=f(x+Δx)=f(x)+f(x)Δx+12Δx2f(x)Δx+ ψ ( Δ x ) = f ( x + Δ x ) = f ( x ) + ∇ f ( x ) Δ x + 1 2 Δ x ∇ 2 f ( x ) Δ x + ⋯

是梯度算子符号,可以简单理解为对应一维情况中得求导数。详见维基百科页面。这里原文使用了单变量函数的泰勒展开式,其实用在这里不妥。
在Ceres教程中使用了 ϵ ϵ 而不是 Δx Δ x 表示步进。我认为 ϵ ϵ 更贴切,因为这里的跨度不能太长,即邻域不能太大,否则泰勒展开式的误差过大。

将上式对 Δx Δ x 求导,并令其等于0,得到:​​

ψ(Δx)=f(x+Δx)=f(x)+2f(x)Δx+ ∇ ψ ( Δ x ) = ∇ f ( x + Δ x ) = ∇ f ( x ) + ∇ 2 f ( x ) Δ x + ⋯

因为上式存在 Δx Δ x 的高阶项,所以还是很难得到上式的解。不过,由于是在点 x x 的邻域内,因此我们可以忽略Δx的高阶项。

  1. 当我们只保留一阶项的时候,得到如下式子:​

    ψ(Δx)=f(x+Δx)=f(x)=J(x) ∇ ψ ( Δ x ) = ∇ f ( x + Δ x ) = ∇ f ( x ) = J ( x )

    上式中的 J(x) J ( x ) 在多维情况下,被称为雅可比矩阵,其实就是对 f(x) f ( x ) 各个变量分别求偏导。接着,一般教材就会直接给出(最速下降)增量 Δx Δ x 的大小,如下:

    Δx=JT(x) Δ x = − J T ( x )

    这个过程其实不太好理解。因为,如果从一维的角度理解,那么此处的 f(x) f ′ ( x ) 只是一个斜率,按理说斜率的多少跟 Δx Δ x 的值是无关的,只要 Δx Δ x 值不要太大保证在邻域内就可以。所以,直接得出上面的式子就感觉很诡异。​其实,换一个角度解释上面的式子就很容易理解。这里让 Δx Δ x 等于负梯度,重点并不在于大小,而是规定了 Δx Δ x 的方向。其实,即使在一维问题里,我们也可以这么理解, Δx=k Δ x = − k ,此处的 k k 只用于提供方向,也就是正负号,而不代表走多远。​对于多维情况更是如此,因为我们需要知道增量的方向,而方向是由Δx各维度(相对)大小决定的。其实,一个更清晰的表示应该是将梯度归一化,然后再乘以一个步长系数 λ λ ,如下所示:​

    Δx=λJT(x)|JT(x)| Δ x = − λ J T ( x ) | J T ( x ) |

    ​这个方法也就是我们经常听到的——最速下降法

  2. 如果我们保留到二阶项的时候,得到如下式子:​

    xψ(Δx)=xf(x+Δx)=J+2x2f(x)Δx=J(x)+H(x)Δx=0 ∂ ∂ x ψ ( Δ x ) = ∂ ∂ x f ( x + Δ x ) = J + ∂ 2 ∂ x 2 f ( x ) Δ x = J ( x ) + H ( x ) Δ x = 0

    上式中的 H(x) H ( x ) 被称为Hessian矩阵,而且 J(x) J ( x ) H(x) H ( x ) 在点 x x 的值是已知的,所以上式是一个线性方程组。若上述函数二次可微,即解得:

    这个方法叫作牛顿法

    原文这里应该是笔误了。原文写作H(Δx)=JT,其实括号应该去掉。
    牛顿法需要对目标函数求Hesse矩阵,这会相对复杂一点,但是牛顿法要比最速下降法的收敛速度快。对于无法求得Hesse矩阵的目标函数 f(x) f ( x ) ,可以尝试拟牛顿法。

非线性规划到底研究什么?​

说到这里,你可能会疑惑,既然非线性优化好像通过上面的方法都可以求解,那么为什么还有那么多数学家在研究这个问题。或者说,是不是世间所有非线性规划问题,都可以通过上述方法求解呢?要想回答这个问题,我们需要重新来审视一下上面的求解过程。​

  1. 其实这个过程有个重要的前提,那就是 f(x) f ( x ) 是连续可导。如果 f(x) f ( x ) 这个函数不可导,或者不可微呢?比如说,在SLAM中需要处理姿态估计的问题。而姿态是通过旋转矩阵和平移向量表示的,这显然是不连续的。但是,由于旋转矩阵是一个李群,那么我们可以将其映射到其李代数上。而且,李代数是可以求导的。所以我们就还可以利用非线性优化的方法对姿态进行估计。也就是说对于不连续的函数,我们可以想办法将其变得连续,从而继续用这种方法。​

  2. 上面的解法求得的只是局部最优解,而不能确定是否是全局最优解。因为,这种方法可以说是一种“近视眼”的方法,它只看到下一时刻,在邻域内的最小值,而不能全局的寻找。所以,很容易陷入到局部最优中,或者说最终求出的最优值是跟初始位置极度相关的。即使初始值在同一个位置,也很有可能落入到两个不同的局部最优值中,也就是说这个解是很不稳定的。所以,如何解决这个问题,至今仍然存在很大的挑战。​​

    比如凸优化就可以在一定程度上解决这个问题。凸优化的思想是,如果局部最优就是全局最优,就不存在这个问题了。那么如何将一个非凸的问题转换成凸的呢?或者什么问题就是凸的,什么是非凸的呢?​​

在此,只是粗浅的举了两个例子,其实非线性优化中存在的问题还有很多很多。而且我们在这里只讨论了无约束的情况,而优化问题真实情况往往是存在对变量的约束的。本文只是希望破除我们心中对非线性优化的恐惧,勇敢的迈进非线性优化这道大门。

本人也是半路出家,有很多不严谨的地方,希望大家多包涵,多指正,也欢迎大家在留言中多多交流。


正如原文作者所说,本文旨在抛砖引玉快速入门。对非线性规划问题有个简单快速的认识。但其实真正解决非线性规划问题仍然是非常复杂的。这里推荐一本入门教材《最优化理论与算法(第2版)》(陈宝林,清华大学出版社)。这本教材门槛比较低,从简单的数学概念开始讲起。对各个定理也有详细的证明。而且还有很多的例题帮助理解。也涉及到很多经典算法的讲解,但是根据评论,书中算法比较旧,对新算法新理论的涉及比较少。不过入门有余。网络上有PDF版,下载请自行承担法律风险。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

到底什么是非线性规划? 的相关文章

  • tensorflow导入错误“ImportError: DLL load failed”(已解决)

    毕业论文需要用到tensorflow 然鹅我却卡在了安装 由于各种问题还自身的拖延症与它 斗争 了一周 终于安装成功了 我一定要记录下来这血泪史 这篇笔记也拖了好几天 如果你也遇到下面的问题 就继续往下看吧 直接 pip install t
  • ZYNQ 库函数学习之SPI

    SPI是串行外设接口 Serial Peripheral Interface 的缩写 是一种高速的 全双工 同步的通信总线 并且在芯片的管脚上只占用四根线 节约了芯片的管脚 同时为PCB的布局上节省空间 提供方便 正是出于这种简单易用的特性
  • 如何判断Linux服务器是否被入侵?

    1 如何判断自己的服务器是否被入侵 背景 随着开源产品的越来越盛行 作为一个Linux运维工程师 能够清晰地鉴别异常机器是否已经被入侵了显得至关重要 个人结合自己的工作经历 整理了几种常见的机器被黑情况仅供参考 以下情况是在CentOS 6
  • 浏览器有哪些进程?浏览器进程,渲染进程,网络进程,渲染进程有哪些线程?

    浏览器进程 渲染进程有哪些线程 在浏览器中打开两个页面 会开启几个进程 1个浏览器进程 1个网络进程 一个GPU进程 通常一个Tab页对应一个渲染进程 但有其它情况 1 如果页面中有iframe的话 iframe也会运行在单独的进程中 2
  • 【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真

    模拟CMOS集成电路设计 带隙基准 Bandgap 设计与仿真 前言 一 设计指标 二 电路分析 三 仿真测试 3 1测试电路图 3 2测试结果 1 基准温度系数仿真 2 瞬态启动仿真 3 静态电流仿真 4 线性调整率仿真 5 电源抑制PS
  • C++ STL概述

    STL就是封装好的一些数据结构以及一些算法 C STL 标准模板库 是一套功能强大的 C 模板类 提供了通用的模板类和函数 这些模板类和函数可以实现多种流行和常用的算法和数据结构 如向量 链表 队列 栈 Standard Template
  • 图像检索传统算法学习笔记

    图像检索领域传统算法学习笔记 与组内同学一起找到的一些图像检索传统算法 作一小结 以防忘记 性能统计 传统图像检索算法 CIFAR 10数据集mAP值 编码数不同 LSH局部敏感哈希 0 116 0 131 SH谱哈希 0 124 0 12
  • Cpp学习——类与对象3

    目录 一 初始化列表 1 初始化列表的使用 2 初始化列表的特点 3 必须要使用初始化列表的场景 二 单参数构造函数的隐式类型转换 1 内置类型的隐式类型转换 2 自定义类型的隐式类型转换 3 多参数构造函数的隐式类型转换 4 当你不想要发
  • 懒人式迁移服务器深度学习环境(完全不需要重新下载)

    换服务器了 想迁移原来服务器上的深度学习环境 但又觉得麻烦懒得重新安装一遍anaconda pytorch 有没有办法能不费吹灰之力直接迁移 接下来跟着我一起 懒汉式迁移 本方法适用于在同一内网下的两台服务器之间互相迁移 不在同一局域网下的
  • Qt程序的编译和发布(实验报告)

    实验 1 编译和发布 Qt 程序 目的与要求 掌握创建 Qt 程序的方法 掌握发布 Qt 程序的方法 学会为 Qt 程序添加应用程序图标 了解 Qt 发布需要的 DLL 动态库文 实验准备 搭建好 Qt 开发环境 了解 Qt Creator
  • JavaWeb学习笔记-part1

    互联网通信 什么是互联网通信 两台计算机通过网络实现文件共享行为 就是互联网通信 互联网通信中的角色划分 客户端 用于发送请求的计算机 服务端 用于接受请求 并满足请求的计算机 互联网通信模型 C S通信模型 client software
  • 2022全国职业技能大赛-网络安全赛题解析总结④(超详细)

    2022全国职业技能大赛 网络安全赛题解析总结 自己得思路 模块A 基础设施设置与安全加固 20分 模块B 网络安全事件响应 数字取证调查和应用安全 40分 模块C CTF夺旗 攻击 20分 模块D CTF夺旗 防御 20分 有什么不懂得可
  • centos7 Jumpserver堡垒机部署以及使用详情

    一 跳板机 堡垒机的概念 1 跳板机 跳板机就是一台服务器 运维人员在使用管理服务器的时候 必须先连接上跳板机 然后才能去操控内网中的服务器 才能登录到目标设备上进行维护和操作 跳板机的缺点 仅仅实现服务器登录安全 但是没有实现对于运维人员
  • 【学习笔记】开源中文对话预训练模型调研总结

    开源中文对话预训练模型调研 文章目录 开源中文对话预训练模型调研 1 CDial GPT 主要工作 LCCC数据集 数据清洗策略 基于规则的清洗 基于分类器的清洗 模型 输入表征 训练 2 GPT2 chitchat 3 EVA1 0 WD
  • JavaEE学习记录day11 IO流02 字符流、转换流、Properties集合

    1 字符流 1 1为什么会出现字符流 理解 字符流的介绍 由于字节流操作中文不是特别的方便 所以Java就提供字符流 字符流 字节流 编码表 中文的字节存储方式 用字节流复制文本文件时 文本文件也会有中文 但是没有问题 原因是最终底层操作会
  • API接口开发简述简单示例

    作为最流行的服务端语言PHP PHP Hypertext Preprocessor 在开发API方面 是很简单且极具优势的 API Application Programming Interface 应用程序接口 架构 已经成为目前互联网产
  • MyBatis学习笔记整理详细

    MyBatis笔记 写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也
  • 不在傻傻for循环!完美解决JPA批量插入问题

    前言 jpa在简单的增删改查方面确实帮助我们节省了大部分时间 但是面对复杂的情况就显得心有余而力不足了 最近遇到一个批量插入的情况 jpa虽然提供了saveAll方法 但是底层还是for循环save 如果遇到大量数据插入频繁与数据库交互必然
  • [足式机器人]Part2 Dr. CAN学习笔记-Ch0-1矩阵的导数运算

    本文仅供学习使用 本文参考 B站 DR CAN Dr CAN学习笔记 Ch0 1矩阵的导数运算 1 标量向量方程对向量求导 分母布局 分子布局 1 1 标量方程对向量的导数 1 2 向量方程对向量的导数 2 案例分析 线性回归 3 矩阵求导
  • 监控显卡显存(python代码)

    一 前言 我和我同学的代码 分别占用14G显存 而显卡的显存只有24G 没有办法同时跑 所以 他先跑 我的代码时刻监控显存的使用情况 只要显卡显存大于14G 我的代码就自动启动 二 代码 import pynvml import time

随机推荐

  • 区块链网络层简单介绍

    区块链网络层主要通过 P2P 技术实现分布式网络的机制 网络层包括 P2P 组网机制 数据传播机制和数据验证机制 因此区块链本质上是一个 P2P 的网络 具备自动组网的机制 节点之间通过维护一个共同的区块链结构来保持通信 P2P 主要存在四
  • mariadb 10.5创建用户和修改密码

    不知不觉MariaDB已经更新到10 5 8了 它较10 2和10 3做出的变化还是蛮大的 在mariadb10 5当中 将用户身份验证做了更改 所有用户帐户 密码和全局特权都存储在mysql global priv表中 该mysql us
  • JOCL 开发

    JOCL 介绍 jocl实际上就是对opencl用java语言进行了封装 许多代码都和opencl一样 这一点使得用过opencl的可以非常快的上手 可以到github查看源码 由于java没有指针 所以jocl不得不用Pointer来获取
  • wireshark抓包工具使用教程

    Wireshark是非常流行的网络封包分析软件 可以截取各种网络数据包 并显示数据包详细信息 常用于开发测试过程各种问题定位 本文主要内容包括 1 Wireshark软件下载和安装以及Wireshark主界面介绍 2 WireShark简单
  • 新手往GitHub建立仓库并上传本地文件(详细)

    文章目录 前言 一 创建一个GitHub仓库 二 配置ssh并绑定GitHub账号 1 配置ssh 2 绑定GitHub账号 三 上传文件 四 参考资料 前言 环境 windows 10 git bash GitBash获取 链接 http
  • C++中的lambda表达式用法及示例

    Lambda表达式 也叫lambda函数 或简称lambda 是从C 11开始引入并不断完善的 是能够捕获作用域中变量的匿名函数对象 因为C 是不能嵌套定义函数的 所以lambda就成了我们构造闭包的主要手段 和临时短函数 本文主要展示la
  • AxureRp9画一个注册并登录界面,并验证用户名、密码不能为空,进行相应的提示信息!

    之前用Axure9做了一个关于桔梗网的注册登录的界面 这次把功能补上 注册与登录 一 之前的界面 二 添加跳转和关闭功能 三 在注册界面中 登录界面一样的步骤 验证用户名 密码不能为空 并进行相应的提示信息 四 按下F5 看结果 同理登录界
  • python无法打开excle_无法打开在python cod中创建的excel文件

    我用python代码将一些 csv文件转换为 xls 但现在当我试图打开这些文件时 却出现一个错误 COUNT DIST2 xls无法访问 文件可能已损坏 位于没有响应的服务器上 或者是只读的 我在这个项目中创建了许多其他文件 它们都是 c
  • dubbo集群之Router模块

    dubbo如何集成路由 1 默认路由是怎么设置的 消费者服务启动时 会监听注册中心的变更 所以我调用下面的方法 RegistryDirectory public synchronized void notify List
  • Matlab画时域和频谱图

    data audioread filename wav wavread plot data spectrogram data 8192 7168 8192 44100 yaxis S F T P spectrogram x window n
  • 什么是dll

    DLL的概念 DLL Dynamic Link Library 文件为动态链接库文件 又称 应用程序拓展 是软件文件类型 在Windows中 许多应用程序并不是一个完整的可执行文件 它们被分割成一些相对独立的动态链接库 即DLL文件 放置于
  • 隐藏DLL模块( HideDll)

    void HideDll HMODULE hMod GetModuleHandle MyHook dll PLIST ENTRY Head Cur PPEB LDR DATA ldr PLDR MODULE ldm asm mov eax
  • Unity ref 和out、 params的使用

    相信很多刚接触C 或者unity的同学 都会看到很多这样那样的函数 带有ref out 或者params的参数 今天我就来讲一讲这三者的使用和区别 ref 直接来看看实现的代码 public void UpdateScore ref int
  • 常见Code Review过程中发现的问题

    软件环境 Spring MVC MyBatis 主要体现在两个方面 一个是编码习惯问题 另一个是编码质量的问题 编码习惯主要有日志编写 代码注释以及编码风格的问题 而编码质量则与很多方面相关 比如轮子的使用 数据交互 逻辑精简程度等等 下面
  • jdcob--Could not initialize class com.jacob.com.ComThread

    1 dll 文件 放在tomcat bin 下面 2 dll 文件 放在c windows system32 下面 3 dll jar 文件 放在 WEB INF lib 下面
  • 服务器CPU占用过高如何解决

    1 定位出来使用资源CPU最多的进程 不管是Windows还是linux或者Mac 这个都可以通过任务管理器很快的定位出来 2 定位为什么这个进程耗费CPU资源多 通常的原因有 程序本身本身就是CPU密集型的任务 而且程序正处于工作状态 某
  • VS2019设置easyx图形库

    easyx图形库里面的graphics h头文件非常好用但是VS不能使用怎么办我了教给你设置 让在VS2019上也能愉快的使用easyx图形库 1 下载easyx图形库 我这里提供的是EasyX 2020 百度云链接 https pan b
  • Hibernate Annotation注解和关系映射

    1 Hibernate Annotation关系映射有下面几种类型 1 一对一外键关联映射 单向 2 一对一外键关联映射 双向 3 一对一主键关联映射 不重要 在这不演示 在实际中很少用 使用注解 PrimaryKeyJoinColumn
  • 浅谈游戏被唾弃的原因

    游戏为什么会被唾弃 为什么家长觉得要禁止孩子玩游戏 这是一个很值得深思的问题 今天上课时 大家正好辩论了这一点 我也想说说我的看法 欢迎大家讨论 一起为游戏行业的未来发展寻找一个方向 来自一个梦想成为游戏开发者的请求 首先 有人厌恶游戏的原
  • 到底什么是非线性规划?

    本文转自新浪博客 到底什么是非线性优化 作者 那些年的那些偏执 网址 http blog sina com cn s blog 7445c2940102x3x4 html 作者系在读博士生 文章写的非常浅显易懂 本文除转载之外 做简单修改整