lingo入门教程之一--- 初识lingoingo对于一些线性或者非线性的规划,优化问题非常有效首先介绍一下,在lingo中运行程序时出现的页面(在工具栏点击类似靶子一样的图标便可运行)Solver status:求解器(求解程序)状态框Model Class:当前模型的类型:LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以I开头表示IP,以PI 开头表示PIP)State:当前解的状态:"Global Optimum", "LocalOptimum", "Feasible", "Infeasible“(不可行), "Unbounded “(无界), "Interrupted“(中断), "Undetermined“(未确定)Object:解的目标函数值Infeasibility:当前约束不满足的总量(不是不满足的约束的个数):实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界命令形式给出的约束)Iteration:目前为止的迭代次数Extend solverstatus:扩展的求解器(求解程序)状态框Solver type:使用的特殊求解程序:Bestobj :目前为止找到的可行解的最佳目标函数值Objbound:目标函数值的界Steps:特殊求解程序当前运行步数:Active:有效步数Variables(变量数量):变量总数(Total)、非线性变量数(Nonlinear)、整数变量数(Integer)。
Constraints(约束数量):约束总数(Total)、非线性约束个数(Nonlinear)。
Nonzeros(非零系数数量):总数(Total)、非线性项系数个数(Nonlinear)。
GeneratorMemory Used (K) (内存使用量)ElapsedRuntime (hh:mm:ss)(求解花费的时间)运行之后页面介绍(这里的运行界面并不是与上面的运行过程中出现界面一致,即并非来自于同一个程序运行出现)第一行表示在经过457次迭代后得到局部最优解第二行给出该局部最优解的具体值下面给出取局部最优值时,x1 x2的具体取值这里求解的是局部最优解,如果想求出全局最优解,可以进行页面设置:lingo --> option --> global solver --> 勾选use global solver对于运行结果也可以另存为,格式一般为ldt,因为有时候对于求解一个问题,或许需要运行很久才可以得出结果,所以没必要每次为了看结果都运行,而是运行成功一次后便把结果保存下来注意事项LINGO总是根据“MAX=”或“MIN=”寻找目标函数;程序语句的顺序一般不重要,既可以随意调换;程序运用函数时都是以@开头;程序中的变量默认为非负数,想要改变变量类型必须有相应函数调整程序中变量不区分大小写;语句必须以分号结尾;注释以!开始,且注释语句后面必须也有分号,注释默认注释到第一个分号处,意思是分号前面会全部被注释掉。
例题:[plain]view plain copylingo入门教程之二--- 集合运用lingo中的集合用法很多,这里主要通过几个例题来进行讲解对于每一个问题,都要先找到对应的目标函数,然后对相应值进行初始化,然后找到约束条件等进行求解例1:SAILCO公司需要决定下四个季度的帆船生产量。
下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必须按时满足。
每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元。
如果加班生产,每条船的生产费用为450美元。
每个季度末,每条船的库存费用为20美元。
假定生产提前期为0,初始库存为10条船。
如何安排生产可使总费用最小?分析:用DEM,RP,OP,INV分别表示需求量、正常生产的产量、加班生产的产量、库存量,则DEM,RP,OP,INV 对每个季度都应该有一个对应的值,也就说他们都应该是一个由4个元素组成的数组,其中DEM是已知的,而RP,OP,INV是未知数。
接下里这里例子会讲到关于集合的派生问题,这个跟c++里面的继承与派生比较相像例2:建筑工地的位置(用平面坐标a,b表示,距离单位:公里)及水泥日用量d(吨)下表给出。
有两个临时料场位于P (5,1), Q (2, 7),日储量各有20吨。
从A, B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。
两个新的料场应建在何处,节省的吨公里数有多大?例3:(最短路问题) 在纵横交错的公路网中,货车司机希望找到一条从一个城市到另一个城市的最短路.下图表示的是公路网,节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距离(百公里).那么,货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?分析:假设从S到T的最优行驶路线P 经过城市C1, 则P中从S到C1的子路也一定是从S到C1的最优行驶路线;假设P 经过城市C2, 则P中从S到C2的子路也一定是从S到C2的最优行驶路线.因此, 为得到从S 到T的最优行驶路线, 只需要先求出从S到C k(k=1,2)的最优行驶路线,就可以方便地得到从S到T的最优行驶路线. 同样,为了求出从S到Ck(k=1,2)的最优行驶路线, 只需要先求出从S到Bj(j=1,2)的最优行驶路线;为了求出从S到Bj(j=1,2)的最优行驶路线, 只需要先求出从S到Ai(i=1,2,3)的最优行驶路线. 而S到Ai(i=1,2,3)的最优行驶路线是很容易得到的(实际上, 此例中S到Ai(i=1,2,3)只有唯一的道路) .此例中可把从S到T的行驶过程分成4个阶段,即S→Ai(i=1,2或3),Ai→Bj(j=1或2),Bj→Ck(k=1或2),Ck→ T. 记d(Y,X)为城市Y与城市X之间的直接距离(若这两个城市之间没有道路直接相连,则可以认为直接距离为∞),用L(X)表示城市S到城市X的最优行驶路线的路长:8名队员的身高及擅长位置见下表:出场阵容应满足以下条件:(1)只能有一名中锋上场;(2)至少有一名后卫;(3)如1号和4号均上场,则6号不出场;(4)2号和8号至少有一个不出场.问应当选择哪5名队员上场,才能使出场队员平均身高最高?分析:典型0/1问题,这个时候是一维的情况,可以设置一个一维的集合,取值只能是0或者1,为1时代表选取对应运动员,否则不选目标函数:该集合与对应身高相乘求和,即为1时表示选取侧求和相加,为0时侧不选取,不做任何处理显示结果中的matchMATCH( 1) 0.000000 -0.3840000MATCH( 2) 1.000000 -0.3800000MATCH( 3) 1.000000 -0.3760000MATCH( 4) 1.000000 -0.3720000MATCH( 5) 1.000000 -0.3700000MATCH( 6) 1.000000 -0.3660000MATCH( 7) 0.000000 -0.3600000MATCH( 8) 0.000000 -0.3560000有时候会觉得match过多难以找到被选中的即match为1的具体哪些值,这个时候可以lingo -->solution然后match显示如下Variable Value Reduced CostMATCH( 2) 1.000000 -0.3800000MATCH( 3) 1.000000 -0.3760000MATCH( 4) 1.000000 -0.3720000MATCH( 5) 1.000000 -0.3700000MATCH( 6) 1.000000 -0.3660000例5:某商业公司计划开办5家新商店.为了尽早建成营业,商业公司决定由5家建筑公司分别承建.已知建筑公司A i(i=1,2,3,4,5)对新商店B j(j=1,2,3,4,5)的建造费用的报价(万元)为c ij(i,j=1,2,3,4,5),见下表.商业公司应当对5家建筑公司怎样分配建造任务,才能使总的建造费用最少?分析:典型的01问题,设置一个五行(对应集合中的建筑公司)五列(对应着集合中的建筑物) 的矩阵,当其中元素为1时表示该建筑公司建筑该建筑物,为0时侧相反。
目标函数:该矩阵对应的值与题目中的价格矩阵一一对应相乘然后求和,即该矩阵为1时侧表示某建筑公司建筑对应建筑物侧求和加上,否则侧不加很明显约束条件便是一个建筑公司只能建筑一个建筑物,即矩阵每一列的和只能为一;一个建筑物只能被一个建筑公司建成,即每一列的和只能为一;而且不同建筑公司必须建筑不同的建筑物;对应设置的矩阵其lingo入门教程之三--- 文件数据处理有时候我们想输入的数据是在一个Excel表格或者其他什么形式中,或者说这里数据是实时变化的并不利于直接在程序中输入,耳而应该在程序之外将数据存储,实现数据与程序的分离存储,这个时候就涉及到程序与数据之间的传递下面简要介绍一个如何进行数据与程序之间的传递下面的讲解都是基于如下的问题模型有个城市都需要采购一定量的物品,但每个城市只允许在自身所在的城市采购,城市i的最低需求量为need(i),最大供应量为supply(i),单件采购成本为cost(i),如何采购总成本最小?模型:设order(i)为城市i的采购量,则问题的数学模型为1.直接粘贴复制直接利用把存储在Excel或者其他什么地方的数据复制粘贴过来,这里需要注意lingo里面的复制是按列进行的(这里在前面已经讲过),不注意的话可能会发生数据赋值的错乱粘贴的选项可以依次试一下上面的不同粘贴格式的效果2.读取ldt数据文件:@file(数据文件名);如果路径不一致,也可以手动添加,Edit --> insert new object...应当注意此时的文件类型的ldt格式,具体里面内容:Seattle,Detroit,Chicago,Denver~cost,need,supply,order~12,28,15,20~1600,1800,1200,1000~1700,1900,1300,1100 注意中间的不同赋值用~间隔对于路径不一致的情况解决方式与上述一样。