【数学建模】LINGO编程

news2024/9/23 1:29:12

        LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到了广泛应用。LINGO主要用于求解线性规划、非线性规划、一次规划和整数规划等问题,也可用于求解一些线性和非线性方程组及代数方程求根等。本章介绍的LINGO可在LINGO5.0、LINGO9.0、LINGO12.0等中使用。

一.LINGO使用介绍

1.1 LINGO编写格式

        LINGO模型以MODEL开始,以END结束。中间为语句,分为四大部分。

(1)集合部分(SETS)

        这部分以“SETS:”开始,以“ENDSETS”结束。这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,在LINGO中称为集合(SET)及其元素和属性。

        LINGO中的集合有两类:

  • 一类是原始集合,其定义的格式为:
    • SETNAME/member list(or 1,n)/:attribute, attribute, etc.
  • 另一类是导出集合,即引用其他集合定义的集合,其定义的格式为:
    • SETNAME(set1, set2, etc.): attribute, attribute, etc.

        如果要在程序中使用数组,就必须在该部分定义,否则可不需要。如

Person/1..10/:A;
Task/1..12/:B;
Link(Person,Task):X;

(2)目标与约束

        这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数。求解优化问题时,该部分是必须的。

(3)数据部分(DATA)

        这部分以“DATA:”开始,以“END DATA”结束。其作用在于对某些集合的属性(数组)输入必要的数据。格式为:attribute=value_list。该部分主要是方便数据的输入。

(4)初始化部分(INIT)

        这部分以“INIT:”开始,以“END INIT”结束。作用在于对某些集合的属性(数组)定义初值。格式为:attribute=value_list。

        编写LINGO程序要注意的几点:

  • 所有的语句除SETS, ENDSETS, DATA, ENDDATA, INIT, ENDINIT和MODEL, END之外必须以一个分号 “;” 结尾。
  • LINGO求解非线性规划时已约定各变量非负。

1.2 LINGO内部函数使用详解.

        LINGO建立优化模型时可以引用大量内部函数,这些函数以“@”符号打头.

(1) 常用数学函数

@ABS(X) 返回变量X的绝对数值。
@COS(X) 返回X的余弦值,X的单位为弧度
@EXP(X)返回指数函数值,其中e=2.72828...
@FLOOR(X)向0靠近返回回X的整数部分。
@LGM(X)返回l函数的自然对数值。
@LOG(X)返回变量X的自然对数值

@SIGN(X) 返回变量X的符号值,当X<0时为-1;当X>0时为1.
@SIN(X) 返回X的正弦值,X的单位为弧度
@SMAX(X1, X2,..., XN)
返回一列值X1, X2,..., XN的最大值.
@SMIN(X1, X2,..., XN)
返回一列值X1, X2,..., XN的最小值.
@TAN(X) 返回X的正切值,X的单位为弧度

(2)集合函数

        集合函数的用法如下: set_operator(set_name|condition:expression)。其中set_operator是集合函数名,set_name是数据集合名,expression部分是表达式,|condition部分是条件,用逻辑表达式描述(无条件时可省略)。逻辑表达式式中可以三种逻辑算符#AND#(与), #OR# (或), #NOT#(非)和六种关系算符#EQ# (等于), #NE# (不等于),#GT#(大于), #GE#(大于等于), #LT#(小于), #LE#(小于等于)。

常见的集合函数如下:

@FOR(set_name: constraint_expressions)对集合(set_name)的每个元素独立地生成约束,约束由约束表达式(constraint_expressions)描述。
@MAX(set_name: expression)返回集合上表达式(expression)的最大值。
@MIN(set_name: expression)返回集合上的表达式(expression)最小值。
@SUM(set_name: expression)返回集合上的表达式(expression)的和。
@SIZE(set_name)返回数据集set_name中包含元素的个数。
@IN(set_name,set_element)如果数据集set_name中包含元素set_element 则返回1,否则返回0。

(3) 变量界定函数

