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
好像是Lingo11是不完全破解,在Lingo中是无限制,但C++调用后就有限制,求完全破解版
求解的时候需要调用全局变量,对你的模型全局求解,代码里面添加一句:model:
sets:
coor/1..12/:x;
ID/1..8/:num;
endsets
data:
num=@pointer(1);
enddata
@SET('GLOBAL', 1);
!约束条件;
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我的LINGO求解变量有限制,你在自己的上面试试,模型本身没问题的话就能求解出来。
liwenhui 发表于 2016-12-5 20:33 static/image/common/back.gif
求解的时候需要调用全局变量,对你的模型全局求解,代码里面添加一句:我的LINGO求解变量有限制,你在自己的 ...
我用的Lingo11,添上这句,说代码语法错误哎
七月sanger 发表于 2016-12-6 11:27 static/image/common/back.gif
我用的Lingo11,添上这句,说代码语法错误哎
这不科学
七月sanger 发表于 2016-12-6 11:27 static/image/common/back.gif
我用的Lingo11,添上这句,说代码语法错误哎
这不科学
1. 可以向LINDO Systems申请Extended版本的Free Academic, six months renewable;
2. 看Samples下的例子如何使用函数‘@SET',这个应出现在CALC段;
3. 用这种Run script的方式控制力还不够,试试LINDO API。
页:
[1]