Lingo解决优化问题

@

前言

前面,我们已经对Lingo有了一定的了解,但是要想真正的熟悉Lingo在解决优化问题中的强大之处,还需要不断加强相关训练,本文主要是使用Lingo来解决优化问题,该文的主要目的有以下三点:

  • 希望能够提升自己对Lingo的相关操作并加强对优化问题的思维模式
  • 方便日后对Lingo核心操作的回顾
  • 希望每一位到来的朋友能够有所收获

若您对Lingo的安装及基本操作不是很了解,可暂且移步:Lingo安装Lingo基本操作

一、优化模型介绍

优化模型主要有三个基本要素:决策变量、目标函数、约束条件。其一般形式如下:

$$

opt \ \ \ \ f(x) \

s.t \ \ \ \ h_i(x)=0,\ i=1,2,\cdots,m \

g_j(x)\leq0,\ j=1,2,\cdots,l

$$

$opt$ 是“optimize”的缩写,表示“最优化”,一般为 $min$ 或 $max$,$f(x)$ 表示目标函数,$s.t.$ 是“subject to”的缩写“受约束于”,$h_i(x), g_i(x)$ 则表示约束条件,其中 $x$ 表示优化模型的决策变量。

二、运输问题

2.1 问题描述

Question:有三个生产地和四个销售地,其生产量、销售量及单位运费如表所示,求总运费最少的运输方案以及总运费。

2.2 问题分析

由题意,我们不难看出优化模型的决策变量是每个生产地向各个销售地运输的货量,即 $s_{ij}$。运输的总费用由各个产地向各个销售地运输所需费用之和,一个产地可以向多个销售地运输货物,一个销售地亦可接受多个产地的货物,所以可知优化模型中的目标函数是运输的总费用,即 $W=\sum3_{i=1}\sum4_{j=1}s_{ij}x_{ij}$。除此之外,该目标函数受到两个限制,即优化模型的约束条件:

  • 生产地限制:每个生产地的运输量理应小于产生量,$\sum_{j=1}^4s_{ij}\leq a_i$
  • 销售地限制:每个销售地接受的货物理应等于销售量,$\sum_{i=1}^3x_{ij}=b_j$

2.2 优化模型构建

有以上问题分析,为求出总运费最小的方案,我们可以构建该问题的优化模型如下:

$$

min \ \ \ \ \sum3_{i=1}\sum4_{j=1}s_{ij}x_{ij} \

s.t. \ \ \ \ \sum_{j=1}^4s_{ij}\leq a_i ;;\ \sum_{i=1}^3x_{ij}=b_j \ ;\ s_{ij}\geq0 \ ;

$$

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个单位。运输方案图示如下:

三、待更新

Lingo解决最优化问题的更多相关文章

  1. 使用Lingo增强JMS

    虽然activemq+jencks的jms轻量级解决方案已经很好地在psa中work了,尤其spring的JmsTemplate使得代码更简单,但是还是存在问题. 问题来自暑期做psa的时候,link ...

  2. DeepLearning之路(三)MLP

    DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/articl ...

  3. sicp第1章

    牛顿迭代法求平方: (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) ...

  4. convex optimization

    ##凸优化总结所有这些想法基本是来自于书籍[convex optimization](http://book.douban.com/subject/1888111/),主要包括凸优化的基本理论,主要的 ...

  5. 【机器学习实战】第6章 支持向量机(Support Vector Machine / SVM)

    第6章 支持向量机 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/lates ...

  6. 机器学习之支持向量机(三):核函数和KKT条件的理解

    注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对 ...

  7. 从线性模型(linear model)衍生出的机器学习分类器(classifier)

    1. 线性模型简介 0x1:线性模型的现实意义 在一个理想的连续世界中,任何非线性的东西都可以被线性的东西来拟合(参考Taylor Expansion公式),所以理论上线性模型可以模拟物理世界中的绝大 ...

  8. AI从业者需要应用的10种深度学习方法

    https://zhuanlan.zhihu.com/p/43636528 https://zhuanlan.zhihu.com/p/43734896 摘要:想要了解人工智能,不知道这十种深度学习方法 ...

  9. 支持向量机-完整Platt-SMO算法加速优化

    完整版SMO算法与简单的SMO算法: 实现alpha的更改和代数运算的优化环节一模一样,唯一的不同就是选择alpha的方式.完整版应用了一些能够提速的方法. 同样使用Jupyter实现,后面不在赘述 ...

随机推荐

  1. tp5中分页携带参数的方法

    $list = $model->where(...)->order(.....)->paginate($size, false, [                'query' = ...

  2. 导入项目@Override报错原因及解决办法

    从别人那里拷贝来的项目,在人家的环境里没有错误,可是导入到自己本地工程之后报错,删除掉@Override注解后就不报错,导致该原因的是本地工程的JDK版本未更新. 解决办法:调整JDK版本 如此即可解 ...

  3. Unix shell输入输出重定向

    敲代码的时候,适当地打印出一些进度或者日志信息经常能帮助我们跟踪程序的执行结果.可是,这些结果或者日志打印信息到屏幕上并不能作为以后检查问题的根据.这就是重定向的作用,敲代码的时候,我们能够方便的将相 ...

  4. BZOJ2005:[NOI2010]能量采集(莫比乌斯反演,欧拉函数)

    Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...

  5. 2018 Multi-University Training Contest 4 Problem B. Harvest of Apples 【莫队+排列组合+逆元预处理技巧】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6333 Problem B. Harvest of Apples Time Limit: 4000/200 ...

  6. JDK自带监控工具

    该篇文章,主要是工具普及,告诉大家有这么两款工具,可帮助我们进行JVM调优,及时看到JVM的变化. 不过建议,最好还是对于JVM相关的知识点,有一定的基础和熟悉. JDK自带jconsole.exe和 ...

  7. 二. Python WebDriver环境搭建

    1. 安装Selenium 在命令行中输入: 显示安装成功: 2. 测试例子 打开百度页面并在输入框输入搜索内容(默认为firework) # 1. Selenium默认为Firefox.验证 fro ...

  8. 二十、在Intellij IDEA中使用Debug

    Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方 ...

  9. Python书单

    gitbook.jb51 1.Python基础教程 2.流畅的Python:总有论坛的人吐槽它翻译的还是不太友好,其实真正的差别没有那么大,重要的还是有所收获 3.<Python进阶>译本 ...

  10. Kadane算法

    Kadane算法用于解决连续子数组最大和问题,我们用ci来表示数组a[0...i]的最大和. 观察可以发现当ci-1 < 0时,ci = ai.用e表示以当前为结束的子数组的最大和,以替代数组c ...