数学建模社区-数学中国

标题: C++和Lingo混合编程,求全局最优解 [打印本页]

作者: 七月sanger    时间: 2016-12-5 12:09
标题: C++和Lingo混合编程,求全局最优解
用Lingo求非线性方程组的解。在Lingo里的option中勾选use global solver,可以得到最优解,不勾选,只能得到可行解。在C++里调用Lingo时得到的是可行解,试过将SET ECHOIN改为SET GLOBAL也没用(这个设置我也不太懂,后面是设置全局?麻烦明白的讲一下)。我的目的要得到全局最优解。用的VS2008,Lingo11破解版。num(1)= 9.5;num(2)= -11;num(3) = -0.5;num(4) = -11;num(5) = 9.5;num(6) = 16;num(7) = -0.5;num(8) = 16;
下面是Lingo程序
model:

sets:
        coor/1..12/:x;
        ID/1..8/:num;
endsets

data:
        num=@pointer(1);
enddata

!约束条件;
1.5*x(1)+2*x(2)=num(1);
x(2)-1.5*x(3)=num(2);
1.5*x(4)-2*x(5)=num(3);
x(5)-1.5*x(6)=num(4);
1.5*x(7)+2*x(8)=num(5);
x(8)+1.5*x(9)=num(6);
1.5*x(10)-2*x(11)=num(7);
x(11)+1.5*x(12)=num(8);
@sqrt((x(1)-x(4))^2+(x(2)-x(5))^2+(x(3)-x(6))^2)=4;
@sqrt((x(4)-x(7))^2+(x(5)-x(8))^2+(x(6)-x(9))^2)=3;
@sqrt((x(7)-x(10))^2+(x(8)-x(11))^2+(x(9)-x(12))^2)=4;
@sqrt((x(10)-x(1))^2+(x(11)-x(2))^2+(x(12)-x(3))^2)=3;
@sqrt((x(4)-x(10))^2+(x(5)-x(11))^2+(x(6)-x(12))^2)=5;
@sqrt((x(1)-x(7))^2+(x(2)-x(8))^2+(x(3)-x(9))^2)=5;

data:
        @pointer(2) = x;
        @pointer(3) = @status();
enddata

end




作者: 七月sanger    时间: 2016-12-5 14:09
好像是Lingo11是不完全破解,在Lingo中是无限制,但C++调用后就有限制,求完全破解版

作者: liwenhui    时间: 2016-12-5 20:33
求解的时候需要调用全局变量,对你的模型全局求解,代码里面添加一句:
  1. model:

  2. sets:
  3.         coor/1..12/:x;
  4.         ID/1..8/:num;
  5. endsets

  6. data:
  7.         num=@pointer(1);
  8. enddata
  9. @SET('GLOBAL', 1);
  10. !约束条件;
  11. 1.5*x(1)+2*x(2)=num(1);
  12. x(2)-1.5*x(3)=num(2);
  13. 1.5*x(4)-2*x(5)=num(3);
  14. x(5)-1.5*x(6)=num(4);
  15. 1.5*x(7)+2*x(8)=num(5);
  16. x(8)+1.5*x(9)=num(6);
  17. 1.5*x(10)-2*x(11)=num(7);
  18. x(11)+1.5*x(12)=num(8);
  19. @sqrt((x(1)-x(4))^2+(x(2)-x(5))^2+(x(3)-x(6))^2)=4;
  20. @sqrt((x(4)-x(7))^2+(x(5)-x(8))^2+(x(6)-x(9))^2)=3;
  21. @sqrt((x(7)-x(10))^2+(x(8)-x(11))^2+(x(9)-x(12))^2)=4;
  22. @sqrt((x(10)-x(1))^2+(x(11)-x(2))^2+(x(12)-x(3))^2)=3;
  23. @sqrt((x(4)-x(10))^2+(x(5)-x(11))^2+(x(6)-x(12))^2)=5;
  24. @sqrt((x(1)-x(7))^2+(x(2)-x(8))^2+(x(3)-x(9))^2)=5;

  25. data:
  26.         @pointer(2) = x;
  27.         @pointer(3) = @status();
  28. enddata

  29. end
复制代码
我的LINGO求解变量有限制,你在自己的上面试试,模型本身没问题的话就能求解出来。

作者: 七月sanger    时间: 2016-12-6 11:27
liwenhui 发表于 2016-12-5 20:33
求解的时候需要调用全局变量,对你的模型全局求解,代码里面添加一句:我的LINGO求解变量有限制,你在自己的 ...

我用的Lingo11,添上这句,说代码语法错误哎

作者: liwenhui    时间: 2016-12-6 15:27
七月sanger 发表于 2016-12-6 11:27
我用的Lingo11,添上这句,说代码语法错误哎

这不科学

作者: liwenhui    时间: 2016-12-6 15:29
七月sanger 发表于 2016-12-6 11:27
我用的Lingo11,添上这句,说代码语法错误哎

这不科学

作者: wujianjack2    时间: 2016-12-12 15:32
   1. 可以向LINDO Systems申请Extended版本的Free Academic, six months renewable;
   2. 看Samples下的例子如何使用函数‘@SET',这个应出现在CALC段;
   3. 用这种Run script的方式控制力还不够,试试LINDO API。





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