化归为lingo来解决的问题

 

哪些数学建模题目可以化归为lingo来解决,它们有哪些特点?这是即将参加数模竞赛的我们关心的问题.这份总结是书本知识和对真题分析的结果。

 

一 、 下料问题

    此类问题包括一个标准材料长约束;各种分割方法的数量约束等;目标是最有分配。

 

例一 每根长19mA B C D 分法各为 4m 5m 6m 8m,数量为50 10 20 15根。要求不同下料方式不超过3种。求最优下料。

解: 设标准长L=19m,分割长为 ,标准数量为 为第i种切割方法所切割钢管数量。第i种下料方法得到部件j的数目为

                            min

                         s.t.

编写代码:

MODEL:

    SETS:

       SUBLEN/1..4/:L,D;

       CUTMETHOD/1,2,3/:X;

       LINKS(CUTMETHOD,SUBLEN):N;

    ENDSETS

    DATA:

       L=  4 5 6 8;

       D=  50 10 20 15;

    ENDDATA

    MIN=@SUM(CUTMETHOD:X);

    @FOR(SUBLEN(J):@SUM(CUTMETHOD(I):N(I,J)*X(I))>=D(J));

    @FOR(CUTMETHOD(I):@SUM(SUBLEN(J):L(J)*N(I,J))>15);

    @FOR(CUTMETHOD(I):@SUM(SUBLEN(J):L(J)*N(I,J))<19);

@FOR(CUTMETHOD:@GIN(X));

@FOR(LINKS:@GIN(N));

END

结果

  Local optimal solution found at iteration:           3010

  Objective value:                                 28.00000

                       N( 1, 1)        3.000000            0.000000

                       N( 1, 2)        0.000000            0.000000

                       N( 1, 3)        1.000000            0.000000

                       N( 1, 4)        0.000000            0.000000

                       N( 2, 1)        2.000000            0.000000

                       N( 2, 2)        1.000000            0.000000

                       N( 2, 3)        1.000000            0.000000

                       N( 2, 4)        0.000000            0.000000

                       N( 3, 1)        0.000000            0.000000

                       N( 3, 2)        0.000000            0.000000

                       N( 3, 3)        0.000000            0.000000

                       N( 3, 4)        2.000000            0.000000

   该问题小结:此类问题可以直接化归为lingo解。

练习:   p67 11

 

解:标准长L=5500mm,分割长为 ,标准数量为 为第i种切割方法所切割钢管数量。第i种下料方法得到部件j的数目为

本题下料方法可以穷尽,但不手工穷尽。设共有m种下料方法

 

                            min

                         s.t.

 

得到m值的问题是背包问题,同时得到 的情况。

若采取例题中采用的方法,编写程序:

MODEL:

    SETS:

       SUBLEN/1..4/:L,D;

       CUTMETHOD/1..11/:X;

       LINKS(CUTMETHOD,SUBLEN):N;

    ENDSETS

    DATA:

       L=  2640 1651 1770 1440;

       D=  80 350 420 200;

    ENDDATA

    MIN=@SUM(CUTMETHOD:X);

    @FOR(SUBLEN(J):@SUM(CUTMETHOD(I):N(I,J)*X(I))>=D(J));

    @FOR(CUTMETHOD(I):@SUM(SUBLEN(J):L(J)*N(I,J))>4060);

    @FOR(CUTMETHOD(I):@SUM(SUBLEN(J):L(J)*N(I,J))<5500);

@FOR(CUTMETHOD:@GIN(X));

@FOR(LINKS:@GIN(N));

END