变量函数对变量的取值范围附加限制,共有四种。

@BND(L,X,U)限制L≤X≤U
@BIN(X)限制X为0或1.
@FREE(X)取消对X的符号限制(可取任意实数值).
@GIN(X)限制X为整数值.

二、LINGO求解优化模型实例

1. 某昼夜服务的公交路线每天各时间区段内需司机和乘务人员见表1.

        设司机和乘务人员分别在各时间区段一开始上班, 并连续工作八小时, 问该公交线路至少配备多少名司机和乘务人员? 从第一班开始,试建立线性模型。

        LINGO程序如下:

MODEL:
min=x1+x2+x3+x4+x5+x6;
x1+x6>=60;
x1+x2>=70;
x2+x3>=60;
x3+x4>=50;
x4+x5>=20;
x5+x6>=30;
END

        得到的解为: x1=60,x2=10,x3=50,x4=0,x5=30,x6=0; 配备的司机和乘务人员最少为150人。

2. 公司在各地有4项业务, 选定了4位业务员去处理. 由于业务能力、经验和其它情况不同, 4业务员处理4项业务的费用(单位:元)各不相同, 见表2。应当怎样分派任务, 才能使总的费用最小?

解: 这是一个最优指派问题. 引入如下变量:

min Z = \sum_{i=1}^{4} \sum _{j=1}^{4} a_{ij} \ast x_{ij}

LINGO程序如下:

MODEL:
SETS:
person/1..4/;
task/1..4/;
assign(person,task):a,x;
ENDSETS
DATA:
a=1100,800,1000,700,
   600,500,300,800,
   400,800,1000,900,
  1100,1000,500,700;
ENDDATA
min=@sum(assign:a*x);
@for(task(j):@sum(person(i):x(i,j))=1);
@for(person(i):@sum(task(j):x(i,j))=1);
@for(assign(i,j):@bin(x(i,j)));
END

得到的结果如下:
x(1,1)=0,x(1,2)=0,x(1,3)=0,x(1,4)=1;
x(2,1)=0,x(2,2)=1,x(2,3)=0,x(2,4)=0;
x(3,1)=1,x(3,2)=0,x(3,3)=0,x(3,4)=0;
x(4,1)=0,x(4,2)=0,x(4,3)=1,x(4,4)=0;

最小费用为2100元.即第1个做第4项业务, 第2个做第2项业务, 第3个做第1项业务, 第4个做第3项业务.总费用达到最小, 为2100元。

采用数据文件方式程序:

model:
sets:
person/1..4/;
task/1..4/;
assign(person,task):a,x;
endsets
data:
a=@file(data.txt);
enddata
min=@sum(assign:a*x);
@for(person(i):@sum(task(j):x(i,j))=1);
@for(task(j):@sum(person(i):x(i,j))=1);
@for(assign(i,j):@bin(x(i,j)));
end

同时在LINGO目录下建立文本文件data.txt, 数据如下:
1100,800,1000,700
600,500,300,800
400,800,1000,900
1100,1000,500,700

3. 有四种资源被用于生产三种产品, 资源量、产品单件可变费用、单件售价、资源单耗量及组织三种商品生产的固定费用用见下表.现要求制定一个生产计划,使总收益最大。

第I种产品销售一件可收入7-4=3元,第II种产品销售一件可收入10-6=4元,第III种产品销售一件可收入20-12=8元.则问题的整数规划模型见右。

得到的解为x1=100,x2=0,x3=0,y1=1,y2=0,y3=0.最大值为Z=200元.

LINGO程序.

MODEL:
DATA:
M=150;
ENDDATA
max=3*x1+4*x2+8*x3-100*y1-150*y2-200*y3;!目标函数;
2*x1+4*x2+8*x3<=500;
2*x1+3*x2+4*x3<=300;
x1+2*x2+3*x3<=100;
3*x1+5*x2+7*x3<=700;
x1<=M*y1; x2<=M*y2; x3<=M*y3;
@GIN(x1); @GIN(x2); @GIN(x3); !指定产品件数为整数;
@BIN(y1); @BIN(y2); @BIN(y3); !指定0-1变量;
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Next-Key Lock 详解及其在 REPEATABLE READ 隔离级别中的作用

