实例解释在lingo中使用集合模型

简介: 实例解释在lingo中使用集合模型

某部门有三个生产同一产品的工厂(产地),生产的产品运往四个销售点(销地)出售,各个工厂的生产量、各销地的销量(单位:吨)、从各个工厂到各个销售点的单位运价(元/吨)如下表,研究如何调运才能使得总运费最小。

【数学模型】

 

如果此模型扩展到有50个产地和100个销售地的规模,从理解问题的角度看,就是让i=1,2,…,50;j=1,2,…,100就行了,但是为了让计算机处理,还是按照前面的一行一个语句逐字逐句地输入,工作量就太大了。Lingo就有节约时间的输入方式,且计算机也能理解,那就是集合式输入法


1、集合(下标)部分

这一部分定义集合(数组)以及属性(也就是只与这些下表有关的决策变量(符号变量))

规范格式

sets:
chandi/1,2,3/:a;
endsets

这样就定义了集合chandi={1,2,3},对应的属性(只与这个下标有关的量)a,于是上述语句就定有了a(1),a(2),a(3)这三个变量名(可能是决策变量,也可能是已知量),表示是三个产地的产量。

在计算过程中,只要出现chandi,就表示按顺序取值于1,2,3。

上面的集合定义,如果集合元素比较多,则采用下面的定义方式

sets:
chandi/1..3/:a;
endsets

如果是

sets:
chandi/1..50/:a;
endsets 

那就定义了50个变量名a(1),a(2),…,a(50)。

而上例中,有三个产地(及其产量),四个销售地(及其相应的销量),则可以如下定义

这样就定义了chandi这个集合,与这个集合有关的属性a,xiaodi这个集合,与这个集合有关的属性b,直接定义了a(1),a(2),a(3),b(1),b(2),b(3),b(4),这样直接定义的集合称为基本集合。

上例中,还有形如x12,c12这样的变量名如何定义呢?这样的变量既与产地有关,又与销地有关,于是就由chandi这个集合与xiaodi这个集合联合生成一个笛卡尔集,称为派生集合(关联变量的下标范围):

sets:
chandi/1..3/:a;
xiaodi/1..4/:b;
link(chandi,xiaodi):x,c;
endsets

这样就增加了一个新的集合link,它由chandi和xiaodi两个集合生成,从数学看

与之有关的属性为x,c,就定义了如下变量名

x(1,1),x(1,2),x(1,3),x(1,4) x(2,1),x(2,2),x(2,3),x(2,4) x(3,1),x(3,2),x(3,3),x(3,4)

c(1,1),c(1,2) ,c(1,3),c(1,4) c(2,1),c(,2,2),c(2,3),c(2,4) c(3,1),c(3,2) ,c(3,3),c(3,4)

2、数据部分

这部分格式:

data:
a=16,10,22;
b=8,14,12,14;
c=4 12 4  11
  2 10 3  9
  8 5  11 6;
enddata

 以”data:”开始,以“enddata”结束。不管变量是行还是列,都采用行写,行元素之间可以逗号“,”隔开,也可以空格隔开。而矩阵输入时,先行后列,每行输入完毕,就回车(enter),再输入一行,直到输入完毕,再分号“;”每个变量的数据输入完毕,都用分号“;”结束。

3、模型部分

这部分要把模型的约束和目标函数全部反应出来,如下约束

即对每个产地i(i=1,2,3)来说,从这里运往各个销地(j=1,j=2,j=3,j=4)的运输量之和:x(i,1)+x(i,2)+x(i,3)+x(i,4)不超过产地i 的产量a(i),即x(i,1)+x(i,2)+x(i,3)+x(i,4)<= a(i),    i=1,2,3

翻译为lingo程序语言:

@for(chandi(i):@sum(xiaodi(j): x(i,j))<=a(i));

实际就是其它程序语言的for循环结构的打包形式!

按照上面的分析方法,对每个销售地来说,调运量总和必须满足销售需求

翻译为lingo程序语言为

@for(xiaodi(j): @sum(chandi(i):  x(i,j)) >= b(j) );

目标是将所有线路的运费求和,并使之最小化,即

翻译为Lingo程序语言,就是

min=    @sum(     link(i,j):    c(i,j)*x(i,j));

注意:以上写法中,注意括号匹配,分号结束。

4、初始值部分

在针对线性规划时,这个部分不需要。但是针对非线性规划,这个部分就有必要了,给出决策值的迭代始点,更容易找到局部最优解,同时,给出不同的初始值,可以尝试寻找不同的局部最优解,然后加以比较,找到较好的局部最优解,作为全局最优解使用。格式为init开始,endinit结束。

举例:

初始值设为x1=0,x2=5

设x1=5,x2=1

 

本例子的总代码

sets:
chandi/1..3/:a;
xiaodi/1..4/:b;
link(chandi,xiaodi):x,c;
endsets
data:
a=16,10,22;
b=8,14,12,14;
c=4 12 4 11
     2 10 3 9
     8 5  11 6;
enddata
@for(chandi(i):@sum(xiaodi(j):x(i,j))<a(i));
@for(xiaodi(j):@sum(chandi(i):x(i,j))>b(j));
min=@sum(link(i,j):x(i,j)*c(i,j));

 


相关文章
|
6月前
编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)
编译原理——构造预测分析表(判断某字符串是否是文法G(E)的句子)
73 0
|
6月前
|
算法 搜索推荐 Java
图计算中的图剪枝算法是什么?请解释其作用和常用方法。
图计算中的图剪枝算法是什么?请解释其作用和常用方法。
47 0
|
6月前
|
Java 图计算
图计算中的图遍历是什么?请解释其作用和常用方法。
图计算中的图遍历是什么?请解释其作用和常用方法。
85 0
|
6月前
|
算法 搜索推荐 数据挖掘
图计算中的图算法有哪些常见的类型?请举例说明每种类型的算法。
图计算中的图算法有哪些常见的类型?请举例说明每种类型的算法。
140 0
|
6月前
|
机器学习/深度学习 算法 vr&ar
【Python强化学习】动态规划法中策略迭代和值迭代求解冰湖问题实战(图文解释 附源码)
【Python强化学习】动态规划法中策略迭代和值迭代求解冰湖问题实战(图文解释 附源码)
132 0
|
11月前
|
算法
lingo中的一些概念解释
lingo中的一些概念解释
100 0
|
存储 数据处理 对象存储
R语言-稀疏矩阵对象格式介绍&重构方法
在单细胞领域,基于稀疏矩阵对于处理 scRNA-seq 表达谱数据这类大型数据是非常必要的,因为构建分析对象的时候稀疏矩阵相比稠密矩阵拥有更高的数据处理效率和速度。本文重点介绍 在R语言平台关于 Matrix包中Sparse Matrix对象的格式, 与Dense Matrix的转换以及重构方法。
500 0
R语言-稀疏矩阵对象格式介绍&重构方法
|
存储 NoSQL API
【Redi设计与实现】第六章:整数集合
【Redi设计与实现】第六章:整数集合
【Redi设计与实现】第六章:整数集合
|
关系型数据库 MySQL 数据库
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
|
机器学习/深度学习 算法 数据挖掘
树模型遇上类别型特征(Python)
在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征。