太多人私信问我了,懒得回就写在专栏里了
基本思路参考:
一.第一问代码:
model:
sets:
n/1..8/: w,sb,mb ;
endsets
data:
w=@ole('C:\Users\jj\Desktop\数模\五一建模\A\A附录2.xlsx','w');
enddata
@for(n(i):@gin(sb(i)));
@for(n(i):@gin(mb(i)));
@for(n(i):sb(i)>=0);
@for(n(i):mb(i)>=0);
@for(n(i)|i#ne#1:@sum(n(k)|k#le#i-1:sb(k))+13-w(i)>=0);
@for(n(i)|i#ne#1:@sum(n(k)|k#le#i-1:mb(k))+50-4*w(i)-@if((mb(i)/10-@floor(mb(i)/10))#eq#0,@floor(mb(i)/10),@floor(mb(i)/10)+1)>=4*w(i-1));
min=@sum(n(i)|i#ne#1:110*mb(i)+10*( @if( ( mb(i)/10-@floor(mb(i)/10) )#eq#0,@floor(mb(i)/10),@floor(mb(i)/10)+1 ) )+200*sb(i)+10*(13+@sum(n(k)|k#le#i-1:sb(k))-w(i))+5*(50+@sum(n(k)|k#le#i-1:mb(k))-4*w(i)-@if((mb(i)/10-@floor(mb(i)/10))#eq#0,@floor(mb(i)/10),@floor(mb(i)/10)+1))
) +110*mb(1)+10*( @if( ( mb(1)/10-@floor(mb(1)/10) )#eq#0,@floor(mb(1)/10),@floor(mb(1)/10)+1 ) )+200*sb(1)+10*(13-w(1))+5*(50-4*w(1)-@if((mb(1)/10-@floor(mb(1)/10))#eq#0,@floor(mb(1)/10),@floor(mb(1)/10)+1));
end
二.代码解析:
w:血管机器人使用数量
sb:购买的容器艇数目
mb:购买的操作手数目
这里是从EXCEL里读取数据
具体教程自行百度
这里是约束条件
@for(n(i): ); //循环n次,i代表是第几次,n前面定义了
@gin(x); //限制x为整数
#ne# //若前后不相等,则为true;否则为flase
@sum(n(k): ) //累加n次
@floor(x); //向下取整函数
@if(条件,条件真时的值,条件假时的值)
所以@if((mb(i)/10-@floor(mb(i)/10))#eq#0,@floor(mb(i)/10),@floor(mb(i)/10)+1)
这一大串就是向上取整
为什么我要向上取整?
因为我认为去指导训练的老操作手一定是整数,不存在半个老操作手去指导5个操作手,这和上面那个视频里的说法有所不同
三.结束语:
后面的题都大同小异,看懂了我的代码随便改,还是不懂的可以去B站找一下LINGO编程教学,有一点要提醒,这个方法计算量非常大,一旦数据量上来了,LINGO要算5,6个小时