Next-Key Lock 是 MySQL InnoDB 引擎中使用的一种锁定机制&#xff0c;专门用于在 REPEATABLE READ 隔离级别下防止幻读&#xff08;Phantom Reads&#xff09;。它结合了行锁&#xff08;Record Lock&#xff09;和间隙锁&#xff08;Gap Lock&#xff09;&#xff0c;能够在高…

抽卡机小程序,开启全新拆卡乐趣

近段时间&#xff0c;盲盒卡牌市场异常火爆&#xff0c;最近爆火的“小马宝莉”系列卡牌就深受消费者的喜爱&#xff0c;受到了广泛关注&#xff0c;同时也推动了卡牌市场的快速发展&#xff01;盲盒卡牌拥有隐藏款卡牌和限量款卡牌&#xff0c;具有非常大的收藏价值&#xff0…

图纸防泄密高招:5款经典的图纸加密软件

图纸加密软件是专为保护设计图纸等敏感文件而设计的加密工具&#xff0c;通过先进的加密技术确保文件在传输、存储和使用过程中的安全性。小编试用后发现了5款经典的图纸加密软件。 1. 安企神软件 7天试用https://work.weixin.qq.com/ca/cawcde06a33907e60a 重点介绍&#xf…

2-68 基于matlab的小波分解子模式和盒维数的车型识别程序

基于matlab的小波分解子模式和盒维数的车型识别程序&#xff0c;可以选择不同车型&#xff0c;包括小车、中车、大车。GUI可视化界面操作&#xff0c;已包括多种图片。程序已调通&#xff0c;可直接运行。 2-68 小波分解子模式和盒维数 - 小红书 (xiaohongshu.com)

软件工程的核心原则:KISS, DRY, SOLID, YAGNI

软件工程的核心原则&#xff1a;KISS, DRY, SOLID, YAGNI — 深入解析与实践指南 引言 在软件开发的广阔领域中&#xff0c;原则和实践是构建高质量、可维护系统的基石。本文将深入探讨四个核心原则&#xff1a;KISS&#xff08;保持简单&#xff0c;愚蠢&#xff09;、DRY&a…

Element-05.组件-Form表单

一.Form表单组件 Form表单组件可以定义在Dialog对话框组件中 与Dialog对话框组件中的属性dialogTableVisible相似&#xff0c;dialogFormVisible的默认值也为false&#xff0c;这也说明了Dialog对话框中的Form表单默认是不显示的&#xff0c;只有当绑定的click事件发生后才会将…

解决麒麟 V10 SP1 升级 Python 后 yum dnf不可用问题

目录 一、前提概要 二、解决办法 1、卸载原有的 python 2、安装 Python 3.7.9 rpm 3、安装一系列 yum 相关 rpm 4、rpm 包下载 一、前提概要 在部署 gaussDB 的时候&#xff0c;安装代理时要求 python 版本满足 3.7.9&#xff0c;但已安装的麒麟 V10 内集成的 python 版…

探索工业互联网智能赋能智能制造算法综述

概述 文档地址&#xff1a;https://arxiv.org/pdf/2312.16174 源码地址&#xff1a;https://github.com/microsoft/Cream.git 由于激烈的竞争环境和日益增长的个性化定制需求&#xff0c;制造业面临着数字化转型和升级的压力。为我们指明了前进的方向。然而&#xff0c;现有研…

stable diffusion inapinting(img2img+inpaint/inapint-model)

https://zhuanlan.zhihu.com/p/681250295https://zhuanlan.zhihu.com/p/681250295AIGC专栏4——Stable Diffusion原理解析-inpaint修复图片为例_diffusion inpaint-CSDN博客文章浏览阅读1.7w次,点赞42次,收藏79次。Inpaint是Stable Diffusion中的常用方法,一起简单学习一下。…

