QQ登录

只需要一步,快速开始

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

多次运行结果不一致

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

6

主题

7

听众

254

积分

升级  77%

  • TA的每日心情
    擦汗
    2014-8-8 17:23
  • 签到天数: 88 天

    [LV.6]常住居民II

    自我介绍
    大一学生,专业环境工程。对数学建模感兴趣。

    群组数学建摸协会

    群组第三届数模基础实训

    群组华南理工大学

    群组2014美赛ICMC题备战群

    跳转到指定楼层
    1#
    发表于 2013-8-9 22:00 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    Max  z = x12 + x22 +3x32 + 4x42 + 2x5 2 −8x1 −2x2 −3x3 − x4 −2x 5
    约束条件:
    0 ≤ xi ≤ 99        (i =1,,5)
    x1 + x2 + x3 + x4 + x5   ≤ 400
    x1 + 2x2 + 2x3 + x4 +6x5 ≤ 800
    2x1 + x2 +6x3   ≤ 200
    x3 + x4 +5x5 ≤ 200


    function [f,g]=mengte(x); f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-...
    x(4)-2*x(5); g=[sum(x)-400
    x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800
    2*x(1)+x(2)+6*x(3)-200 x(3)+x(4)+5*x(5)-200];

    主程序:
    rand('state',sum(clock));
    p0=0;
    tic
    for i=1:10^6
        x=99*rand(5,1);
        x1=floor(x);x2=ceil(x);
        [f,g]=mengte(x1);
        if sum(g<=0)==4
            if p0<=f
                x0=x1;p0=f;
            end
        end
        [f,g]=mengte(x2);
        if sum(g<=0)==4
            if p0<=f
                x0=x2;p0=f;
            end
        end
    end
    x0,p0
    toc
    采用的是蒙特卡洛法,程序多次运行,每次运行结果都不一样,是这种算法的缺陷,还是我的程序不够好。多谢各位指导。
    zan
    转播转播 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    16

    主题

    10

    听众

    51

    积分

    升级  48.42%

  • TA的每日心情
    开心
    2013-9-30 09:41
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    自我介绍
    未老先衰

    群组2013年数学建模国赛备

    回复

    使用道具 举报

    21

    主题

    97

    听众

    3110

    积分

  • TA的每日心情
    奋斗
    2014-3-2 00:26
  • 签到天数: 243 天

    [LV.8]以坛为家I

      楼主你好,你的想法不错啊!
      首先,我对你的问题有一些疑惑,主要有如下两个方面:
      1.个人觉得你的问题写成下面这种形式要好一些,更加方便大家阅读:
      Max  z = x1^2 + x2^2 +3*x3^2 + 4*x4^2 + 2*x5^2 −8*x1 −2*x2 −3*x3 − x4 −2*x5
      约束条件:
      0 ≤ xi ≤ 99        (i =1...5)
      x1 + x2 + x3 + x4 + x5   ≤ 400
      x1 + 2*x2 + 2*x3 + x4 +6*x5 ≤ 800
      2*x1 + x2 +6*x3   ≤ 200
      x3 + x4 +5*x5 ≤ 200
      
      2.关于函数编写问题:
      原问题中“f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);” 是不是应该  是“2*x(5)^2”呢?

      关于此题,个人觉得用LINGO求解相对容易点,程序代码如下:
      MAX=X1^2+X2^2+3*X3^2+4*X4^2-2*X5^2-8*X1-2*X2-3*X3-X4-2*X5;
      @BND(0,X1,99);@BND(0,X2,99);@BND(0,X3,99);@BND(0,X4,99);@BND(0,X5,99);
      X1+X2+X3+X4+X5<=400;
      X1+2*X2+2*X3+X4+6*X5<=800;
      2*X1+X2+6*X3<=200;
      X3+X4+5*X5<=200;

      程序运行结果如下(仅给出重要的相关结果):
      Global optimal solution found.
      Objective value:                              50854.25
      Objective bound:                            50854.25
      Infeasibilities:                                   0.000000
      Extended solver steps:                            2
      Total solver iterations:                            93


                           Variable           Value        Reduced Cost
                                 X1        50.50000            0.000000
                                 X2        99.00000           -149.5000
                                 X3        0.000000            282.0000
                                 X4        99.00000           -791.0000
                                 X5        0.000000            2.000000

    当然,楼主使用MATLAB并选用蒙特卡洛算法尝试求解的想法也是不错的,但该算法是随机算法,每次运行结果并不一样,但会在某个值附近波动。

    以上是我对该问题的理解,仅供楼主参考,如果有什么疑问,望不吝指出!谢谢支持!

    点评

    zyz数模  多谢指出我的错误,因为初接触建模,几个师兄建议我学功能强大的matlab,其他软件就没有去研究了。我在一个matlab群里发问,一个师兄算出5100+,而我的最大值是5000+,多次运算结果在4900+处浮动,(具体数字没有列出  详情 回复 发表于 2013-8-10 23:17
    冬季的期盼  好厉害的说。。。  发表于 2013-8-10 10:47
    有什么好说的
    回复

    使用道具 举报

    magic2728 实名认证    中国数模人才认证   

    61

    主题

    478

    听众

    4861

    积分

    升级  95.37%

  • TA的每日心情
    慵懒
    2014-9-29 19:37
  • 签到天数: 409 天

    [LV.9]以坛为家II

    群组数学中国 2015美赛护航

    群组数模专题强化培训

    群组建模思维养成培训

    群组2015美赛护航(强化)

    群组2013年数学建模国赛备

    本帖最后由 wujianjack2 于 2013-8-10 18:35 编辑

    蒙特卡洛算法就是一种随机性的算法,所以每次运行结果不一样很正常,它的基本思想就是不断在可行域内找点试验,比较这些点上的函数值,就能够取得近似的最优解。而lingo应该是可以求得全局最优解的。
    你的程序里我还提一个小点,就是x=randint(1,5,[1,99])就可以直接产生1*5的1~99的随机整数了,楼主分别用floor和ceil也是可取的,round应该也行。
    lingo我这里有个参考程序,你也可以看看。
    model:
    sets:
    row/1..4/:b;
    col/1..5/:c1,c2,x;
    link(row,col):a;
    endsets
    data:
    c1=1,1,3,4,2;
    c2=-8,-2,-3,-1,-2;
    a=1 1 1 1 1
      1 2 2 1 6
      2 1 6 0 0
      0 0 1 1 5;
    b=400,800,200,200;
    enddata
    max=@sum(col:c1*x^2+c2*x);
    @for(row(i):@sum(col(j):a(i,j)*x(j))<b(i));
    @for(col:@gin(x));
    @for(col:@bnd(0,x,99));
    end
    表达的意思和楼上一样,程序风格不同,你可以参考参考。
    希望对你有所帮助。

    点评

    zyz数模  多谢提醒,因为初学matlab,没有接触lingo。这个算法运行多次,还是不能得出最优解,在自己加的一个matlab群里有一位回复了我,他的答案要优于我,算法却不一样,同时也没有给我看他的程序。不知道有没有对我程序的改  详情 回复 发表于 2013-8-10 23:11
    wujianjack2  嗯,很好很好!我平常编程风格就是这样的。 不过这次我没这么写有两个理由: 1.估摸着这么写程序显得更长,而且会涉及到LINGO过多的规则,不如写简短直观点,方便大家阅读; 2.楼主既然用MATLAB解题,可  详情 回复 发表于 2013-8-10 18:42
    回复

    使用道具 举报

    21

    主题

    97

    听众

    3110

    积分

  • TA的每日心情
    奋斗
    2014-3-2 00:26
  • 签到天数: 243 天

    [LV.8]以坛为家I

    magic2728 发表于 2013-8-10 15:08
    蒙特卡洛算法就是一种随机性的算法,所以每次运行结果不一样很正常,它的基本思想就是不断在可行域内找点试 ...

      嗯,很好很好!我平常编程风格就是这样的。
      不过这次我没这么写有两个理由:
       1.估摸着这么写程序显得更长,而且会涉及到LINGO过多的规则,不如写简短直观点,方便大家阅读;
       2.楼主既然用MATLAB解题,可能以前没有接触过LINGO,我有意要突出LINGO语言的表述可以与实际模型基本接近的优势,以此来向楼主推荐比较专业的优化软件LINGO,是别有居心的,哈哈。

    点评

    zyz数模  嘿嘿,多谢啦!初接触建模,几个师兄建议我先学习功能强大的matlab软件,其他软件就没有接触了(自己比较笨,东西多了可能掌握不了)。最近一直在看关于建模的东西,发现自己所想到的解决办法当转化为程序时真心好难  详情 回复 发表于 2013-8-10 23:20
    magic2728  你的风格是只把自变量当成集里面的元素写在程序里,我的风格是把所有的参数都按照集的方式写进来,这样的话会用到很多lingo的函数,如求和,循环等等,能体现lingo这个软件的特点和优势。而你那个却是更加明确一些。  详情 回复 发表于 2013-8-10 19:42
    有什么好说的
    回复

    使用道具 举报

    21

    主题

    97

    听众

    3110

    积分

  • TA的每日心情
    奋斗
    2014-3-2 00:26
  • 签到天数: 243 天

    [LV.8]以坛为家I

    回复

    使用道具 举报

    magic2728 实名认证    中国数模人才认证   

    61

    主题

    478

    听众

    4861

    积分

    升级  95.37%

  • TA的每日心情
    慵懒
    2014-9-29 19:37
  • 签到天数: 409 天

    [LV.9]以坛为家II

    群组数学中国 2015美赛护航

    群组数模专题强化培训

    群组建模思维养成培训

    群组2015美赛护航(强化)

    群组2013年数学建模国赛备

    wujianjack2 发表于 2013-8-10 18:42
    嗯,很好很好!我平常编程风格就是这样的。
      不过这次我没这么写有两个理由:
       1.估摸着这么写程序 ...

    你的风格是只把自变量当成集里面的元素写在程序里,我的风格是把所有的参数都按照集的方式写进来,这样的话会用到很多lingo的函数,如求和,循环等等,能体现lingo这个软件的特点和优势。而你那个却是更加明确一些。因为到底是变量还是参数,一目了然不会混淆。

    点评

    wujianjack2  嗯,大家都是为了能更好地解决楼主问题而尽力!至于风格嘛,也是可以变通学习的。  详情 回复 发表于 2013-8-10 19:59
    回复

    使用道具 举报

    21

    主题

    97

    听众

    3110

    积分

  • TA的每日心情
    奋斗
    2014-3-2 00:26
  • 签到天数: 243 天

    [LV.8]以坛为家I

    magic2728 发表于 2013-8-10 19:42
    你的风格是只把自变量当成集里面的元素写在程序里,我的风格是把所有的参数都按照集的方式写进来,这样的 ...

    嗯,大家都是为了能更好地解决楼主问题而尽力!至于风格嘛,也是可以变通学习的。
    有什么好说的
    回复

    使用道具 举报

    zyz数模        

    6

    主题

    7

    听众

    254

    积分

    升级  77%

  • TA的每日心情
    擦汗
    2014-8-8 17:23
  • 签到天数: 88 天

    [LV.6]常住居民II

    自我介绍
    大一学生,专业环境工程。对数学建模感兴趣。

    群组数学建摸协会

    群组第三届数模基础实训

    群组华南理工大学

    群组2014美赛ICMC题备战群

    magic2728 发表于 2013-8-10 15:08
    蒙特卡洛算法就是一种随机性的算法,所以每次运行结果不一样很正常,它的基本思想就是不断在可行域内找点试 ...

    多谢提醒,因为初学matlab,没有接触lingo。这个算法运行多次,还是不能得出最优解,在自己加的一个matlab群里有一位回复了我,他的答案要优于我,算法却不一样,同时也没有给我看他的程序。不知道有没有对我程序的改进方法。至于用到floor以及ceil是因为题目要求是整数解。
    回复

    使用道具 举报

    zyz数模        

    6

    主题

    7

    听众

    254

    积分

    升级  77%

  • TA的每日心情
    擦汗
    2014-8-8 17:23
  • 签到天数: 88 天

    [LV.6]常住居民II

    自我介绍
    大一学生,专业环境工程。对数学建模感兴趣。

    群组数学建摸协会

    群组第三届数模基础实训

    群组华南理工大学

    群组2014美赛ICMC题备战群

    wujianjack2 发表于 2013-8-10 10:44
    楼主你好,你的想法不错啊!
      首先,我对你的问题有一些疑惑,主要有如下两个方面:
      1.个人觉得你的 ...

    多谢指出我的错误,因为初接触建模,几个师兄建议我学功能强大的matlab,其他软件就没有去研究了。我在一个matlab群里发问,一个师兄算出5100+,而我的最大值是5000+,多次运算结果在4900+处浮动,(具体数字没有列出,不好意思)多谢你的提醒
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2025-5-25 03:36 , Processed in 1.696547 second(s), 101 queries .

    回顶部