运算35小时后得到可行解:

 

 

 

                       Variable           Value        Reduced Cost

                         

                       N( 1, 1)        2.000000            0.000000

                       N( 1, 2)        0.000000            0.000000

                       N( 1, 3)        0.000000            0.000000

                       N( 1, 4)        0.000000            0.000000

                       N( 2, 1)        0.000000            0.000000

                       N( 2, 2)        0.000000            0.000000

                       N( 2, 3)        1.000000            0.000000

                       N( 2, 4)        2.000000            0.000000

                       N( 3, 1)        0.000000            0.000000

                       N( 3, 2)        0.000000            0.000000

                       N( 3, 3)        3.000000            0.000000

                       N( 3, 4)        0.000000            0.000000

                       N( 4, 1)        0.000000            0.000000

                       N( 4, 2)        2.000000            0.000000

                       N( 4, 3)        1.000000            0.000000

                       N( 4, 4)        0.000000            0.000000

                       N( 5, 1)        0.000000            0.000000

                       N( 5, 2)        2.000000            0.000000

                       N( 5, 3)        1.000000            0.000000

                       N( 5, 4)        0.000000            0.000000

                       N( 6, 1)        0.000000            0.000000

                       N( 6, 2)        1.000000            0.000000

                       N( 6, 3)        2.000000            0.000000

                       N( 6, 4)        0.000000            0.000000

                       N( 7, 1)        0.000000            0.000000

                       N( 7, 2)        2.000000            0.000000

                       N( 7, 3)        1.000000            0.000000

                       N( 7, 4)        0.000000            0.000000

                       N( 8, 1)        0.000000            0.000000

                       N( 8, 2)        2.000000            0.000000

                       N( 8, 3)        1.000000            0.000000

                       N( 8, 4)        0.000000            0.000000

                       N( 9, 1)        0.000000            0.000000

                       N( 9, 2)        1.000000            0.000000

                       N( 9, 3)        1.000000            0.000000

                       N( 9, 4)        1.000000            0.000000

                      N( 10, 1)        0.000000            0.000000

                      N( 10, 2)        0.000000            0.000000

                      N( 10, 3)        2.000000            0.000000

                      N( 10, 4)        1.000000            0.000000

                      N( 11, 1)        2.000000            0.000000

                      N( 11, 2)        0.000000            0.000000

                      N( 11, 3)        0.000000            0.000000

                      N( 11, 4)        0.000000            0.000000

 

                            Row    Slack or Surplus      Dual Price

                              1        364.0000           -1.000000

                            

这个显然是不行的。在解决本类题目的时候,需要预先将所有可能出现的情况都穷举出来,然后在这个基础之上做线性规划。当然,我们也有不用穷举的方法:

其实本题在求有多少种划钢材的方式是一个典型的找零钱问题,它的schema程序为:

 

(define (first-denomination kinds-of-iron)

  (cond ((= kinds-of-iron 1)1440)

        ((= kinds-of-iron 2)1651)

        ((= kinds-of-iron 3)1770)

        ((= kinds-of-iron 4)2640)

))

(define (cc amount kinds-of-iron)

  (cond((< amount 1440)1)

       ((or(< amount 0)(= kinds-of-iron 0))0)

       (else (+ (cc amount(- kinds-of-iron 1))

                (cc(- amount(first-denomination kinds-of-iron))

                kinds-of-iron)))))

(define(count-type amount)

(cc amount 4))

 

结果为14.但是现在我还写不出来所有具体的情况,只能算出有多少情况(这对于非线性优化是有用的)。解决题目,还是穷举的方法:

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

A

2

1

1

1

0

0

0

0

0

0

0

0

0

0

B

0

1

0

0

0

1

0

2

1

0

3

2

1

0

C

0

0

1

0

3

2

2

1

1

1

0

0

0

0

D

0

0

0

1

0

0

1

0

1

2

0

1

2

3

 

带入lingo,解决题目

MODEL:

    SETS:

       irons/1,2..14/:x;

    ENDSETS

    @FOR(IRONS:@GIN(X));

    MIN=X1+X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12+X13+X14;

    2*X1+X2+X3+X4>=2640;

    X2+X6+2*X8+X9+3*X11+2*X12+X13>=1651;

    X3+3*X5+2*X6+2*X7+X8+X9+X10>=1770;

    X4+X7+X9+2*X10+X12+2*X13>=1440;

END

 

 

结果为:

  Global optimal solution found at iteration:             2

  Objective value:                                 2940.333

 

 

                       Variable           Value        Reduced Cost

                             X1        1320.000            0.000000

                             X2        0.000000           0.1666667

                             X3        0.000000           0.1666667

                             X4        0.000000           0.1666667

                             X5        590.0000            0.000000

                             X6        0.000000            0.000000

                             X7        0.000000            0.000000

                             X8        0.000000            0.000000

                             X9        0.000000            0.000000

                            X10        0.000000            0.000000

                            X11        310.3333            0.000000

                            X12        0.000000            0.000000

                            X13        720.0000            0.000000

                            X14        0.000000            1.000000

                                            

 

二 、 配料问题

       该问题是一个整形规划,所以具有独特的特点。

例二  书本例1.7.3 p53

解略.问题的关键就在于整形规划的特点。但是在大数据量不可手工穷尽的时候怎样解决,这是就要考虑的问题。怎样将数据链接过来?是通过数据库还是其他东西。

 

                                                          、指派问题&装箱问题

 

此类问题有一个显著的特点就是都为0-1规划,比如一个人只能做一件工作;同时一个工作只能由一个人来完成。

例三  分配给甲乙丙丁戊去完成A B C D E五项工作,每人完成一项,每项工作一人完成。五人完成认为所需时间如表,做出任务分配时间最少优化。

 

 

A

B

C

D

E

