实例解释在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));

 


目录
打赏
0
0
0
0
25
分享
相关文章
树模型遇上类别型特征(Python)
在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征。
【组合数学】排列组合 ( 集合组合、一一对应模型分析示例 )
【组合数学】排列组合 ( 集合组合、一一对应模型分析示例 )
227 0
Python编程基础:实验3——字典及集合的使用
Python编程基础:实验3——字典及集合的相关知识点题目练习
309 0
Python编程基础:实验3——字典及集合的使用
计算与推断思维 七、函数和表格
七、函数和表格 原文:Functions and Tables 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 通过使用 Python 中已有的函数,我们正在建立一个使用的技术清单,用于识别数据集中的规律和主题。
1384 0
《C++ Primer》学习笔记:向vector对象添加元素蕴含的编程假定
练习《C++ Primer》中的3.14节时,当敲入: #include #include using namespace std; int main(){ string word; vector text; while (cin >> word) text.
779 0
【计算理论】计算理论总结 ( 上下文无关文法 | 乔姆斯基范式 | 乔姆斯基范式转化步骤 | 示例 ) ★★
【计算理论】计算理论总结 ( 上下文无关文法 | 乔姆斯基范式 | 乔姆斯基范式转化步骤 | 示例 ) ★★
661 0
C语言程序阅读-变量的存储类别、函数及参数
写出程序运行结果,再运行程序进行比较。 (1) #include&lt;stdio.h&gt; int f(int n); int main() { printf("%d\n", f(5)); printf("%d\n", f(8)); return 0; } int f(int n) { sta
1008 0
C++ Primer Plus 第五章答案 循环和关系表达式
只有聪明人才能看见的摘要~( ̄▽ ̄~)~
74 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等