太多人私信问我了,懒得回就写在专栏里了

基本思路参考:


一.第一问代码:

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个小时

这是我那天算了6个半小时没出来