Lingo解决优化问题
前言
前面,我们已经对Lingo有了一定的了解,但是要想真正的熟悉Lingo在解决优化问题中的强大之处,还需要不断加强相关训练,本文主要是使用Lingo来解决优化问题,该文的主要目的有以下三点:
- 希望能够提升自己对Lingo的相关操作并加强对优化问题的思维模式
- 方便日后对Lingo核心操作的回顾
- 希望每一位到来的朋友能够有所收获
一、优化模型介绍
优化模型主要有三个基本要素:决策变量、目标函数、约束条件。其一般形式如下:
opt o p t 是“optimize”的缩写,表示“最优化”,一般为 min m i n 或 max m a x , f(x) f ( x ) 表示目标函数, s.t. s . t . 是“subject to”的缩写“受约束于”, hi(x),gi(x) h i ( x ) , g i ( x ) 则表示约束条件,其中 x x 表示优化模型的决策变量。
二、运输问题
2.1 问题描述
Question:有三个生产地和四个销售地,其生产量、销售量及单位运费如表所示,求总运费最少的运输方案以及总运费。
2.2 问题分析
由题意,我们不难看出优化模型的决策变量是每个生产地向各个销售地运输的货量,即 。运输的总费用由各个产地向各个销售地运输所需费用之和,一个产地可以向多个销售地运输货物,一个销售地亦可接受多个产地的货物,所以可知优化模型中的目标函数是运输的总费用,即 W=∑3i=1∑4j=1sijxij W = ∑ i = 1 3 ∑ j = 1 4 s i j x i j 。除此之外,该目标函数受到两个限制,即优化模型的约束条件:
- 生产地限制:每个生产地的运输量理应小于产生量, ∑4j=1sij≤ai ∑ j = 1 4 s i j ≤ a i
- 销售地限制:每个销售地接受的货物理应等于销售量, ∑3i=1xij=bj ∑ i = 1 3 x i j = b j
2.2 优化模型构建
有以上问题分析,为求出总运费最小的方案,我们可以构建该问题的优化模型如下:
2.3 模型求解
求解的Lingo代码如下:
sets:
supply/1..3/: s; !定义运输集,集中的每个元素都有对应的属性,即运输量s;
demand/1..4/: d; !定义需求集,集中的每个元素都有对应的属性,即需求量d;
link(supply, demand): p, x; !定义link衍生集,每个元素中都有两个属性,运费p,运输量x;
endsets
data:
s = 30 25 21; !定义数据集s,表示生产量;
d = 15 17 22 12; !定义数据集d,表示销售量;
p = 6 2 6 7 !定义数据集p,表示生产地向销售地所对应的运费;
4 9 5 3
8 8 1 5;
enddata
min = @sum(link(i,j): p(i,j)*x(i,j)); !目标函数;
@for(supply(i): @sum(demand(j): x(i,j)) <= s(i)); !生产地限制约束条件;
@for(demand(j): @sum(supply(i): x(i,j)) = d(j)); !销售地限制约束条件;
2.4 求解结果
运行如上所示Lingo程序,我们可以得到如下结果:
通过上图展示,我们可以得到运输的最佳方案以及最小运费161个单位。运输方案图示如下: