lingo代码大全

软件: lingo
全方位数据报表
许可分析

许可分析

免费体验
识别闲置、及时回收
许可优化

许可优化

免费体验
多维度智能分析
许可分析

许可分析

免费体验
减少成本、盘活许可
许可优化

许可优化

免费体验
LINGO代码大全:从基础语法到实用案例

LINGO是一款强大的数学规划工具,广泛应用于线性规划、整数规划、非线性规划等领域。其代码结构清晰,核心功能通过集合、目标函数、约束条件实现,以下是LINGO代码的全景式总结。

一、LINGO基本语法规则

语句结构:每条语句以分号(;)结束,注释以感叹号(!)开头,支持中文或英文注释。

变量命名:变量名需以字母开头,可包含字母、数字、下划线(_),长度不超过32个字符,默认非负(可通过@FREE取消限制)。

运算符优先级:

算术运算符:^(幂)>*(乘)/(除)>+(加)-(减);

逻辑运算符:NOT(否定)>EQ(等于)>NE(不等于)>GT(大于)>GE(大于等于)>LT(小于)>LE(小于等于)>AND(与)>OR(或)。

二、LINGO模型结构

LINGO模型通常由五大段组成(部分段可省略):

集合段(SETS-ENDSETS):定义模型中的集合(如决策变量维度、数据分组),是LINGO的特色功能。SETS:

PRODUCTS /P1..P3/: Profit, Quantity; ! 定义产品集合,含利润和数量属性

CUSTOMERS /C1..C4/: Demand; ! 定义客户集合,含需求属性

SHIPMENTS(PRODUCTS, CUSTOMERS): Cost, Volume; ! 定义运输路径集合,含成本和体积属性

ENDSETS

数据段(DATA-ENDDATA):为集合属性赋值,支持直接输入或从外部文件(如Excel)导入。DATA:

Profit = 10, 15, 8; ! 产品P1-P3的利润

Demand = 100, 150, 200, 120; ! 客户C1-C4的需求

Cost = 2, 3, 5, 4, 3, 2, 4, 5, 6, 3, 5, 4; ! 运输成本(3产品×4客户)

ENDDATA

初始段(INIT-ENDINIT):为变量设置初始值(非线性规划中可加速收敛)。INIT:

x = 1; y = 2; ! 变量x、y的初始值

ENDINIT

目标与约束段:定义模型的目标函数(MAX=或MIN=)和约束条件(=、<=、>=),是模型的核心逻辑。MIN = @SUM(SHIPMENTS(I,J): Cost(I,J) * Volume(I,J)); ! 最小化总运输成本

@FOR(CUSTOMERS(J): @SUM(PRODUCTS(I): Volume(I,J)) = Demand(J)); ! 供需平衡约束

@FOR(PRODUCTS(I): @SUM(CUSTOMERS(J): Volume(I,J)) <= 200); ! 生产能力约束

计算段(CALC-ENDCALC):对数据进行预处理(如求和、平均值),结果不参与优化。CALC:

Total_Demand = @SUM(CUSTOMERS: Demand); ! 计算总需求

ENDCALC

三、常用函数与集合操作

LINGO提供丰富的内置函数,用于数据处理、逻辑判断和数学计算:

集合循环函数:遍历集合成员,生成约束或表达式。

@FOR:对集合每个成员生成约束(如供需平衡约束);

@SUM:计算集合成员表达式的和(如总成本);

@MAX/@MIN:返回集合成员表达式的最大值/最小值(如最大利润)。

@FOR(PRODUCTS(I): @SUM(CUSTOMERS(J): Volume(I,J)) <= Capacity(I)); ! 每个产品的总产量不超过产能

lingo代码大全

Total_Profit = @SUM(PRODUCTS(I): Profit(I) * Quantity(I)); ! 总利润计算

数学函数:处理数值计算(如绝对值、指数、对数)。obj = @ABS(x - 5) + @SQRT(y) + @LOG(z); ! 绝对值+平方根+自然对数

逻辑函数:构建条件约束(如0-1变量、互斥条件)。

@BIN(x):限制x为0-1变量(二进制);

@GIN(x):限制x为整数变量;

@IF(logical_condition, true_result, false_result):条件判断。

@BIN(x1); @BIN(x2); ! x1、x2为二进制变量(选课模型)

y = @IF(x > 10, x^2, 2*x); ! 若x>10则y=x²,否则y=2x

文件操作函数:与外部数据交互(如Excel导入导出)。

@OLE:从Excel读取数据或写入结果(需指定文件路径和单元格范围);

@FILE:从文本文件读取数据(简化大规模数据输入)。

DATA: Cost = @OLE('C:\Data\Transport.xlsx', 'Sheet1!A1:D12'); ! 从Excel读取运输成本

@OLE('C:\Result\Output.xlsx', 'Sheet1!I1') = Total_Profit; ! 将总利润写入Excel

四、实用案例代码

线性整数规划(选课策略):

目标:在选修6门课的条件下,最大化总学分(学分数据:课程1-3为3分,课程4-6为2分)。

MODEL:

sets:

COURSES /C1..C6/: Credit, Select;

endsets

DATA:

Credit = 3, 3, 3, 2, 2, 2; ! 课程学分

ENDDATA

MIN = @SUM(COURSES: Select); ! 最小化选课数量(等价于选6门)

@FOR(COURSES: @BIN(Select)); ! 选课变量为0-

@SUM(COURSES: Credit * Select) >= 10; ! 总学分>=

@SUM(COURSES: Select) = 6; ! 选6门课

END

非线性整数规划(生产计划):

目标:最大化生产利润(利润=收入-成本),约束包括生产能力、市场需求。

MODEL:

sets:

PRODUCTS /P1..P4/: Profit, Quantity, Capacity;

CUSTOMERS /C1..C3/: Demand;

SHIPMENTS(PRODUCTS, CUSTOMERS): Volume;

endsets

DATA:

Profit = 10, 15, 8, 12; ! 产品利润

Capacity = 200, 150, 100, 180; ! 产品产能

Demand = 100, 150, 200; ! 客户需求

ENDDATA

MAX = @SUM(PRODUCTS(I): Profit(I) * Quantity(I));

@FOR(PRODUCTS(I): @GIN(Quantity(I))); ! 产量为整数

@FOR(PRODUCTS(I): Quantity(I) <= Capacity(I));

@FOR(CUSTOMERS(J): @SUM(PRODUCTS(I): Volume(I,J)) = Demand(J));

@FOR(PRODUCTS(I): @SUM(CUSTOMERS(J): Volume(I,J)) <= Quantity(I));

END

路径优化问题(最短路径):

目标:找到从起点到终点的最短路径(节点坐标:(0,0)、(1,2)、(3,1)、(4,3))。

MODEL:

sets:

NODES /N1..N4/: X, Y;

PATHS(NODES, NODES): Distance, Choose;

endsets

DATA:

X = 0, 1, 3, 4; ! 节点X坐标

Y = 0, 2, 1, 3; ! 节点Y坐标

ENDDATA

@FOR(PATHS(I,J) | I NE J: Distance(I,J) = @SQRT((X(I)-X(J))^2 + (Y(I)-Y(J))^2)); ! 计算节点间距离

@FOR(PATHS: @BIN(Choose)); ! 路径选择为0-

MIN = @SUM(PATHS: Distance * Choose); ! 最小化总距离

@SUM(PATHS("N1",J): Choose(J)) = 1; ! 从N1出发

@SUM(PATHS(I,"N4"): Choose(I)) = 1; ! 到达N

@FOR(NODES(K) | K NE "N1" AND K NE "N4":

@SUM(PATHS(I,K): Choose(I)) = @SUM(PATHS(K,J): Choose(J)); ! 流量平衡

);

END

五、常见问题与优化技巧

变量符号限制:默认变量非负,如需取消限制,使用@FREE(x);限制为整数用@GIN(x),二进制用@BIN(x)。

大规模数据处理:使用@FOR、@SUM等集合函数,避免逐个变量书写(如x1+x2+...+x100改为@SUM(PRODUCTS(I): x(I)))。

求解效率提升:为非线性模型设置合理初始值(INIT段),减少求解时间;拆分复杂约束(如将多阶段约束分解为多个简单约束)。

结果验证:通过@IF函数检查约束是否满足(如@IF(@SUM(DEMAND) > @SUM(CAPACITY), @WRN('Demand exceeds capacity'), 0)),避免无意义解。

上面内容覆盖了LINGO的核心代码框架与实用技巧,适用于大多数优化问题的建模与求解。通过灵活运用集合、函数和段结构,可快速将实际问题转化为LINGO模型,借助其强大的求解引擎获得最优解。

index-foot-banner-pc index-foot-banner-phone

点击一下 免费体验万千客户信任的许可优化平台

与100+大型企业一起,将本增效

与100+大型企业一起,将本增效

申请免费体验 申请免费体验