python之pandas (5 画图)

画图 Series画图 import pandas as pd import numpy as np import matplotlib.pyplot as pltdatapd.Series(np.random.randn(1000),indexnp.arange(1000)) #randn生成服从标准正态分布&#xff08;均值为0&#xff0c;标准差为1&#xff09;的随机样本&#xff0c;1000表示10…

复现YOLOv8语义分割训练自己的数据集

一、YOLOv8源码下载&#xff1a;https://github.com/ultralytics/ultralytics/tree/v8.2.76 我下载的是最新版本8.2.76 接着下载权重 下载源码后解压 二、配置虚拟环境 创建虚拟环境 conda create -n yolov8 python3.9 激活环境 conda activate yolov8 下载pytorch,官网地…

数据结构——关于栈

1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则 比如&#xff1a;羽毛球桶&#xff0c;弹夹等等 压…

【C++面经】

1 2 因为ptr还记录了对象的个数&#xff0c;通过中括号标识&#xff0c;就知道药一一调用数组的每个对象的析构函数 3 4 5 6

【C语言】二叉树链式结构的实现,详解

0.前言 二叉树的基本操作的实现基本离不开一个思想——分治算法。 分治算法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题&#xff0c;这些子问题相互独立且与原问题相同。递归地解这些子问题&#xff0c;然后将各子问题的解合并得到原问题的解。这样&#xff0…

mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现

一、mysql主从复制及同步 1、mysql主从自动开机同步 2、配置mysql5.7版本 mysql-5.7.44-linux-glibc2.12-x86_64.tar 启动服务、登录 对数据库进行基本操作 3、使用python操纵mysql数据库 4、编辑python脚本自动化操纵mysql数据库 二、mycat读写分离实现 1.上传jdk和mycat安装包…

项目简介:pyiqa-sal | 图像质量评价代码库

项目地址&#xff1a;https://github.com/Alexkkir/pyiqa-sal/tree/main 这是一个纯python和pytorch编写的图像质量评估工具箱&#xff0c;提供了许多主流全参考&#xff08;FR&#xff09;和无参考&#xff08;NR&#xff09;指标的重新实现&#xff08;如果有的话&#xff0…

MES系统从哪几方面提升企业制造水平?

在当今这个快速变化的制造环境中&#xff0c;企业对于提升制造水平的追求从未停止。制造执行系统&#xff08;MES&#xff09;作为连接企业战略规划与车间实际操作的核心工具&#xff0c;其重要性日益凸显。盘古信息MES系统&#xff0c;凭借其独特的功能模块和创新的设计理念&a…

数据库-DDL语言-数据定义语言

DDL语言-数据定义语言 对数据库对象进行操作的语言, 涉及到的关键字CREATE,ALTER,DROP 对数据库的操作 新建一个数据库 语法 CREATE DATABASE 数据库名 [charset字符集]例 新建一个数据库:mydb CREATE DATABASE mydb;注:SQL语句不区分大小写&#xff0c;但是好的书写习惯…

【考研数学】题目类型:出现两次积分限,但实际上是一次积分。

考研中&#xff0c;有一类题目是出现了两次积分限&#xff08;尤其是人为对题目进行变换、化简时&#xff09;&#xff0c;但解题方法不是利用二重积分方法&#xff0c;而是一次积分。常用凑微分、分部积分法。 以武忠祥老师严选题的两道题目为例&#xff1a; 这两道题就是“披…

模拟实现字符串相关函数(第二十七天)

&#xff01;&#xff01;assert---断言在函数中非常有用&#xff0c;能明确的指出哪里出了错误&#xff0c;然后后续自己方便进行更改 const不能通过直接赋值来改变&#xff0c;但是&#xff01;&#xff01;但是可以通过改地址的方式来改值&#xff01;&#xff01;这时只需要…