整数规划
type
status
date
slug
summary
tags
category
icon
password
Property
 
等式约束优化
type
status
date
slug
summary
tags
category
icon
password
Property
 
有约束非线性优化问题
其中,
 
利用向量进行表示,可写为如下所示的标准型: 其中,
 
满足所有约束条件的点称为可行点,所有可行点组成的集合 称为可行集
 
极大化问题可转化为极小划问题
 

问题描述

这里讨论仅含等式约束的优化问题:
不等式约束优化
type
status
date
slug
summary
tags
category
icon
password
Property
 

卡罗需-库恩-塔克条件(KKT条件)

含不等式约束的优化问题也可以利用拉格朗日乘子法进行求解
向量表示的一般形式的优化问题: 其中,
 
对于一个不等式约束 ,如果在 ,那么称该不等式是处的起作用的约束;如果在 ,那么称该不等式是处的不起作用的约束。按惯例,把等式约束当作总是起作用的约束。
 
满足 ,设 为起作用不等式约束下标集
如果向量 是线性无关的,则称是一个正则点。
 

KKT条件

局部极小点所应该满足的一阶必要条件,也称为卡罗需一库恩一塔克(Karush-Kuhn_Tucker) 条件。
凸优化
type
status
date
slug
summary
tags
category
icon
password
Property
 
把优化问题的可行域限定为凸集。

凸函数

函数 的图像为集合中的点集:
函数的图像可以描绘成 关于 的图形上的点集。
 
函数 的上图(epigraph),记为 ,是集合 中的点集:
函数 的上图 是位于集合 中、在函数 的图像上和图像上方的点集。
notion image
如果函数 的上图是凸集,则函数 是集合 上的凸函数。
如果函数 是集合上的凸函数,则集合是凸集。
 
有约束优化的求解算法
type
status
date
slug
summary
tags
category
icon
password
Property
 
特殊约束条件下的优化问题的求解算法。

投影法

优化问题的通用迭代公式 其中, 是关于 的函数。 的取值不受任何特定集合的限制。由于有约束优化问题要求决策变量必须在预先设定的约束集取值因此这种算法无法直接用于求解有约束优化问题。
 
考虑优化问题:
如果用以上算法解决此约束问题,那么迭代点 的可能不满足约束条件。因此,需要对上述算法进行改进,把约束条件考虑进来。一种比较简单的改进方式就是引人投影:
如果 在约束集 内,则令 ;否则将其投影到 中,并将投影结果作为
 
考虑一种特殊的约束集 约束集 中的一个“方框”,称为框式约束。对于点 ,定义 则点 称为 上的投影, 称为投影算子。 最接近 的点。利用投影算子 ,可对前面的无约束优化问题求解算法进行改进:
多目标优化
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
C与C++
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
从语法上看,C语言是C++ 的一部分,C语言代码几乎不用修改就能够以 C++ 的方式编译。
早期并没有“C++”这个名字,而是叫做“带类的C”,是作为C语言的一个扩展和补充而出现的,增加了很多新的语法,目的是提高开发效率。这个时期的C++非常粗糙,仅支持简单的面向对象编程,也没有自己的编译器,而是通过一个预处理程序(cfront),先将C++ 代码翻译为C语言代码,再通过C语言编译器合成最终的程序
随着 C++ 的流行,它的语法也越来越强大,已经能够很完善的支持面向过程编程、面向对象编程(OOP)和泛型编程,几乎成了一门独立的语言,拥有了自己的编译方式。
很难说 C++ 拥有独立的编译器,例如 Windows 下的微软编译器(cl.exe)、Linux 下的GCC编译器、Mac 下的 Clang 编译器,它们都同时支持C语言和 C++,统称为 C/C++ 编译器。对于C语言代码,它们按照C语言的方式来编译;对于 C++ 代码,就按照 C++ 的方式编译。
表面上看,C、C++ 代码使用同一个编译器来编译,所以说“后期的 C++ 拥有了自己的编译方式”,而没有说“C++ 拥有了独立的编译器”。
 
                                               C语言中项目的组织方式
C语言中项目的组织方式
 
 
                                                      C++中项目的组织方式
C++中项目的组织方式
编译和运行C++
type
status
date
slug
summary
tags
category
icon
password
Property
 
C++和C语言类似,也要经过编译和链接后才能运行
notion image
 
C语言源文件的后缀非常统一,在不同的编译器下都是.cC++ 源文件的后缀则有些混乱,不同的编译器支持不同的后缀:
notion image
 
 

g++ 命令

在C语言中,使用gcc命令来编译和链接C程序,例如编译单个源文件:
 
命名空间
type
status
date
slug
summary
tags
category
icon
password
Property
 
一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。
 
例如小李和小韩都参与了一个文件管理系统的开发,它们都定义了一个全局变量 fp,用来指明当前打开的文件,将他们的代码整合在一起编译时,很明显编译器会提示 fp 重复定义错误。
为了解决合作开发时的命名冲突问题,C++引入了命名空间(Namespace)的概念:
 
namespaceC++中的关键字,用来定义一个命名空间,语法格式为:
name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围
 
使用变量、函数时要指明它们所在的命名空间:
头文件和std命名空间
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
C++是在C的基础上开发的,早期的 C++ 还不完善,不支持命名空间,没有自己的编译器,而是将 C++ 代码翻译成C代码,再通过C编译器完成编译。这个时候的C++ 仍然在使用C语言的库,stdio.hstdlib.hstring.h 等头文件依然有效;此外 C++也开发了一些新的库,增加了自己的头文件,如:
  • iostream.h:用于控制台输入输出头文件
  • fstream.h:用于文件操作的头文件
  • complex.h:用于复数计算的头文件
 
 
C语言一样,C++头文件仍然以.h为后缀,它们所包含的类、函数、宏等都是全局范围的。
后来C++引入了命名空间的概念,计划重新编写库,将类、函数、宏等都统一纳入一个命名空间,这个命名空间的名字就是stdstdstandard 的缩写,意思是“标准命名空间”。
 
但是这时已经有很多用老式 C++ 开发的程序了,它们的代码中并没有使用命名空间,直接修改原来的库会带来一个很严重的后果:程序员会因为不愿花费大量时间修改老式代码而极力反抗,拒绝使用新标准的 C++ 代码。
初识输入输出
type
status
date
slug
summary
tags
category
icon
password
Property
 
C语言通常使用scanfprintf来对数据进行输入输出操作。在C++中,C语言的这一套输入输出库仍然能使用,但是C++又增加了一套新的、更容易使用的输入输出库iostream
 
iostream库包含两个基础类型 istreamostream,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出或写入IO设备的。
它包含了用于输入输出的对象,例如cin表示标准输入、cout表示标准输出、cerr表示标准错误、clog用来输出程序运行时的一般性信息。
使用cout进行输出时需要紧跟<<运算符,使用 cin进行输入时需要紧跟>>运算符,这两个运算符可以自行分析所处理的数据类型,因此无需像使用scanfprintf那样给出格式控制字符串。
 
endl是一个被称为操纵符的特殊值,效果是结束当前行,并将设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。
控制流
type
status
date
slug
summary
tags
category
icon
password
Property
 

while 语句

 
 

for 语句

 
 
读取数量不定的输入数据