0
点赞
收藏
分享

微信扫一扫

求解规划问题:lingo的初探


今天听康神讲解才知道数模编程考验的是选手会不会使用一些骚操作,懂不懂一些黑科技。。

所以lingo是一定得学的了。。


使用起来十分无脑。。然而也很容易忘了。。用的时候来这里看一下正合适。。

先上代码。。


max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;
x1<=2*x2;
x1+x2<100;
@gin(x1);@gin(x2);!x1 x2为整数;

十分简单的代码。。只是为了展示语法。。

!表示注释

语句之间要用分号隔开,包括注释!!!

点击

求解规划问题:lingo的初探_大整数

开始解规划问题。。。

然后变量取值有直接写x1=xxx   x2=xxxx什么的。。

另外目标函数最值显示在Objective Value那里。。。


然后这软件有个设定是默认自变量为正整数。。


min=2*x1+x2;
x1+x2<=1;
x2-x1<=1.5;
x1+x2>=-1;

这个求解出来x1=x2=0,明显不合要求。。

当需要取到小数和负数时,可以用free函数。。


min=2*x1+x2;
x1+x2<=1;
x2-x1<=1.5;
x1+x2>=-1;
@free(x1);@free(x2);

这样解出来 x1=-1.25    x2=0.25


还有一个bnd函数也很管用


min=2*x1+x2;
@bnd(-0.5,x1,0.5);
@bnd(0.5,x2,1.5);

注意参数的位置就行了。。



再来几个常见的函数(换汤不换药)

@cos(x)             返回x的余弦值
@tan(x)             返回x的正切值
@exp(x)             返回常数e的x次方
@log(x)             返回x的自然对数
@lgm(x)             返回x的gamma函数的自然对数
@sign(x)            如果x<0返回-1;否则,返回1

@floor(x)           返回x的整数部分。当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x最大整数。@smax(x1,x2,…,xn)  返回x1x2…,xn中的最大值
@smin(x1,x2,…,xn)  返回x1,x2,…,xn中的最小值



然后需要来一个比较重要的例子。。。

求解规划问题:lingo的初探_黑科技_02



sets:
x/X1..X6/:asum;
y/Y1..Y8/:bsum;
link(x,y):c,v;
endsets

min=@sum(link:c*v);

@for(y(j):
@sum(x(i):v(i,j))=bsum(j));

@for(x(i):
@sum(y(j):v(i,j))<=asum(i));

data:
asum=60 55 51 43 41 52;
bsum=35 37 22 32 41 32 43 38;
c=6 2 6 7 4 2 9 5
4 9 5 3 8 5 8 2
5 2 1 9 7 4 3 3
7 6 7 3 9 2 7 1
2 3 9 5 7 2 6 5
5 5 2 2 8 1 4 3;
enddata

这个例子和其他规划问题其实无两样,就是变量和条件过多了,不用set写就真的太丑了。。

然后set的用法还弄不清楚。。这个做为模板用就可以。。

当然还是要硬撤一下自己对这个模板的理解。。

先说说sets里面的

:后面应该是继承了某个类吧。。没有继承默认为123456...

一维继承一维岂不是直接复制?


然后link这个可以随便改的。。并不是关键字。。

因此这里应该是生成了一个类似map一样的东西?通过x,y来索引,元素为一个元组,[c,v]

然后c定义好的了已经,剩下就是求解v了。。

然后像x(i)这样的估计就是循环着令i=x1,x2这样。。即把x里面的元素赋值给i。。

函数调用看来应该都是用@来识别了。。然后sum其实也是个小循环吧。。




貌似还有一些操作。。有需要再来学习。。以后应该会不定期补充。。。

​​http://tieba.baidu.com/p/1796749594?red_tag=n2651462235&traceid=​​

​​http://tieba.baidu.com/p/1773658973?pn=3​​

这个链接里面有lingo的详细讲解。。而且还有一些黑科技。。

举报

相关推荐

0 条评论