Lingo学习心得&2014年研究生数模竞赛E题

来源:互联网 发布:单片机push 编辑:程序博客网 时间:2024/05/01 12:33

第四次数模培训,题目:2014年研究生数学建模竞赛E题。

乘用车物流运输计划问题

前三问:
1. 物流公司要运输Ⅰ车型的乘用车100辆及Ⅱ车型的乘用车68辆。
2. 物流公司要运输Ⅱ车型的乘用车72辆及Ⅲ车型的乘用车52辆。
3. 物流公司要运输Ⅰ车型的乘用车156辆、Ⅱ车型的乘用车102辆及Ⅲ车型的乘用车39辆。

要求制定详细计划,含所需要各种类型轿运车的数量、每辆轿运车的乘用车装载方案、行车路线。(前三问目的地只有一个,可提供一个通用程序)

解决方案:

一、使用matlab将每种轿用车的满载方案求出来
I-I型轿用车

clear all;clc;m = 1;for a = 0:4    %1型车    for b = 0:5 %2型车        if (19- (a*4.71+b*3.715) ) <= 3.715&&(a*4.71+b*3.715)<=19            Up(m,1) = a;            Up(m,2) = b;            Up(m,3) = 0;            m = m + 1;        end    endendn = 1;for a= 0:4    for b = 0:5        for c = 0:4            if (a*4.71+b*3.715+c*4.73)<=19&&(19-(a*4.71+b*3.715+c*4.73))<=3.715                Down(n,1) = a;                Down(n,2) = b;                Down(n,3) = c;                n = n +1;            end        end    endendk = 1;for i = 1:5    for j = 1:15        Total(k,1) = Up(i,1);        Total(k,2) = Down(j,1);        Total(k,3) = Up(i,1)+Down(j,1);        Total(k,4) = Up(i,2);        Total(k,5) = Down(j,2);        Total(k,6) = Up(i,2)+Down(j,2);        Total(k,7) = Up(i,3);        Total(k,8) = Down(j,3);        Total(k,9) = Up(i,3)+Down(j,3);        k = k + 1;    endend

I-II型轿用车

clear all;clc;m = 1;for a=0:5    for b=0:6        for c=0:5            if (a*4.71+b*3.715+c*4.73)<=24.3&&(24.3-(a*4.71+b*3.715+c*4.73))<=3.715                Down(m,1)=a;                Down(m,2)=b;                Down(m,3)=c;                m = m + 1;            end        end    endendn =1;for a=0:5    for b=0:6                  if (a*4.71+b*3.715)<=24.3&&(24.3-(a*4.71+b*3.715))<=3.715                Up(n,1)=2*a;                Up(n,2)=2*b;                Up(n,3) = 0;                n = n + 1;            end           endendk = 1;for i = 1:6    for j = 1:22        Total(k,1) = Up(i,1);        Total(k,2) = Down(j,1);        Total(k,3) = Up(i,1)+Down(j,1);        Total(k,4) = Up(i,2);        Total(k,5) = Down(j,2);        Total(k,6) = Up(i,2)+Down(j,2);        Total(k,7) = Up(i,3);        Total(k,8) = Down(j,3);        Total(k,9) = Up(i,3)+Down(j,3);        k = k + 1;    endend

将每种方案中的三种车的数量算出来,并存储到一个txt文件中。

接下来就是用Lingo进行线性规划

代码如下

model:    sets:    YI/1..75/:x1,y1,z1,m;    ER/1..132/:x2,y2,z2,n;    endsets    data:    x1 = @file('C:\Users\Desktop\1.txt');    y1 = @file('C:\Users\Desktop\1.txt');    z1 = @file('C:\Users\Desktop\1.txt');    x2 = @file('C:\Users\Desktop\1.txt');    y2 = @file('C:\Users\Desktop\1.txt');    z2 = @file('C:\Users\Desktop\1.txt');    enddata     @sum(YI(I):x1(I)*m(I))+@sum(ER(J):x2(J)*n(J)) = 39;     @sum(YI(I):y1(I)*m(I))+@sum(ER(J):y2(J)*n(J)) = 0;     !第一问;     !@sum(YI(I):x1(I)*m(I))+@sum(ER(J):x2(J)*n(J)) >= 100;     !@sum(YI(I):y1(I)*m(I))+@sum(ER(J):y2(J)*n(J)) >= 68;     !第二问;     !@sum(YI(I):y1(I)*m(I))+@sum(ER(J):y2(J)*n(J)) >= 72;     !@sum(YI(I):z1(I)*m(I))+@sum(ER(J):z2(J)*n(J)) >= 52;     !第三问;     !@sum(YI(I):x1(I)*m(I))+@sum(ER(J):x2(J)*n(J)) >= 156;     !@sum(YI(I):y1(I)*m(I))+@sum(ER(J):y2(J)*n(J)) >= 102;       !@sum(YI(I):z1(I)*m(I))+@sum(ER(J):z2(J)*n(J)) >= 39;     !@sum(ER(I):n(I)) <= 0.2*@sum(YI(J):m(J));     min = @sum(ER(I):n(I)) + @sum(YI(J):m(J));    @for(YI:@gin(m));    @for(ER:@gin(n));end

Lingo学习的总结:
1、集的理解

    sets:    YI/1..75/:x1,y1,z1,m;    ER/1..132/:x2,y2,z2,n;    endsets

在sets 和 endsets命令中设置集,集给人的体验就是首先有一个集的名称,紧接着在集名称后面接上/ /,双斜杠中的内容称之为集的成员,接上:后就是集的属性,这样一个集就生成了。
其感觉就像是集的属性相当于几个数组,而数组的大小就是集成员的大小,而且这个数组的地址不是数字,就是集的成员,比如集的成员为/mon..sun/,那么这个集的属性A就是A[mon]~A[sun]。

2、Lingo中数据的定义

data:    x1 = @file('C:\Users\njut\Desktop\1.txt');    y1 = @file('C:\Users\njut\Desktop\1.txt');    z1 = @file('C:\Users\njut\Desktop\1.txt');    x2 = @file('C:\Users\njut\Desktop\1.txt');    y2 = @file('C:\Users\njut\Desktop\1.txt');    z2 = @file('C:\Users\njut\Desktop\1.txt');enddata

在lingo中数据的定义是在data: 和 enddata中完成的,数据的内容基本上是集的属性,在上述例子中我用到了一个@file函数,这个函数就是lingo中的读取文本文件的函数,其用法就是@file(‘文件地址\文件名.txt’),在txt中的数据要用~分开。其意思就是说我每读取一次文件,读取到~位置就停止,当下一次读取这个文件的时候,从上次的~读取到下次的~之间的数据。

3、@sum的使用
@sum函数一般使用在求和上,其用法就是@sum(集名:要求和的函数)。
其中,如果是对这个集中某个属性的部分数据进行求和,那么可以在集名后加上或符号再跟上你要约束的条件,即:集名|约束条件

4、@for的使用
@for函数一般用于约束条件的定义,如果约束条件过多,且具有一定的相似性,那么就可以中@for函数来声明。使用案例:

@for(YI:@gin(m));

比如上述的代码中,YI代表你要循环声明的集,或者是范围,跟上:,后面接上你要循环的内容,在上述的代码中我的意思就是声明YI这个集的属性m全为整数。

0 0
原创粉丝点击