最优化问题求解及Lingo教程

最优化问题求解及Lingo教程

介绍

Lingo是一款求解最优化问题的软件,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。

LINGO与MATLAB比较

  • MATLAB
    1. 语法严谨,模型必须是标准形式
    2. 内置算法只支持一维下标决策变量
    3. 对于大规模问题,描述方式复杂、不直观
    4. 求解NLP问题需要给出合适的初值估计
    5. 需要自己制定算法
  • LINGO
    1. 模型可以不是标准形式
    2. 支持二维下标决策变量
    3. 大规模问题,运用集合命令可以方便定义带有规律的多个复杂条件
    4. 求解NLP问题不需要给出初值估计
    5. 不需要熟悉、指定算法

最优化问题

首先介绍一下什么是最优化问题。

最优化问题,即在所有可行的方案中选出使得目标最优的方案的实际问题。

优化问题的三要素是:

  • 决策变量
  • 约束条件
  • 目标函数

数学规划/函数优化问题的标准形式

优化问题分类

根据决策变量取值情况不同,分为连续型离散型

根据有无约束条件分为无约束优化带约束优化

根据处理思想方法不同,分为数学规划(函数优化问题)、组合优化、图论与网络流、动态规划、目标优化、模糊优化、随机优化、对策与决策……

Lingo教程

求解LP问题

求解这样一个问题,只需直接输入如下代码,写法基本与数学公式一直,不用改写成标准形式

1
2
3
4
min=2*x1+3*x2;
x1+x2>=350;
x1>=100;
2*x1+x2<=600;

点击🎯图标运行:

LP-Lingo

可以看到直接识别出了问题类型,并找到了全局最优解。

求解MILP问题

@free: 可正可负(默认大于等于0)

@gin:整数

求解IQP问题

一定要在Lingo选项->求解非线性菜单中勾选二次规划识别!!否则会按照INLP问题求解,只能得出局部最优解。

image-20200907165607014

1
2
3
4
max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;
x1+x2<=100;
x1<2*x2;
@gin(x1);@gin(x2);

IQP

运算符

  • 算数运算符 + - * / ^
  • 关系运算符 <(=) = >(=)
  • 逻辑运算符
    • 否定 #NOT#
    • 相等 #EQ#
    • 不等 #NE#
    • 与 #AND#
    • 或 #OR#
    • 大于 #GT#
    • 大于等于 #GE#
    • 小于等于 #LE#
    • 小于 #LT#

数学函数

  • @ABS(x) 绝对值
  • @SIN(x),@COS(x) … 三角函数
  • @EXP(x) 返回$e^x$
  • @LOG(x) 自然对数
  • @SIGN(x) x<0返回-1;否则返回1
  • @FLOOR(x) 返回x靠近0的整数部分,如@FLOOR(1.2)=1,@FLOOR(-2.3)=-2

金融函数

  • $@fpa(r,n)=\sum_{k=1}^n{\frac{1}{\left( 1+r \right) ^k}=}\frac{1-\left( 1+r \right) ^{-n}}{r}$
  • $@fpl(r,n)=\left( 1+r \right) ^{-n}$

概率函数

  • @pbn(p,n,x) 二项分布
  • @pcx(n,x) 卡方分布
  • @pfd(n,d,x) F分布
  • ……

变量界定函数

Lingo变量默认是非负的

  • @bin(x) x=0或1
  • @bnd(L,x,U) $L \le x \le U$
  • free(x) 实数
  • @gin(x) 整数

条件判断函数

@IF(logical_condition,true_result,false_result)

例:分段函数

fx=@if(x #gt# 0,100,2*x)

集合操作函数

  • @in(set_name,index_1[,index_2]) 是否在集合中,返回0/1
  • @wrap(index,limit) 取模,返回 j=index-k*limit=index(mod limit) +1, k为整数,保证j在[1, limit]内
  • @size(set_name) 集合成员个数

集合循环函数

  • @FOR(set_name:constraint_expressions) 对每个元素生成约束
  • @MAX(set_name:expressions) 表达式的最大值
  • @MIN(set_name:expressions) 表达式的最小值
  • @SUM(set_name:expressions) 表达式的和

例:产生序列{1,4,9,16,25}

1
2
3
4
5
6
model:
sets:
number/1..5/:x;
endsets
@for(number(i):x(i)=i^2);
end

例:

1
2
s=@sum(number(i)|i#le# 5: x); !前5个求和
m=@min(number(i)|i#ge# 5: x); !5个之后的最小值

例题

输入输出函数

  • @OLE excel表格读取
  • @file
  • @text

求解状态

  • @status()
  • 0 Global Optimum 全局最优
  • 1 Infeasible 不可行
  • 2 Unbounded 无界
  • 3 Undetermined 不确定
  • 4 Feasible 可行
  • 5 Infeasible or Unbounded
  • 6 Local Optimum 局部最优
  • 7 Locally Infeasible 局部不可行(可行解可能存在,但lingo没找到)
  • 8 Cutoff 目标函数的截断值被达到
  • 9 Numeric Error 算数错误

Lingo建模技巧

  • 尽量使用实数优化,减少整数约束和整数变量
  • 尽量使用光滑优化,少用绝对值、符号函数、多变量求最大/最小值、四舍五入、取整等
  • 尽量使用线性模型,x/y<5改为x<5y
  • 合理设置上下界,尽可能给出变量初始值
  • 参数数量级适当,不同参数数量级差距一般要求小于3

最优化问题求解及Lingo教程

https://blog.luzy.top/posts/2069852828/

作者

江风引雨

发布于

2020-09-05

更新于

2023-01-10

许可协议

CC BY 4.0

评论