刚学Lingo,用它求解CVaR的问题。模型中有分段费用函数,转换为含0-1变量的线性规划。程序贴出来,实在奈何不了它,请高手们帮忙看看哪里错误,谢谢了哈!
station我取250个,但贴出来时为了简便,只用了5个,相应y(i,j)就只有8行5列了。还是出现“Error code: 1017”,LINGO Solver Status显示Variables:1,Model:。。,State:Unknown。。。 根本认不出我的模型。改好几次都不行,非常之郁闷!
MODEL:
CVaR优化;
SETS:
capital/1..8/: q,x0,e,x,u,v,c;
station/1..5/: z;
points/1,2,3/;
linkI(capital,station): y;
linkII(points,capital): s,r;
ENDSETS
DATA:
n=0.95;
w=0.00294836;
q=25.73 9.38 17.82 38.27 17.4 11.35 22.95 13;
x0=1500 1500 1500 1500 1500 1500 1500 1500;
e=0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2;
y=-0.00930851 -0.00939597 0.07452575 -0.05422446 0.04266667
-0.00172414 -0.04145078 0.01261261 -0.03558719 0.04059041
0.002849 -0.03551136 -0.00589102 -0.04888889 0.04205607
-0.01478953 0.02713626 0.03428893 -0.04728261 0.02909298
0.00712251 -0.00141443 0.03541076 -0.03419973 0.03966006
-0.00879765 0.10059172 0.05645161 -0.08142494 0.08033241
-0.01073826 -0.03663501 -0.01126761 -0.07692308 0.03703704
0.09985735 0.0998703 0.00943396 -0.06308411 0.04738155;
ENDDATA
CALC:
T=@sum(capital(i):q(i)*x0(i));
ENDCALC
MIN=@sum(station(j):z(j))/((1-n)*@size(station))+m;
@for(linkII(k,i)|k#eq#3:r(k,i)=0);
@for(linkII(k,i)|k#ne#3bin(r(k,i)));
@for(capital(i):
s(1,i)<=r(1,i);
s(2,i)<=1;
s(3,i)<=r(2,i);
@sum(points(k):s(k,i)=1);
@sum(points(k):r(k,i)=1);
x(i)-x0(i)=u(i)-v(i);
u(i)+v(i)=2500*s(2,i)/q(i)+T*s(3,i)/q(i);
c(i)=5*s(1,i)+15*s(2,i)+6*T*s(3,i)/1000;
q(i)*x(i)<=e(i)*T;
);
T=@sum(capital:c)+@sum(capital:q*x);
@sum(capital(i)sum(station(j):y(i,j))/@size(station)*q(i)*x(i))-@sum(capital(i):c(i))>=w*T;
@for(station(j):
z(j)+m>=-@sum(capital(i):x(i)*y(i,j)));
END
MODEL:
SETS:
capital/1..8/: q,x0,e,x,u,v,c;
station/1..5/: z;
points/1,2,3/;
linkI(capital,station): y;
linkII(points,capital): s,r;
ENDSETS
DATA:
n=0.95;
w=0.00294836;
q=25.73 9.38 17.82 38.27 17.4 11.35 22.95 13;
x0=1500 1500 1500 1500 1500 1500 1500 1500;
e=0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2;
y=-0.00930851 -0.00939597 0.07452575 -0.05422446 0.04266667
-0.00172414 -0.04145078 0.01261261 -0.03558719 0.04059041
0.002849 -0.03551136 -0.00589102 -0.04888889 0.04205607
-0.01478953 0.02713626 0.03428893 -0.04728261 0.02909298
0.00712251 -0.00141443 0.03541076 -0.03419973 0.03966006
-0.00879765 0.10059172 0.05645161 -0.08142494 0.08033241
-0.01073826 -0.03663501 -0.01126761 -0.07692308 0.03703704
0.09985735 0.0998703 0.00943396 -0.06308411 0.04738155;
ENDDATA
CALC:
T=@sum(capital(i):q(i)*x0(i));
ENDCALC
MIN=@sum(station(j):z(j))/((1-n)*@size(station))+m;
@for(linkII(k,i)|k#eq#3:r(k,i)=0);
@for(linkII(k,i)|k#ne#3bin(r(k,i)));
@for(capital(i):
s(1,i)<=r(1,i);
s(2,i)<=1;
s(3,i)<=r(2,i);
@sum(points(k):s(k,i))=1;
@sum(points(k):r(k,i))=1;
x(i)-x0(i)=u(i)-v(i);
u(i)+v(i)=2500*s(2,i)/q(i)+T*s(3,i)/q(i);
c(i)=5*s(1,i)+15*s(2,i)+6*T*s(3,i)/1000;
q(i)*x(i)<=e(i)*T;
);
T=@sum(capital:c)+@sum(capital:q*x);
@sum(capital(i)sum(station(j):y(i,j))/@size(station)*q(i)*x(i))-@sum(capital(i):c(i))>=w*T;
@for(station(j):
z(j)+m>=-@sum(capital(i):x(i)*y(i,j)));
END
按照上面修改就可以了,建议看看错误帮助,错误很明确!
非常谢谢管理员!!不好意思,帮助是英文,让人发虚,没仔细研究。
@sum(points(k):s(k,i)=1);括号弄错了,下次要小心检查。“CVaR优化;”这个不能加吗?什么情况下才能加上这种“标题”呢?我看书上有些例子加了。
ststion取5能运行。但station取250,y(i,j)就是8行250列,数据应该怎样输入呢? y(i,j)8行250列的数据我放在一excel表中了,能用Edit|Insert New Objects...,由文件创建:指定那个excel的位置,确定。Lingo里就出现了个excel格式,8行250列的表。 这样可以吗?请指教!
Solve,还是出现相同的Error code,就是Variables增加到306个
要想写注释就用!放在注释前面。
道理上应该可以改变规模的,出现了什么错误提示?
或者应该把excel中的8行250列数据复制,用“Edit|Paste Special...”,“未格式化文本”。这样能运行,不知道解得对不对。
Lingo对集合属性按列赋值,不太理解这个意思。Y是个8行250列的矩阵,那输入y(i,j)的数据时需要把行列转置吗?
呵呵,问题有些白痴,请担待!
用Edit|Insert New Objects...,由文件创建:指定那个excel的位置,确定。Lingo里就出现了个excel格式,8行250列的表。Solve,还是出现:Error code:1017,只是Variables增加到306个
把excel中的8行250列数据复制,用“Edit|Paste Special...”,“未格式化文本”。这样能运行,不知道解得对不对。
我觉得应该是y(i,j)输入的问题,
把excel中的8行250列数据复制,用“Edit|Paste Special...”,“未格式化文本”。这样能运行。结果:Model:ILP, State:Global Opt. Variables:total:323,Intergers:16...
怎样判断结果正不正确呢?
把excel中的8行250列数据复制,用“Edit|Paste Special...”,“未格式化文本”。
用这个y(i,j)就有很大一坨数据在程序中,怪吓人的,由没有别的方法咧?
谢谢啊!
恩,等待,再研究研究。非常感谢你了!
用@OLE函数:y(i,j)=@OLE('excel文件路径','excel中对要引用数据的命名')
station取5,与手动输入y(i,j)数据的结果比较一样。
station取250,与“把excel中的8行250列数据复制,用Edit|Paste Special...-未格式化文本”的结果比较也一样。
我想结果应该没多大问题了。 再找别人的数据验证哈就放心了。
这么快就差不多解决了,谢谢madio的帮忙!!
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |