多次运行结果不一致
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 =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);
=mengte(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
=mengte(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;p0=f;
end
end
end
x0,p0
toc
采用的是蒙特卡洛法,程序多次运行,每次运行结果都不一样,是这种算法的缺陷,还是我的程序不够好。多谢各位指导。
{:3_49:}看不懂~~
楼主你好,你的想法不错啊!
首先,我对你的问题有一些疑惑,主要有如下两个方面:
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并选用蒙特卡洛算法尝试求解的想法也是不错的,但该算法是随机算法,每次运行结果并不一样,但会在某个值附近波动。
以上是我对该问题的理解,仅供楼主参考,如果有什么疑问,望不吝指出!谢谢支持! 本帖最后由 wujianjack2 于 2013-8-10 18:35 编辑
蒙特卡洛算法就是一种随机性的算法,所以每次运行结果不一样很正常,它的基本思想就是不断在可行域内找点试验,比较这些点上的函数值,就能够取得近似的最优解。而lingo应该是可以求得全局最优解的。
你的程序里我还提一个小点,就是x=randint(1,5,)就可以直接产生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
表达的意思和楼上一样,程序风格不同,你可以参考参考。
希望对你有所帮助。 magic2728 发表于 2013-8-10 15:08 static/image/common/back.gif
蒙特卡洛算法就是一种随机性的算法,所以每次运行结果不一样很正常,它的基本思想就是不断在可行域内找点试 ...
嗯,很好很好!我平常编程风格就是这样的。
不过这次我没这么写有两个理由:
1.估摸着这么写程序显得更长,而且会涉及到LINGO过多的规则,不如写简短直观点,方便大家阅读;
2.楼主既然用MATLAB解题,可能以前没有接触过LINGO,我有意要突出LINGO语言的表述可以与实际模型基本接近的优势,以此来向楼主推荐比较专业的优化软件LINGO,是别有居心的,哈哈。 4楼的回复很不错,楼主可以参考下! wujianjack2 发表于 2013-8-10 18:42 static/image/common/back.gif
嗯,很好很好!我平常编程风格就是这样的。
不过这次我没这么写有两个理由:
1.估摸着这么写程序 ...
你的风格是只把自变量当成集里面的元素写在程序里,我的风格是把所有的参数都按照集的方式写进来,这样的话会用到很多lingo的函数,如求和,循环等等,能体现lingo这个软件的特点和优势。而你那个却是更加明确一些。因为到底是变量还是参数,一目了然不会混淆。 magic2728 发表于 2013-8-10 19:42 static/image/common/back.gif
你的风格是只把自变量当成集里面的元素写在程序里,我的风格是把所有的参数都按照集的方式写进来,这样的 ...
嗯,大家都是为了能更好地解决楼主问题而尽力!至于风格嘛,也是可以变通学习的。 magic2728 发表于 2013-8-10 15:08 static/image/common/back.gif
蒙特卡洛算法就是一种随机性的算法,所以每次运行结果不一样很正常,它的基本思想就是不断在可行域内找点试 ...
多谢提醒,因为初学matlab,没有接触lingo。这个算法运行多次,还是不能得出最优解,在自己加的一个matlab群里有一位回复了我,他的答案要优于我,算法却不一样,同时也没有给我看他的程序。不知道有没有对我程序的改进方法。至于用到floor以及ceil是因为题目要求是整数解。 wujianjack2 发表于 2013-8-10 10:44 static/image/common/back.gif
楼主你好,你的想法不错啊!
首先,我对你的问题有一些疑惑,主要有如下两个方面:
1.个人觉得你的 ...
多谢指出我的错误,因为初接触建模,几个师兄建议我学功能强大的matlab,其他软件就没有去研究了。我在一个matlab群里发问,一个师兄算出5100+,而我的最大值是5000+,多次运算结果在4900+处浮动,(具体数字没有列出,不好意思)多谢你的提醒
页:
[1]
2