8

6

10

9

12

9

12

7

11

9

7

4

3

5

8

9

5

8

11

8

4

6

7

5

11

 

解:MODEL:

    SETS:

       WORKERS/W1..W5/;

       JOBS/J1..J5/;

       LINKS(WORKERS,JOBS):D,X;

 

    ENDSETS

    DATA:

       D=

          

8

6

10

9

12

9

12

7

11

9

7

4

3

5

8

9

5

8

11

8

4

6

7

5

11

;

    ENDDATA

    MIN=@SUM(LINKS:D*X);

    @FOR(WORKERS(I):@SUM(JOBS(J):X(I,J))=1);

    @FOR(JOBS(J):@SUM(WORKERS(I):X(I,J))=1);

    @FOR(LINKS:@BIN(X));

END

结果

  Global optimal solution found at iteration:             0

  Objective value:                                 30.00000

 

 

                       Variable           Value        Reduced Cost

                  

                     X( W1, J1)        1.000000            8.000000

                     X( W1, J2)        0.000000            6.000000

                     X( W1, J3)        0.000000            10.00000

                     X( W1, J4)        0.000000            9.000000

                     X( W1, J5)        0.000000            12.00000

                     X( W2, J1)        0.000000            9.000000

                     X( W2, J2)        0.000000            12.00000

                     X( W2, J3)        0.000000            7.000000

                     X( W2, J4)        0.000000            11.00000

                     X( W2, J5)        1.000000            9.000000

                     X( W3, J1)        0.000000            7.000000

                     X( W3, J2)        0.000000            4.000000

                     X( W3, J3)        1.000000            3.000000

                     X( W3, J4)        0.000000            5.000000

                     X( W3, J5)        0.000000            8.000000

                     X( W4, J1)        0.000000            9.000000

                     X( W4, J2)        1.000000            5.000000

                     X( W4, J3)        0.000000            8.000000

                     X( W4, J4)        0.000000            11.00000

                     X( W4, J5)        0.000000            8.000000

                     X( W5, J1)        0.000000            4.000000

                     X( W5, J2)        0.000000            6.000000

                     X( W5, J3)        0.000000            7.000000

                     X( W5, J4)        1.000000            5.000000

                     X( W5, J5)        0.000000            11.00000

 

  首先可以看到,这里直接用excel作为了输入。当然也可以输入回到excel中去。

 

  lingo解决装箱子问题的时候有个技巧,不过不是很有用。

 

                                                   、最短路径

 

 

例五 如图求各点到T的最短路

 

5

6

7

7

4

9

6

8

6

5

8

3

3

6

C1

B1

C2

B2

A1

A2

A3

T

S

6

 

线性规划的方法解决最短路径问题真是有想法。在计算机算法中有许多为了简化计算而设计的算法,大都比较复杂;然而如果面对的问题是数学,那么重点就不一样了:数学的重点是解决问题,算法的效率是其次的(除非题目本身就是效率题),线性规划几乎就是穷举所有的情况,所以线性规划很大程度上具有通用性。

 

编写代码求解:

MODEL:

SETS:                            ! CITIES表示由1~9组成的集合,是一个基本集合;

  CITIES /1..9/: L;          !属性L(i)表示城市i到城市1的最优行驶路线的路长;

  ROADS(CITIES, CITIES)/     ! ROADS表示网络中的弧,是由CITIES派生的集合;

   9,6  9,7  9,8              !由于并非所有城市间都有道路直接连接,所以将弧具体列出;

   6,4  6,5  7,4  7,5  8,4  8,5

   4,2  4,3  5,2  5,3

   2,1  3,1/: D;              !属性D( i, j) 是城市ij的直接距离(已知);

ENDSETS

 

DATA:

  D =                     ! D赋值的顺序对应于ROADS中的弧的顺序;

     6    3    3

     6    5    8     6    7    4

     6    7    8     9

     5    6;

ENDDATA

 

L(1) = 0;                 !边界条件;

@FOR( CITIES( i)| i #GT# 1: !集合循环语句, #GT#表示逻辑关系"大于";

  L( i) = @MIN( ROADS( i, j): D( i, j) + L( j))   !这就是动态规划基本方程;

 );

END

 

结果为

 

                                           Variable           Value

                                              L( 1)        0.000000

                                              L( 2)        5.000000

                                              L( 3)        6.000000

                                              L( 4)        11.00000

                                              L( 5)        13.00000

                                              L( 6)        17.00000

                                              L( 7)        19.00000

                                              L( 8)        17.00000

                                              L( 9)        20.00000

                                       

可以看到,最有结果为20.当然了,这道题目比较简单,我们还需要更多的算法来验算这一个结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值