LINGO实例,优化问题1
转化为标准单目标/多目标,线性/非线性模型。
思路
寻找变量(决策变量)
寻找变量之间的关系(通常是不等式元素)
建立它们之间的方程(目标)
求解
例子:两辆平板车装货问题
有七种规格的包装箱要装到两辆平板车上.包装箱的宽和高是一样的, 但厚度 t(厘米)和
重量 w(公斤)是不同的。 表 1 给出了每种包装箱的厚度, 重量以及数量。 每辆平板车有 10.2
米的地方可用来装包装箱(像面包片那样), 载重为 40 吨。 由于地区货运的限制, 对 C5, C6, C7类包装箱的总数有一个特别的限制: 这三类包装箱所占的空间(厚度)不能超过 302.7 厘米。
设计一种装车方案, 使剩余的空间最小。
包装箱类型 | C1 | C2 | C3 | C4 | C5 | C6 | C7 |
---|---|---|---|---|---|---|---|
厚度 t(厘米) | 48.7 | 52.0 | 61.3 | 72.0 | 48.7 | 52.0 | 64.0 |
重量 w(公斤) | 2000 | 3000 | 1000 | 500 | 4000 | 2000 | 1000 |
件数 | 8 | 7 | 9 | 6 | 6 | 4 | 8 |
现在思考
设计装车方案⇒每辆车怎么装箱子⇒第n辆车装C1几件、C2几件…C7几件。
设第一辆车装载 Ci 类包装箱 xi 件, 第二辆车装载 Ci 类包装箱 yi 件,xi和yi就是决策变量。已知厚度t,重量w,件数n。
目标:剩余空间最小。
第一辆剩余:第二辆剩余:
总的就是Z1+Z2
使用LINGO进行求解。
好好看前面两篇LINGO教程或者去看视频教程,学会之后写这个很容易。
MODEL:
SETS:
ITEM/C1..C7/:T,W,X,Y,N;
ENDSETS
DATA:
T=48.7 52.0 61.3 72.0 48.7 52.0 64.0;
W=2000 3000 1000 500 4000 2000 1000;
N=8 7 9 6 6 4 8;
ENDDATA
MIN=(1020-DA)+(1020-DB);
@SUM(ITEM:T*X)=DA;
DA<=1020;
@SUM(ITEM:T*Y)=DB;
DB<=1020;
@FOR(ITEM:(X+Y)<=N);
@SUM(ITEM:W*X)<=40000;
@SUM(ITEM:W*Y)<=40000;
@SUM(ITEM(I)|I #GE# 5 #AND# I #LE# 7:T(I)*(X(I)+Y(I)))<=302.7;
@FOR(ITEM:@GIN(X));
@FOR(ITEM:@GIN(Y));
END
注意:这个问题解不唯一,据说有26种结果。唯一不变的就是值为0.6。
例子:选修课策略问题
某学校规定, 运筹学专业的学生毕业时必须至少学习过两门数学课、 三门运筹学课和两门计算机课。 这些课程的编号、 名称、 学分、 所属类别和先修课要求如下表所示。 那么,毕业时学生最少可以学习这些课程中哪些课程。如果某个学生既希望选修课程的数量少, 又希望所获得的学分多, 他可以选修哪些课程?
决策变量为X,X=1为选了这门课,0则没选。
接下来对约束条件进行描述。学分:GOAL。
对学分要求MIN=X*GOAL;
对于选课要求:
数学课:X1+X2+X3+X4+X5>=2;
运筹学:X3+X5+X6+X8+X9>=3;
计算机:X4+X6+X7+X9>=2;
先选课要求:
可以使用IF语句进行判断(但这里不建议使用,因为使用IF语句后,模型就变成了非线性模型)
我们转换一种思考方式:以X8(预测理论),需要前置X5(应用统计)为例来看
课程 | 情况1 | 情况2 | 情况3 |
---|---|---|---|
X8 | 1 | 0 | 0 |
X5 | 1 | 1 | 0 |
只有这三种情况,可以看出X8与X5的关系可以表示为X8<=X5。
于是应用到所有需要前置课程的科目上,形成约束条件。
MODEL:
SETS:
ITEM/1..9/:X,GOAL;
ENDSETS
DATA:
GOAL=5 4 4 3 4 3 2 2 3;
ENDDATA
!MAX=@SUM(ITEM:X*GOAL);
MIN=@SUM(ITEM:X);
X(1)+X(2)+X(3)+X(4)+X(5)>=2;
X(3)+X(5)+X(6)+X(8)+X(9)>=3;
X(4)+X(6)+X(7)+X(9)>=2;
X(3)<=X(1);
X(3)<=X(2);
X(4)<=X(7);
X(5)<=X(1);
X(5)<=X(2);
X(6)<=X(7);
X(8)<=X(5);
X(9)<=X(1);
X(9)<=X(2);
@FOR(ITEM:@BIN(X));
END
如果还要求上述条件下所选学分最多
这变成了一个双目标问题,如果希望表达这样的约束:1.需要使目标需求都为求最大/最小(通过使用倒数来等价);2.选出第一目标和第二目标,求解第一目标后作为前提条件加入约束条件
我们选择第二种方法(课少舒服,哈哈哈)。
例子:最优组队问题
某车间要参加单位举办的技术操作比赛, 比赛设有 5 个单项和一个全能项目(同时参加 5 个单项)
问题 1: 如果比赛规定:1. 每个车间可派 14 人参加比赛, 每人至少参赛一项。2. 参加比赛的队员中必须有 3 人参加全能比赛, 其余队员参加单项比赛, 且参加每个单项比赛的队员数不得超过 6 人(不包括全能队员)3.参加全能的队员不能参加单项。4.参加单项比赛的队员至多可以参加 3 个单项。5.参加单项比赛的队员得分是其参加项目得分之和, 参加全能比赛的队员得分是其参加项目得分和的 4/5, 车间的得分是车间所有参赛队员得分之和。
问如何安排参加比赛最好?
期望得分如下
这是一个集合问题,0-1决策。X表示1-14个队员可以选择项目1-5中的1-5项。
约束条件为:MAX=单向分+0.8全能
对于参加全能项的,他的列和为5。
对于其他人而言是小于等于3且大于等于1的。
全能队员三人。其余11人。
单向比赛的横向之和小于等于六(不包括全能)。
显然这样依旧无法区分谁是全能,谁是单项,我们在列中加入全能列,用Y来表示谁参加了全能。
以下是根据这两天所学自己编写的,与答案方法有些差异,但最终结果相同。
MODEL:
SETS:
MEMBER/1..14/:QGOAL,Y;
ITEM/1..5/;
LINK(ITEM,MEMBER):X,GOAL;
ENDSETS
DATA:
GOAL=
10 1 4 10 5 5 4 6 2 4 8 6 10 9
9 5 6 4 4 7 4 7 8 6 7 8 1 4
7 5 5 6 7 7 8 8 7 10 2 6 4 5
3 5 9 5 8 6 9 10 6 6 5 4 2 4
3 10 8 2 8 7 7 5 8 6 9 8 3 7;
@TEXT(RESULT.TXT)=QGOAL;
ENDDATA
CALC:
@FOR(MEMBER(J):QGOAL(J)=(@SUM(LINK(I,J):GOAL(I,J))));
ENDCALC
MAX=@SUM(LINK:X*GOAL)+0.8*@SUM(MEMBER:Y*QGOAL);
@SUM(MEMBER:Y)=3;
@FOR(ITEM(I):@SUM(MEMBER(J):X)<=6);
@FOR(MEMBER(J):@SUM(ITEM(I):X(I,J))<=3-3*Y(J));
@FOR(MEMBER(J):@SUM(ITEM(I):X(I,J))>=1-Y(J));
@FOR(LINK:@BIN(X));
@FOR(MEMBER:@BIN(Y));
END
答案的方法:
模型
model:
sets:
person/1..14/:y,s;
item/1..5/;
assign(item,person):x,A;
endsets
data:
A=10 1 4 10 5 5 4 6 2 4 8 6 10 9
9 5 6 4 4 7 4 7 8 6 7 8 1 4
7 5 5 6 7 7 8 8 7 10 2 6 4 5
3 5 9 5 8 6 9 10 6 6 5 4 2 4
3 10 8 2 8 7 7 5 8 6 9 8 3 7;
enddata
max=z;
z=z1+z2; !车间总得分;
z1=0.8*@sum(person(j):y(j)*s(j)); !参加全能比赛的总得分;
z2=@sum(assign(i,j):a(i,j)*x(i,j)); !参加单项比赛的总得分;@for(person(j):@sum(item(i):x(i,j))>=1-y(j));!每个参加单项比赛的队员至少
参加1项;
@for(person(j):@sum(item(i):x(i,j))<=3); !每个参加单项比赛的队员最多不超过3
项;
@for(item(i):@sum(person(j):x(i,j))<=6); !每个项目最多允许6人参加;
@for(assign(i,j):x(i,j)<=1-y(j)); !参加全能比赛的不能参加单项比赛;
@sum(person(j):y(j))=3; !总共只有3人参加全能比赛;
@for(person(j):s(j)=@sum(item(i):a(i,j))); !每个队员所得分;
@for(assign(i,j):@bin(x(i,j)));
@for(person(j):@bin(y(j)));
end
图论中 TSP 问题及 LINGO 求解技巧
巡回旅行商问题(Traveling Salesman Problem, TSP)。几十年来, 出现了很多近似优化算法。 如近邻法、 贪心算法、 最近插入法、 最远插入法、模拟退火算法以及遗传算法。 这里我们介绍利用LINGO软件进行求解的方法。
例子1
设有一个售货员从10个城市中的某一个城市出发, 去其它9个城市推销产品。 10个城市相互距离如下表。 要求每个城市到达一次仅一次后, 回到原出发城市。 问他应如何选择旅行路线, 使总路程最短。
城市 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 7 | 4 | 5 | 8 | 6 | 12 | 13 | 11 | 18 |
2 | 7 | 0 | 3 | 10 | 9 | 14 | 5 | 14 | 17 | 17 |
3 | 4 | 3 | 0 | 5 | 9 | 10 | 21 | 8 | 27 | 12 |
4 | 5 | 10 | 5 | 0 | 14 | 9 | 10 | 9 | 23 | 16 |
5 | 8 | 9 | 9 | 14 | 0 | 7 | 8 | 7 | 20 | 19 |
6 | 6 | 14 | 10 | 9 | 7 | 0 | 13 | 5 | 25 | 13 |
7 | 12 | 5 | 21 | 10 | 8 | 13 | 0 | 23 | 21 | 18 |
8 | 13 | 14 | 8 | 9 | 7 | 5 | 23 | 0 | 18 | 12 |
9 | 11 | 17 | 27 | 23 | 20 | 25 | 21 | 18 | 0 | 16 |
10 | 18 | 17 | 12 | 16 | 19 | 13 | 18 | 12 | 16 | 0 |
引入决策变量X
由于形成一个圈,所以对于各行列分别求和应该等于1。
但是:
因此还要添加条件。这里介绍了一种破圈方法(不要问怎么来的,记住就好):
引入变量u
我们看一下它是如何工作的:
1.假设i和j形成了一圈。那么:
2.假设i、j、k形成了一圈,那么:
由此可推,n个点形成一圈,只要有这个公式限定,它都将产生矛盾。
我们需要它在0-9个点的时候不形成圈,而在10个点的时候形成。因此,将i、j的取值限定在9及以下即可。这样及保证了2-9个点不能形成圈,也不限制10个点可以形成圈。
这里面我把表中的数据写到了文本中进行调用的(处理起来比较方便)
MODEL:
SETS:
CITY/1..10/:U;
LINK(CITY,CITY):DIS,X;
ENDSETS
DATA:
DIS=@FILE(DATA.TXT);
ENDDATA
MIN=@SUM(LINK:DIS*X);
@FOR(CITY(I):@SUM(CITY(J)|I #NE# J:X(I,J))=1);
@FOR(CITY(J):@SUM(CITY(I)|I #NE# J:X(I,J))=1);
@FOR(LINK:@BIN(X));
@FOR(LINK(I,J)|I #GT# 1#AND# I #NE# J:U(I)-U(J)+10*X(I,J)<=9);
END
好像答案也不唯一,但最优解为77。
LINGO实例,优化问题1相关推荐
- 【每日一练 085】性能优化-实例优化(四)
墨墨导读:本文出自墨天轮"每日一练"专栏,此专栏已连更84天,欢迎关注https://www.modb.pro/topic/26446(复制到浏览器中打开或者点击"阅读原 ...
- 每日一练丨性能优化-实例优化(三)
墨墨导读:本文出自墨天轮"每日一练"专栏,此专栏已连更84天,欢迎关注https://www.modb.pro/topic/26446(复制到浏览器中打开或者点击"阅读原 ...
- 数据库优化 - 实例优化
从网上去搜数据库优化基本都是从SQL层次进行优化的,很少有提及到数据库本身的实例优化.就算有也都是基于某个特定数据库的实例优化,本文涵盖目前市面上所有主流数据库的实例优化(Oralce.MySQL.P ...
- Lingo解决优化问题
Lingo解决优化问题 Lingo解决优化问题 前言 一.优化模型介绍 二.运输问题 2.1 问题描述 2.2 问题分析 2.2 优化模型构建 2.3 模型求解 2.4 求解结果 三.待更新 前言 前 ...
- Golang实践录:命令行cobra库实例优化
本文上一文章<Golang实践录:命令行cobra库实例> 的优化,主要的子命令的业务实现的整理. 起因 旧版本中,每个子命令的入口函数,均需一一判断传入参数,并调用对应的业务实现函数,编 ...
- python实例 优化目标函数_Scipy优化算法--scipy.optimize.fmin_tnc()/minimize()
scipy中的optimize子包中提供了常用的最优化算法函数实现,我们可以直接调用这些函数完成我们的优化问题. scipy.optimize包提供了几种常用的优化算法. 该模块包含以下几个方面 使用 ...
- 详解 SGA 与实例优化(部分)
SGA的组成图--------------------------------------------------------------------------------------------- ...
- Golang实践录:命令行cobra库实例再三优化
本文是上一文章<Golang实践录:命令行cobra库实例优化> 的优化,主要的子命令的业务实现的整理. 起因 上一版本实现的方式,还是有点不满意,格式也不对齐,重要的是,似乎不是正规的方 ...
- MATLAB遗传算法求解物流配送中心选址问题优化代码实例
1.简介 物流分配中心选址问题是指一定数量的客户,它们有不同数量的货物需求,有一定数量的备选中心作为配送中心.配送中心向客户提供货物的配送服务,现需要选择合适的配送中心位置(选址数量一定)或合适的配送 ...
最新文章
- PaSS:用于 PacBio 测序的测序模拟器
- ASP.NET页面包含另外一个页面
- WINCE6.0 + S3C2443的启动过程---nboot篇
- C++Bitonic Sort双调排序/比并排序的实现算法(附完整源码)
- 电压压力蕊片_一文让你知道什么是压力变送器
- Docker快速安装RabbitMQ服务
- PowerShell2.0之与COM对象交互(五)与脚本宿主代码协同工作
- android 自定义progressdialog,android自定义ProgressDialog加载效果
- iis7 30M突破
- 分享一个IIS日志分析工具-LogParse
- 怎么将linux的动态IP设置成静态IP
- laravel连接多个不同数据库的单例类
- 是谁断送了网络工程师的前途
- 2022年热传递与热物理国际研讨会(HTT 2022)
- 【CSDN】markdown小技巧
- 如何快速理清大型项目业务逻辑
- Laravel开发的一元交友盲盒源码存取小纸条盲盒交友匹配交友趣味交友同城交友流量
- 蓝桥杯 Java 自行车停放(双向链表解法)
- synchronized和Lock的异同
- 苹果cms是什么东西?