数学建模社区-数学中国

标题: 多次运行结果不一致 [打印本页]

作者: zyz数模    时间: 2013-8-9 22:00
标题: 多次运行结果不一致
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
采用的是蒙特卡洛法,程序多次运行,每次运行结果都不一样,是这种算法的缺陷,还是我的程序不够好。多谢各位指导。

作者: 冬季的期盼    时间: 2013-8-10 10:31
看不懂~~

作者: wujianjack2    时间: 2013-8-10 10:44
  楼主你好,你的想法不错啊!
  首先,我对你的问题有一些疑惑,主要有如下两个方面:
  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并选用蒙特卡洛算法尝试求解的想法也是不错的,但该算法是随机算法,每次运行结果并不一样,但会在某个值附近波动。

以上是我对该问题的理解,仅供楼主参考,如果有什么疑问,望不吝指出!谢谢支持!
作者: magic2728    时间: 2013-8-10 15:08
本帖最后由 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
表达的意思和楼上一样,程序风格不同,你可以参考参考。
希望对你有所帮助。
作者: wujianjack2    时间: 2013-8-10 18:42
magic2728 发表于 2013-8-10 15:08
蒙特卡洛算法就是一种随机性的算法,所以每次运行结果不一样很正常,它的基本思想就是不断在可行域内找点试 ...

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

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

嗯,大家都是为了能更好地解决楼主问题而尽力!至于风格嘛,也是可以变通学习的。
作者: zyz数模    时间: 2013-8-10 23:11
magic2728 发表于 2013-8-10 15:08
蒙特卡洛算法就是一种随机性的算法,所以每次运行结果不一样很正常,它的基本思想就是不断在可行域内找点试 ...

多谢提醒,因为初学matlab,没有接触lingo。这个算法运行多次,还是不能得出最优解,在自己加的一个matlab群里有一位回复了我,他的答案要优于我,算法却不一样,同时也没有给我看他的程序。不知道有没有对我程序的改进方法。至于用到floor以及ceil是因为题目要求是整数解。
作者: zyz数模    时间: 2013-8-10 23:17
wujianjack2 发表于 2013-8-10 10:44
楼主你好,你的想法不错啊!
  首先,我对你的问题有一些疑惑,主要有如下两个方面:
  1.个人觉得你的 ...

多谢指出我的错误,因为初接触建模,几个师兄建议我学功能强大的matlab,其他软件就没有去研究了。我在一个matlab群里发问,一个师兄算出5100+,而我的最大值是5000+,多次运算结果在4900+处浮动,(具体数字没有列出,不好意思)多谢你的提醒
作者: zyz数模    时间: 2013-8-10 23:20
wujianjack2 发表于 2013-8-10 18:42
嗯,很好很好!我平常编程风格就是这样的。
  不过这次我没这么写有两个理由:
   1.估摸着这么写程序 ...

嘿嘿,多谢啦!初接触建模,几个师兄建议我先学习功能强大的matlab软件,其他软件就没有接触了(自己比较笨,东西多了可能掌握不了)。最近一直在看关于建模的东西,发现自己所想到的解决办法当转化为程序时真心好难
作者: zyz数模    时间: 2013-8-10 23:22
多谢各位,今天因为和姐姐跑出去玩,还看了一场电影(好开心的说!),登陆数学中国之后看到你们的建议心里真的好开心!
作者: magic2728    时间: 2013-8-10 23:56
zyz数模 发表于 2013-8-10 23:11
多谢提醒,因为初学matlab,没有接触lingo。这个算法运行多次,还是不能得出最优解,在自己加的一个matla ...

运行的够多程序的解肯定会越来越好的!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5