QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2784|回复: 0
打印 上一主题 下一主题

Lingo超经典案例大全 五(每日一资料)

[复制链接]
字体大小: 正常 放大

3503

主题

538

听众

5990

积分

  • TA的每日心情
    开心
    2017-2-7 15:12
  • 签到天数: 691 天

    [LV.9]以坛为家II

    社区QQ达人 元老勋章 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组2013年国赛赛前培训

    群组2014年地区赛数学建模

    群组数学中国第二期SAS培训

    群组物联网工程师考试

    群组2013年美赛优秀论文解

    跳转到指定楼层
    1#
    发表于 2016-7-9 15:19 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    九、护士值班安排问题
    某医院,从周一到周日都要有人值班,每天至少需要的护士如表。要求每个护士每周连续上班5天,试问该医院至少需要多少护士?并给出上班安排计划。
    周   1    2    3    4    5     6     7
    人   20   16   13   16   19    14    12

    取决策变量star(i):周i开始值班的人数;
    目标函数:min  sum[star(i)](i=1,2,3,...,7)
    约束条件:连续工作五天,周j值班的人数>=required(j)(j=1,2,3,...,7)

    model:
    sets:
    days/mon..sun/: required,start;
    endsets
    data:
    !每天所需的最少职员数;
    required = 20 16 13 16 19 14 12;
    enddata
    !最小化每周所需职员数;
    min=@sum(days: start);
    @for(days(J)sum(days(I) | I #le# 5:start(@wrap(J+2+I,7))) >= required(J));
    end
    解得: 总共需要22人,周一8人开始值班,周二2人,周三0人,周四6人,周五3人,周六3人,周日0人。

    十、填数问题
    分别把1,2,…,16填到图示的16个圈内,使得每个三角形上的所有圈内的数的和为81(共4个三角形)。
    QQ图片20160709151834.png
    决策变量:e_ij=1,第i个圈填数a_j;e_ij=0,第i个圈不填数a_j。a_j=j,j=1,2,3,...,16。
    模型:

    QQ图片20160709152006.png
    model:
    sets:
    number/1..16/:a;
    link(number,number):e;
    tri1(number)/1 2 3 4 5 6 7 8 9/;
    tri2(number)/1 2 3 4 16 15 12 11 10/;
    tri3(number)/4 5 6 7 14 13 12 15 16/;
    tri4(number)/7 8 9 1 10 11 12 13 14/;
    endsets
    data:
    a=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16;
    enddata
    [obj]max=sum(link(i,j):e(i,j)*a(j));
    @for(number(i):sum(link(i,j):e(i,j))=1);
    @for(number(j):sum(link(i,j):e(i,j))=1);
    @for(link(i,j)bin(e(i,j)));
    @sum(number(j):sum(tri1(i):e(i,j)*a(j)))=81;
    @sum(number(j):sum(tri2(i):e(i,j)*a(j)))=81;
    @sum(number(j):sum(tri3(i):e(i,j)*a(j)))=81;
    @sum(number(j):sum(tri4(i):e(i,j)*a(j)))=81;
    @sum(link(i,j):e(i,j)*a(j))=136;
    end
    红色的那句程序可以去掉,也可以为:min=@sum(link(i,j):e(i,j)*a(j)),但求的结果不同,结果都符合要求。
    编号1~16的圆圈的填数结果至少有3种:
    (1)12 11 1 10 7 8 14 13 5 9 4 16 2 6 15 3
    (2)14 3 5 15 8 7 13 4 12 6 11 10 9 2 16 1
    (3)14 11 4 15 9 8 13 2 5 16 3 10 12 6 1 7
    为了求得更多的解,可以约束编号1~16的圆圈的填数结果不为以上3种结果。
    model:
    sets:
    number/1..16/:a;
    link(number,number):e;
    tri1(number)/1 2 3 4 5 6 7 8 9/;
    tri2(number)/1 2 3 4 16 15 12 11 10/;
    tri3(number)/4 5 6 7 14 13 12 15 16/;
    tri4(number)/7 8 9 1 10 11 12 13 14/;
    yueshu1:c1;
    yueshu2:c2;
    yueshu3:c3;
    endsets
    data:
    a=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16;
    c1=12 11 1 10 7 8 14 13 5 9 4 16 2 6 15 3;
    c2=14 3 5 15 8 7 13 4 12 6 11 10 9 2 16 1;
    c3=14 11 4 15 9 8 13 2 5 16 3 10 12 6 1 7;
    enddata
    [obj]min=sum(number(i)sum(number(j):e(i,j)*a(j)));
    @for(number(i):sum(number(j):e(i,j))=1);
    @for(number(j):sum(link(i,j):e(i,j))=1);
    @for(link(i,j)bin(e(i,j)));
    @sum(number(j):sum(tri1(i):e(i,j)*a(j)))=81;
    @sum(number(j):sum(tri2(i):e(i,j)*a(j)))=81;
    @sum(number(j):sum(tri3(i):e(i,j)*a(j)))=81;
    @sum(number(j):sum(tri4(i):e(i,j)*a(j)))=81;
    @sum(link(i,j):e(i,j)*a(j))=136;


    @sum(yueshu1(j):sum(link(i,j):e(i,j)))<16;
    @sum(yueshu2(j):sum(link(i,j):e(i,j)))<16;
    @sum(yueshu3(j):sum(link(i,j):e(i,j)))<16;
    end

    解得:(4)12 15 11 10 3 8 16 1 5 4 7 14 9 13 2 6
    可以继续下去:······



    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-10-6 00:28 , Processed in 0.427070 second(s), 58 queries .

    回顶部