基于Lingo的旅游计划制定方法(含代码)

基于Lingo的旅游计划制定方法(含代码)
基于Lingo的旅游计划制定方法(含代码)

海南大学

《数学模型课程设计》论文

题目:基于Lingo的旅游计划制定方法班级:信息与计算科学

姓名:体贴的瑾色

学号:

指导教师:

日期:2017.06

目录

基于Lingo的旅游计划制定方法 (3)

摘要 (3)

一、问题描述 (3)

二、模型假设 (3)

三、问题分析 (3)

四、符号说明 (4)

五、模型建立 (4)

六、问题解决 (7)

七、回答问题 (9)

八、模型推广 (10)

九、心得体会 (11)

参考文献 (11)

程序附录 (11)

基于Lingo 的旅游计划制定方法

摘要

本文针对海南十八个城市制定旅游规划,在收集了大量的数据情况下,建立评价指标,找到最优的旅游路线。

对于问题一因为不要求求出具体的路程最小值,所以我们使用matlab 处理海南省的地图,找到每个城市在地图的相对坐标,从而得到城市之间的相对距离。以距离为权,以旅程的长度为评价标准建立模型,规划最优路线得到最小相对距离1488。11,注意这里的最小距离并不是实际上的最小距离。 对于问题二将最小费用矩阵代替距离矩阵,以旅程的总车费为评价标准建立模型,规划最优路线,得到最小费用为276元。

对于问题三,在一二问的基础上,综合考虑省时省钱,得到评价标准表达式

1488.11276

min 0.50.51488.11276

D M --=+,建立模型,规划最优路线。

一、问题描述

本题要求在不同的约束条件下规划出海南的最佳旅游路线,路线的基本要求是

必须从海口出发并回到海口,并且经过且经过海南的每个城市(包括县城)一次,并且每个市县玩两天。不同的问题约束条件是: (1)要求总路程最短。 (2)允许选择动车和大巴作为出行工具,规划的路线使得出行总交通费用最少。 (3)综合考虑一二问的条件,得到最优路线,设定出相应的评价准则和指标,修正模型。

二、模型假设

(1) 城市之间路程用城市的直线距离代替。

(2) 近期城市之间的动车价格和大巴价格视为定值。 (3) 城市之间路费取自动车价格和大巴价格的最小值。 (4) 假设不同城市之间的交通工具的速度均相差不大,即旅行时间由旅行

路程唯一决定。

三、问题分析

通过查询知道海南的市县数量总共是有18个(三沙市除外),那么显然这个问题是一个18个城市的TSP 问题。用图论的内容来等价话描述为:设(,,)

G V E W =

是一个有向赋权图,其中将城市看做节点构成顶点集V ,如果i V 和j V 之间存在边

,i j E ,即表示制定的旅游方案中是从城市i 到城市j 。,i j W 表示边,i j E 所赋的非负权重。那么该问题就是指在带权有向图G 中,寻找从指定起始节点的一条经过且仅经过一次所有节点的具有最小权值总和的闭合路径。 不同的问题中所赋的权重代表的内容不同:

(1) 问题一中,因为不要求求出具体的最小值,所以我们使用matlab 处

理海南省的地图,找到每个城市在地图的具体坐标,从而得到城市之间的距离。以距离为权建立模型,规划最优路线。

(2) 问题二中,针对不同城市间的交通条件,选择合适的交通方式,通

过互联网票务查询得到结果。

(3) 问题三中,综合考虑条件,设计出省时又省钱的最优化路线。

四、符号说明

,i j W 城市i 与城市j 之间的距离(路程,费用等)

,10i j i x i j ?=?

?

与j 有边相连

与无边相连 i u 与城市i 相对应的任意实数

n 城市的数量

1,2,...,18i = 1,2,...,18j =

M 旅行车费

D 旅行路程

五、模型建立

首先建立一二问的模型: 目标函数为:

1818

,,11

min *i j i j j i W x ===∑∑

保证从每个城市只离开一次:

18

,11i j

j x

==∑

保证只进入每个城市一次:

18

,1

1i j

i x

==∑

变量约束:

,01i j x =或者

但是满足上述变量并不能保证找到最优解,因为如果生成的路径包含有两个不连通的闭合子路径,也满足上述条件,但并不符合题意。所以还要增加约束使得不出现这种情况。文献[1]中证明了如果满足下述条件:

,*1i j i j u u n x n -+≤-

其中i j ≠,1,2,...,18i =,1,2,...,18j =,那么能保证不出现独立的闭合子路径。 城市之间的距离估算使用如下图一所示海南省行政图作为对象,使用matlab 的ginput 函数,找到每个市县的具体坐标,后如下图二所示对城市进行编号,计算得到城市之间的距离矩阵,结果如下图三所示,注意这里并不需要考虑城市间是否有交通工具来往,因为查询知道相近的城市均有直达车次,只有部分相距较远的城市不可来往,而第一问要求的是路程最短,所以路线选择只可能考虑相近城市来往。

之间并无直达车次,我们规定如果去其他城市转乘次数不超过一次,那么这两个城市间的车费就是转乘后的总车费,若转乘次数超过两次,两个城市就视为不能直接来往。在第二问中,因为要求计算车费最小的路线,所以我们规定不能直接来往的城市车费记为10000元。数据结果显示如下图四。

第三问要求综合考虑省时,省钱,制定最优方案。由假设条件知,本题的目标函数应该为:

min (1)aD a M =+-

其中a 为(0,1)区间的一个实数,但是因为路程和费用的量纲不同,这样得到的结果并不是很好,所以我们对目标函数做一个修正,设一二问求得的最短的路程和最少的车费分别为*D 和*M ,目标函数(评价标准)为:

**

**

min (1)D D M M a a D M --=+-

我们假设游客对省时和省钱同样的看中,即0.5a =,那么目标函数为:

**

**

min 0.50.5D D M M D M

--=+ 本文的约束条件是一二问所有的约束条件。

六、问题解决

采用lingo编程(程序见附录)求解得到第一问的,i j

x矩阵

使用matlab编程(程序见附录)处理数据得到路线和路线图为:

路线:

1—>4—>3—>2—>6—>10—>9—>13—>14—>15—>16—>18—>17—>12—>11—> 7—>8—>5—>1

第二问模型求解后得到的轨迹图为:

路线为:

1—>2—>6—>13—>10—>9—>11—>7—>14—>15—>18—>16—>17—>12—>8—> 5—>4—>3—>1

第三问得到的轨迹图为:

路线为:

1—>2—>6—>13—>10—>9—>14—>15—>16—>18—>17—>12—>11—>7—>3—> 4—>8—>5—>1

灵敏度分析:

a ,则结果变为:

第三文中如果比较在意经济方面,那么令0.8

路线为:

1—>3—>4—>5—>8—>12—>17—>18—>16—>15—>14—>7—>11—>9—>10—>1 3—>6—>2—>1

a ,那么结果变为:

如果经济比较宽裕,那么令0.2

路线为:

1—>2—>6—>13—>10—>9—>14—>15—>16—>18—>17—>12—>11—>7—>8—> 5—>4—>3—>1

七、回答问题

回答问题(1):

要使路程最短,路线应该设计为:

海口=>定安=>澄迈=>临高=>儋州=>白沙=>昌江=>东方=>乐东=>五指山=>保亭=>三亚=>陵水=>万宁=>琼中=>屯昌=>琼海=>文昌=>海口

回答问题(2):

要使费用最少,路线应该规划为:海口=>临高=>儋州=>东方=>白沙=>昌江=>琼中=>屯昌=>乐东=>五指山=>三亚=>保亭=>陵水=>万宁=>琼海=>文昌=>定安=>澄迈=>海口

回答问题(3): 如果同等看重经济和时间则路线为(0.5)a =:海口=>临高=>儋州=>东方=>白沙=>昌江=>乐东=>五指山=>保亭=>三亚=>陵水=>万宁=>琼中=>屯昌=>澄迈=>定安=>琼海=>文昌=>海口

如果较看重经济则路线为(0.8)a =:海口=>澄迈=>定安=>文昌=>琼海=>万宁=>陵水=>三亚=>保亭=>五指山=>乐东=>屯昌=>琼中=>昌江=>白沙=>东方=>儋州=>临高=>海口

如果较看重时间则路线为(0.2)a =:海口=>临高=>儋州=>东方=>白沙=>昌江=>乐东=>五指山=>保亭=>三亚=>陵水=>万宁=>琼中=>屯昌=>琼海=>文昌=>定安=>澄迈=>海口

八、模型推广

本文解决的问题是针对海南旅游,推广到一般情况,某人计划到n 个城市进行旅游,要求分别从省时,省钱和综合考虑两个方面进行规划路线。 设计划决策变量为 :

,10i j i x i j ?=?

?与j 有边相连

与无边相连 目标函数为:

18

18

,,11

min *i j i j j i W x ===∑∑

,i j W 城市i 与城市j 之间的距离(路程,费用等)

约束条件为:

18

,1

1i j

j x

==∑

18

,1

1i j

i x

==∑

,,(1)0,1,2,,,2,3,...,i j i j x x i n j n -===

,*1i j i j u u n x n -+≤-

九、心得体会

通过本次建模实验,我对数学建模了解更加深刻了一些。本题开始我是通过使用遗传算法解决,发现虽然收敛的十分迅速,但是进入到了一个局部最优解,始终找不到全局最优解。然而使用数学建模的方法,找到约束条件,用lingo 计算,很快的就找到了最优解。所以,建模中算法并非最重要的,根本还是要实实在在的建立模型。

参考文献

[1]王继强。 基于LINGO 的旅行商问题的建模方法[J]。 计算机工程与科学,2014,(05):947-950。

[2]姜启源,谢金星。数学模型(第四版)。北京:高等教育出版社,2011,1。 [3]谢金星,薛毅。LINGO 软件的基本使用方法。北京:清华大学出版社,2005,

程序附录(因为第三问综合了前两问,所以本文只附求解第三问的程序)

sets:

dian/1..18/:u;

link(dian,dian):d,m,x; endsets data:

m=@ole('E:\jianmo01。xlsx','data2'); d=@ole('E:\jianmo01。xlsx','data1'); enddata

n=@size(dian);

min=(@sum(link(i,j)|i#ne#j:d(i,j)*x(i,j))--1488。11)/1488。11*0。5+(@sum(link(i,j)|i#ne#j:m(i,j)*x(i,j))-276)/276*0。

5;

m=@ole('E:\jianmo01。xlsx','data2');!费用矩阵;

d=@ole('E:\jianmo01。xlsx','data1');!距离矩

阵;@for(dian(i):@for(dian(j)|j#ne#i#and#j#gt#1:u(i)-u(j)+n

*x(i,j)

@for(link:@bin(x));

data:

@ole('E:\jianmo01。xlsx',data4)=X;

enddata

MATLAB程序:

1。(求城市坐标):

a=imread('hainanditu。jpg');

imshow(a);

axis on

[x,y]=ginput(18);

for i=1:length(x)

text(x(i),y(i),num2str(i));

end

citys=[x,y];

save citys

2。(处理数据)

load chengshi%海南各市县的名字

load shunxu%lingo求得的x(i,j)矩阵load citys%求得的城市坐标

D=Distanse(citys);%算距离

a=find(shunxu(1,:)==1);

order=zeros(1,18);

order(1,[1,2])=[1,a];

for i=1:16

b=find(shunxu(order(1,i+1),:)==1); order(1,i+2)=b;

end

disp('最优解:')

p=OutputPath(order);%输出最优解DrawPath(order,citys)%化轨迹图

%%输出最优解的各市县名字

dazi=zeros(1,37);

dazi(1:2:36)=2*order-1;

dazi(2:2:36)=2*order;

dazi=dazi';

order=order';

for i=1:36

lal(i)=chengshi(dazi(i));

end

hah=[];

for i=1:18

hah=[hah,lal([2*i-1,2*i]),'=>'];

if i==18

hah=[hah,'海口'];

end

end

hah

3。(OutputPath):

%% 输出路径函数

%输入:R 路径

function p=OutputPath(R)

R=[R,R(1)];

N=length(R);

p=num2str(R(1));

for i=2:N

p=[p,'—>',num2str(R(i))];

end

disp(p)

4。画图:

function DrawPath(Chrom,X)

R=[Chrom(1,:) Chrom(1,1)]; %一个随机解(个体)

figure;

hold on

plot(X(:,1),X(:,2),'o','color',[0。5,0。5,0。5])

plot(X(Chrom(1,1),1),X(Chrom(1,1),2),'rv','MarkerSize',20)

for i=1:size(X,1)

text(X(i,1)+7,X(i,2)+10,num2str(i),'color',[1,0,0],'FontSize',14); end

A=X(R,:);

row=size(A,1);

for i=2:row

[arrowx,arrowy] = dsxy2figxy(gca,A(i-1:i,1),A(i-1:i,2));%坐标转换

annotation('textarrow',arrowx,arrowy,'HeadWidth',8,'color',[0,0,1]); end

hold off

xlabel('横坐标')

ylabel('纵坐标')

title('轨迹图')

box on

一种求解装箱问题的混合算法-最新文档

一种求解装箱问题的混合算法 : This paper presents a new hybrid algorithm based on genetic algorithm and tabu search for bin packing problem. It combines the advantage of global search ability of genetic algorithm with the adaptability of tabu search and has better convergence performance than simple genetic algorithm. At last, an practical example is applied to prove the efficiency of this algorithm. 0引言 装箱问题(Bin Packing Problem, BPP)是一类重要的组合优化问题,在现实生活中有着广泛的应用背景,特别在现代物流中,许多问题都抽象化为装箱问题或其变形,如货物如何装载,才能提高运载器具的利用率,从而降低运输成本;物流任务应如何调度,才能提高运行效率,等等。但在理论上,装箱问题是一个NP难题[1],很难精确求解。因此对其求解进行研究具有重要的理论价值和实际意义。 到目前为止,针对该问题人们提出了许多算法,但都有其局限性:枚举法和分支定界等精确算法在箱子数目稍大时,会出现“组合爆炸”;一些近似算法如下次适应NF、首次适应FF、降序首次适应FFD、最佳适应BF等,在解决复杂的装箱问题时结果与物品的体积数据有较大关系,在极端情况下很不理想;遗传

lingo教程 和MATLAB入门教程

LINGO 使用教程 LINGO 是用来求解线性和非线性优化问题的简易工具。LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。 §1 LINGO 快速入门 当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO 中求解如下的LP 问题: ,6002100 350. .32min 21211 212 1≥≤+≥≥++x x x x x x x t s x x 在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例1.2 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。产销单位运价如

model: !6发点8收点运输问题; sets: warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand; links(warehouses,vendors): cost, volume; endsets !目标函数; min=@sum(links: cost*volume); !需求约束; @for(vendors(J): @sum(warehouses(I): volume(I,J))=demand(J)); !产量约束; @for(warehouses(I): @sum(vendors(J): volume(I,J))<=capacity(I)); !这里是数据; data: capacity=60 55 51 43 41 52; demand=35 37 22 32 41 32 43 38; cost=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 end 然后点击工具条上的按钮即可。 为了能够使用LINGO的强大功能,接着第二节的学习吧。 §2 LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。

lingo用法总结

ji例程1、 model: sets: quarters/1..4/:dem,rp,op,inv; endsets min=@sum(quarters:400*rp+450*op+20*inv); @for(quarters(i):rp<=40); @for(quarters(i)|i#gt#1: inv(i)=inv(i-1)+rp(i)+op(i)-dem(i);); inv(1)=10+rp(1)+op(1)-dem(1); data: dem=40 60 75 25; enddata end 例程2、 model: sets: quarters/1..4/:dem,rp,op,inv; endsets min=@sum(quarters:400*rp+450*op+20*inv); @for(quarters(i):rp<=40); @for(quarters(i)|i#gt#1: inv(i)=inv(i-1)+rp(i)+op(i)-dem(i);); inv(1)=a+rp(1)+op(1)-dem(1); data: dem=40 60 75 25; a=? enddata end ?LINGO总是根据“MAX=”或“MIN=”寻找目标函数,而除注释语句和TITLE语句外的其他语句都是约束条件,因此语句的顺序并不重要。 ?LINGO中函数一律需要以“@”开头 ?Lingo中的每个语句都以分号结尾 ?用LINGO解优化模型时已假定所有变量非负(除非用限定变量取值范围的函数@free或@sub或@slb另行说明)。 ?以感叹号开始的是说明语句(说明语句也需要以分号结束)) ?理解LINGO建模语言最重要的是理解集合(Set)及其属性(Attribute)的概念。 ?一般来说,LINGO中建立的优化模型可以由5个部分组成,或称为5“段” (SECTION): (1)集合段(SETS):以“ SETS:” 开始,“ENDSETS”结束,定义

装箱问题C语言实现(算法分析)

算法分析 题目:装箱(Bin Packing)问题 院别:数学与计算科学学院 专业:信息与计算科学 姓名:蒋文明 学号:0800710313 指导老师:宁黎华 日期: 2011. 06. 9

目录 一、问题描述 (1) 二、问题分析 (1) 三、代码实现 (2) 四、测试结果 (3) 五、心得体会 (4) 六、源程序 (4)

一、问题描述 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5,6*6.这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。 二、问题分析 对于6*6的一个箱子来说,最多只能放一个6*6或一个5*5或4*4的盒子,所以我们初始化需要的箱子数时就是这这几种箱子的个数和,对于3*3的箱子来说,我们可以放一个或2个或3个或4个,这我们可以通过整除和取模来确定放了3*3盒子的箱子数,再把它加入到总箱子数中,接下来我们就是把1*1和 2*2的盒子塞进前面所需的箱子中,当塞不完时再来新增盒子,我们首先要将前面的箱子剩余的空间统计出来,并且要以2*2的优先考虑,因为我们可以把多余的2*2的位置变为填充4个1*1的,毕竟1*1的只要有空间随处都可以塞。所以当我们的箱子要是装了1个5*5的盒子的话,那么它就只能塞1*1的了,一个可以塞11个1*1的,对于装了4*4的盒子的话,那么还可以装5个2*2的盒子,暂且不要去转话成1*1的,除非没办法只能装1*1的,对于3*3 的话就可以根据取模之后一个箱子剩下的空间了,如果一个箱子中只放了一个3*3的,那么还剩下3个3*3的空间可以放,我们知道可以放5个2*2的和7个 1*1的,对于放了2个3*3的箱子,我们剩下的空间可以放3个2*2的以及6个1*1的,对于放了

LINGO11教程

LINGO 是用来求解线性和非线性优化问题的简易工具。LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。 §1 LINGO 快速入门 当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO 中求解如下的LP 问题: ,6002100 350. .32min 21211 212 1≥≤+≥≥++x x x x x x x t s x x 在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例1.2 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。产销单位运价如

model: !6发点8收点运输问题; sets: warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand; links(warehouses,vendors): cost, volume; endsets !目标函数; min=@sum(links: cost*volume); !需求约束; @for(vendors(J): @sum(warehouses(I): volume(I,J))=demand(J)); !产量约束; @for(warehouses(I): @sum(vendors(J): volume(I,J))<=capacity(I)); !这里是数据; data: capacity=60 55 51 43 41 52; demand=35 37 22 32 41 32 43 38; cost=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 end 然后点击工具条上的按钮即可。 为了能够使用LINGO的强大功能,接着第二节的学习吧。 §2 LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。 2.1 为什么使用集 集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个

Lingo软件在求解数学优化问题的使用技巧

Lingo软件在求解数学优化问题的使用技巧 LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用。LINGO 主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等。 LINGO的最新版本为LINGO7.0,但解密版通常为4.0和5.0版本,本书就以LINGO5.0为参照而编写。 1.LINGO编写格式 LINGO模型以MODEL开始,以END结束。中间为语句,分为四大部分(SECTION):(1)集合部分(SETS):这部分以“SETS:”开始,以“ENDSETS”结束。这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,就象C语言在在程序的第一部分定义变量和数组一样。在LINGO中称为集合(SET)及其元素(MEMBER或ELEMENT,类似于数组的下标)和属性(A TTRIBUTE,类似于数组)。 LINGO中的集合有两类:一类是原始集合(PRIMITIVE SETS),其定义的格式为:SETNAME/member list(or 1..n)/:attribute,attribute,etc。 另一类是是导出集合(DERIVED SETS),即引用其它集合定义的集合,其定义的格式为: SETNAME(set1,set2,etc。):attribute,attribute,etc。 如果要在程序中使用数组,就必须在该部分进行定义,否则可不需要该部分。(2)目标与约束:这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数,可在后面的具体应用中体会其功能与用法。求解优化问题时,该部分是必须的。(3)数据部分(DA TA):这部分以“DA TA:”开始,以“END DA TA”结束。其作用在于对集合的属性(数组)输入必要的数值。格式为:attribut=value_list。该部分主要是方便数据的输入。 (4)初始化部分(INIT):这部分以“INIT:”开始,以“END INIT”结束。作用在于对集合的属性(数组)定义初值。格式为:attribute=value_list。由于非线性规划求解时,通常得到的是局部最优解,而局部最优解受输入的初值影响。通常可改变初值来得到不同的解,从而发现更好的解。 编写LINGO程序要注意的几点: 1.所有的语句除SETS、ENDSETS、DA TA、ENDDA TA、INIT、ENDINIT和MODEL,END 之外必须以一个分号“;”结尾。 2.LINGO求解非线性规划时已约定各变量非负。 LINGO内部函数使用详解。 LINGO建立优化模型时可以引用大量的内部函数,这些函数以“@”符号打头。 (1)常用数学函数 @ABS(X) 返回变量X的绝对数值。 @COS( X) 返回X的余弦值,X的单位为弧度 @EXP( X)

matlab、lingo程序代码23-线性规划问题及灵敏度分析

线性规划问题及灵敏度分析在LINGO软件中的实现 (龙少波李东阳罗添元) 一、问题的提出: 某公司饲养实验用的动物以出售给动物研究所,已知这些动物的生长对饲 料中3种营养成分(蛋白质、矿物质和维生素)特别敏感,每个动物每周至少需 要蛋白质60g,矿物质3g,维生素8mg,该公司能买到5种不同的饲料,每种饲 料1kg所含各种营养成分和成本如下表所示,如果每个小动物每周食用饲料不超 过52kg,才能满足动物生长需要。 A1 A2 A3 A4 A5 营养最 低 要求蛋白质(g) 0.3 2 1 0.6 1.8 60 矿物质(g) 0.1 0.05 0.02 0.2 0.05 3 维生素(mg) 0.05 0.1 0.02 0.2 0.08 8 成本(元/ kg)0.2 0.7 0.4 0.3 0.5 问题: 1.求使得总成本最低的饲料配方? 2.如果另一个动物研究对蛋白质的营养要求变为59单位, 但是要求动物的价格比现在的价格便宜0.3元,问该养殖所 值不值得接受? 3.由于市场因素的影响,X2的价格降为0.6元每千克, 问是否要改变饲料配方? 二、建立线性规划数学模型 解答: (1)设需要饲料A1, A2, A3, A4分别为X1, X2, X3, X4kg,则建立线 性规划数学模型如下: 目标函数:MinS=0.2X1+0.7X2+0.4X3+0.3X4+0.5X5 约束条件:0.3X1+2X2+X3+0.6X4+1.8X5>=60 0.1X1+0.05X2+0.02X3+0.2X4+0.05X5>=3 005X1+0.1X2+0.02X3+0.2X4+0.08X5>=8

常用错误提示

LINGO出错时错误代码含义: 在LINGO程序求解时,系统首先会对程序进行编译.系统在编译或执行其他命令 时,会因程序中的错误或运行错误,弹出一个出错报告窗口,显示其错误代码,并简要指出错误的原因.这些错误报告信息能够提示用户发现程序中的错误,以便能尽快修改.下 面我们给出出错信息的一个简要说明,仅供参考. LINGO错误编号及原因对照表 错误代码含义 0 LINGO模型生成器的内存已经用尽(可用“LINGO|Options"命令对General Solver 选项卡中的“Generator Memory Limit"选项进行内存大小的修改) 1 模型中的行数太多(对于有实际意义的模型,这个错误很少出现) 2 模型中的字符数太多(对于有实际意义的模型,这个错误很少出现) 3 模型中某行的字符数太多(每行不应该超过200个字符,否则应换行) 4 指定的行号超出了模型中实际具有的最大行号(这个错误通常在LOOK命令中指定 了非法的行号时出现) 5 当前内存中没有模型 6 脚本文件中TAKE命令的嵌套重数太多(LINGO中限定TAKE命令最多嵌套10次) 7 无法打开指定的文件(通常是指定的文件名拼写错误) 8 脚本文件中的错误太多,因此直接返回到命令模式(不再继续处理这个脚本文件) 9 (该错误编号目前没有使用) 10 (该错误编号目前没有使用) 11 模型中的语句出现了语法错误(不符合LINGO语法) 12 模型中的括号不匹配 13 在电子表格文件中找不到指定的单元范围名称 14 运算所需的,临时堆栈空间不够(这通常意味着模型中的表达式太长了) 15 找不到关系运算符(通常是丢了“<”,“=”或“>”) 16 输入输出时不同对象的大小不一样(使用集合循环方式输入输出时,集合大小应 相同) 17 集合元素的索引的内存堆栈空间不够 18 集合的内存堆栈空间不够 19 索引函数@INDEX使用不当 20 集合名使用不当 21 属性名使用不当 22 不等式或等式关系太多(例如,约束2

一种装箱问题的高效定位启发式算法

An ef?cient placement heuristic for three-dimensional rectangular packing Kun He,Wenqi Huang? School of Computer Science and Technology,Huazhong University of Science and Technology,Wuhan430074,China a r t i c l e i n f o Available online28April2010 Keywords: Cutting and packing Three-dimension Rectangular packing Container loading Heuristic a b s t r a c t By embodying the spirit of‘‘gold corner,silver side and strawy void’’directly on the candidate packing place such that the searching space is reduced considerably,and by utilizing the characteristic of weakly heterogeneous problems that many items are in the same size,a?t degree algorithm(FDA)is proposed for solving a classical3D rectangular packing problem,container loading problem. Experiments show that FDA works well on the complete set of1500instances proposed by Bischoff, Ratcliff and Davies.Especially for the800dif?cult strongly heterogeneous instances among them,FDA outperforms other algorithms with an average volume utilization of91.91%,which to our knowledge is 0.45%higher than current best result just reported in2010. &2010Elsevier Ltd.All rights reserved. 1.Introduction Cutting and packing problems are representative combinational optimization problems with many important applications in the industry.This paper addresses the problem of loading a subset of three-dimensional(3D)rectangular items into a3D rectangular container,such that the total volume of the packed items is maxi- mized,i.e.the container’s wasted volume is minimized.A layout is called feasible,if each packed item is located orthogonally and completely in the container and there is no overlapping between any two items.This problem is an NP-hard problem,whose1D degradation,the0–1knapsack problem,is still NP-hard. This3D rectangular packing problem is also called the container loading problem,because the most common and important application of this problem is to load rectangular cargoes into containers,vehicles or ships in the transportation industry.There are some additional considerations that would be taken into account in the real world[1,2],among which the orientation constraint and the stability constraint are the most important ones.In our opinion,if there is an ef?cient approach to solve the basic problem that has no additional constraints,then it is not dif?cult to make the approach adapted to problems considering some additional ones. Since the orientation constraint has been widely considered by the researchers,and it has been accepted by the famous BR benchmarks[1],we take the orientation constraint into account that one or two sides of the items may not be used as the height. This situation usually happens when cargoes are boxes full of oil or wine.We do not concern the stability constraint for the following reasons:(1)Stability constraint is not considered as widely as the orientation one and the stability criteria is inconsistent in the literature.In some cases it requires that each item is fully supported,or partially supported with at least a given percentage;in other cases it requires that the gravity center of each item falls over an underlying item or over the bottom of the container.(2)Stability could become a consequence of the high cargo compactness when the container’s volume utilization is high enough.(3)Foam rubber or other stuf?ng could be used to ?ll the small empty spaces left,as what has been done in some freight companies. Many ef?cient algorithms have been proposed for solving this classical3D packing problem.The most prevalent approach is wall building or layering[1,3–9],?rst proposed by George and Robinson in1980[3].In the past thousand years,people usually start packing goods from the bottom and build up the packing in layers,inserting each goods such that it is contiguous with what is already packed.Inspired by these human’s experience,the wall building or layering method usually opens a new layer or wall with a width equals to some item dimension,then each layer is?lled up by a number of horizontal strips,and each strip is packed in a greedy way.Another ef?cient approach widely adopted by the researchers is block arrangement[10–12],?rst proposed by Bortfeldt and Gehring in1998[10],which binds items of the same or similar size into a larger rectangular block to do the tentative packing.By utilizing the block arrangement method,Parren?o proposed an approach that always places a column or layer built by same size items into a maximal space,the largest empty parallelepiped spaces[13,14].Above approaches all utilized the characteristic of the weakly heterogeneous instances that many items are in the same size.Therefore,the solution qualities are in a downtrend when the problems become more Contents lists available at ScienceDirect journal homepage:https://www.360docs.net/doc/6f6091459.html,/locate/caor Computers&Operations Research 0305-0548/$-see front matter&2010Elsevier Ltd.All rights reserved. doi:10.1016/j.cor.2010.04.015 ?Corresponding author.Tel.:+862787543018;fax:+862787545004. E-mail addresses:brooklet60@https://www.360docs.net/doc/6f6091459.html,(K.He),wqhuangwh@https://www.360docs.net/doc/6f6091459.html, (W.Huang). Computers&Operations Research38(2011)227–233

在LINGO中的逻辑符号

在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。在创建稀疏集时用在成员资格过滤器中。 LINGO具有9种逻辑运算符: #not# 否定该操作数的逻辑值,#not#是一个一元运算符 #eq# 若两个运算数相等,则为true;否则为flase #ne# 若两个运算符不相等,则为true;否则为flase #gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase #ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase #lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase #le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase #and# 仅当两个参数都为true时,结果为true;否则为flase #or# 仅当两个参数都为false时,结果为false;否则为true 这些运算符的优先级由高到低为: 高#not# #eq# #ne# #gt# #ge# #lt# #le# 低#and# #or# 例4.2 逻辑运算符示例 2 #gt# 3 #and# 4 #gt# 2,其结果为假(0)。 4.1.3 关系运算符 在LINGO中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符#eq#、#le#、#ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:满足为真,不满足为假。 LINGO有三种关系运算符:“=”、“<=”和“>=”。LINGO中还能用“<”表示小于等 11 于关系,“>”表示大于等于关系。LINGO并不支持严格小于和严格大于关系运算符。然而,如果需要严格小于和严格大于关系,比如让A严格小于B: A=

Lingo基本用法总结

Lingo基本用法总结(除集函数部分)LINGO是用来求解线性和非线性优化问题的简易工具。Lingo免费版可以支持30个未知数,lingo破解版可以支持几万个未知数、几万个约束条件。 当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model–LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1如何在LINGO中求解如下的LP问题: 在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮即可。 得到如下结果: 所以当x1为250,x2为100时目标函数得到最大值。 算术运算符 Lingo中变量不区分大小写,以字母开头不超过32个字符 算术运算符是针对数值进行操作的。LINGO提供了5种二元运算符: ^乘方﹡乘/除﹢加﹣减 LINGO唯一的一元算术运算符是取反函数“﹣”。 这些运算符的优先级由高到底为: 高﹣(取反) ^ ﹡/ 低﹢﹣ 运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“()” 来改变。 例:在x1+x2>=350,x1>=100,2*x1+x2<=600的条件下求2*x1+3*x2的最小值 在代码窗口中编写 min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后单击上面菜单lingo菜单下solve键即可。

lingo使用手册翻译

§2 LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。 2.1 为什么使用集 集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。 2.2 什么是集 集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。 LINGO有两种类型的集:原始集(primitive set)和派生集(derived set)。一个原始集是由一些最基本的对象组成的。一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。 2.3 模型的集部分 集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。 2.3.1 定义原始集 为了定义一个原始集,必须详细声明: 1、集的名字 2、可选集的成员

Lingo的基本用法

LINGO的基本用法 一.集合的基本用法 集合(set)及其属性(attribute)的概念 基本集合与派生集合 集合名[/元素列表/][:属性列表]; 集合名(父集合列表)[/元素列表/][:属性列表]; 稠密集合与稀疏集合 元素过滤法 基本集合的隐式列举法: 数字型 1..n 字符数字型Car101..Car208 日期型MON..FRI 月份型OCT..JAN 年月型OCT2007..JAN2008 二.模型结构 (1)集合段从“sets:”到“endsets” (2)数据输入段从“data:”到“enddata” 属性=常数列表 (3)目标和约束段 MIN=表达式 (4)计算段从“calc:”到“endcalc”,对原始数据的计算处理 (5)初始段从“init:”到“endinit”,定义迭代初值用 属性=常数列表 (6)注释从感叹号到分号 三.函数 基本数学函数 @ABS(X) @COS(X) @EXP(X) @FLOOR(X) @LGM(X) @LOG(X) @MOD(X,Y) @POW(X,Y) @SIGN(X) @SIN(X) @SMAX(list) @SMIN(list) @SQR(X) @SQRT(X) @TAN(X) 其中@LGM(X) =ln(X-1)! 集合循环函数 @FOR @MIX @MIN @PROD @SUM 用法:集合函数名(集合名(集合索引列表)|条件:表达式组) 集合操作函数 @IN @IN(集合名,集合元素名,…集合元素名) @INDEX @INDEX(集合名,集合元素名)

@WRAP @WRAP(i,N),循环计数 @SIZE @SIZE(集合名) 变量定界函数 @BND(L,X,U) @BIN(X) @FREE(X) @GIN(X) 分别对变量取值限制:上下界,0-1值,取消非负限制,整数 概率分布函数 @PNS(X) 标准正态分布@PSL(X) 正态线性损失 @PBN(P,N,X) 二项分布@PHG 超几何分布 @PTD(N,X) t分布@PFD(N,D,X) F分布 @PPS(A,X) 泊松分布@PPL(A,X) 泊松线性损失 @PCX(N,X) X平方分布@RAND(seed) 随机数 服务系统函数 @PEL(A,X) @PFS(A,X,C) @PEB(A,X) 文件输入输出函数 @FILE(fn) @TEXT(…fn?) @OLE 结果报告函数 @ITERS() 返回迭代次数 @NEWLINE(n) 输出n个新行 @STRLEN(string) 返回字符串的长度 @NAME(reference) 返回变量名或行名 @WRITE 用于数据段,输出变量,字符串或换行 @WRITEFOR 是@WRITE在循环情况下的推广 @FORMAT 以格式描述符方式输出数值 @DUAL(varname) 返回解答中变量的判别数或结束行的影子价格@STATUS() 返回求解后的最后状态 其他函数 @IF @IF(条件,true结果,false结果) @WARN @WARN(‘text’,条件) @USER @USER(用户编写的函数dll或obj文件) 四.文件传输 通过文本文件传输数据 @FILE和@TEXT 通过Excel文件传输数据 @OLE

lingo软件使用教程

lingo软件使用教程 一般来说,一个优化模型将由以下三部分组成: 1. 目标函数(Objective Function):要达到的目标。 2. 决策变量(Decision variables):每组决策变量的值代表一种方案。在优化模型中需要确定决策变量的最优值,优化的目标就是找到决策变量的最优值使得目标函数取得最优。 3. 约束条件(Constraints):对于决策变量的一些约束,它限定决策变量可以取的值。 在写数学模型时,一般第一行是目标函数,接下来是约束条件,再接着是一些非负限制等。在模型窗口输入如下代码: Max = 2*x1+3*x2; X1+2*x2<=8; 4*x1<16; 4*x2<12; 注意:1.每一个lingo表达式最后要跟一个分号; 2.多数电脑中没有符号,lingo中<=代替;为了方便可以用<代替小于等于,用>代替大于等于。 3.我们可以添加一些注释,增加程序的可读性。注释以一个!(叹号必须在英文状态下输入,它会自动变为绿色)开始,以;(分号)结束。 4.Lingo中不区分变量名的大小写。变量名必须以字母(A-Z)开头,后面的字符可以是字母、数字、下划线。变量名不能超过32个字符。 Lingo程序的一些规则: 1. 在Lingo中最开始都是“MAX=”或者“MIN=”开始表示求目标函数的最大或者最小值。 2. 变量和它前面的系数之间要用“*”连接,中间可以有空格。 3. 变量名不区分大小写,但必须以字母开始,不超过32个字符。 4. 数学表达式结束时要用分号“;”表示结束。表达式可以写在多行上,但是表达式中间不能用分号。 5. 在电脑系统中一般没有“小于等于”符号,在Lingo采用“<=”来表示“小于等于”,用“>=”表示“大于等于”。小于等于也可以用更简单的“<”表示,大于等于用“>”表示。 集合段: 在我们已经得到的程序里有一些量没有定义,如WAREHOUSES( I),DEMAND( J), LINKS( I, J)。这些量将在Lingo中的集合段定义。 集合段以SETS:表示开始,以ENDSETS表示结束。 如果一个集合的元素都已经定义过,就可以用一些循环函数(如@for). 注:1. 集合的属性相当于以集合的元素为下标的数组。Lingo中没有数组的概念,只有定义在集合上的属性的概念。 2 集合的定义语法: set_name[/set_member/:][attribute_list]; 集合的名称在左边,右边是这个集合上的属性,他们之间用冒号“:”分割开,最后由分号表示结束。如果在同一个集合上有多个属性时,不同的属性之间用逗号“,”隔开,如本例的cost和volume属性。如果要特别列出集合的元素时,在集合的名称后把元素写在两条斜线之间,如本例中的仓库可以写为 WAREHOUSES/WH1, WH2, WH3, WH4, WH5, WH6/: CAPACITY;

装箱问题matlab

综合实验报告 一、实验名称 装箱问题 二、实验目的 掌握装箱问题的近似解法:NF 算法、FF 算法;FFD 算法;熟悉这些算法的程序编写. 三、实验要求 (1)利用NF 算法,FF 算法,FFD 算法,CF 算法求解装箱问题,熟悉这些算法的程序编写; (2)选择一种计算机语言设计或利用Matlab 软件作为辅助工具来实现该实验。 四、实验原理 NF 算法: 按照物体给定的顺序装箱:把物品i w 放到它第一个能放进去的箱子j B 中。是具有最大下标的使用过的箱子,若i w 的长度不大于j B 的剩余长度,则把i w 放入j B ,否则把i w 放入一个新的箱子1+j B ,且j B 在以后的装箱中不再使用。最后循环 FF 算法: 按照物体给定的顺序装箱:把物品i w 放到第一个箱子中。j B B B ,...,,21是当前已经使用过的箱子,在这些箱子中找一个长度不小于i w 且下标最小的箱子,将放入i w ,如果不存在这样的箱子,则另开一个新箱子1+j B ,将i w 放入1+j B 中。 FFD 算法: 先将物体按长度从大到小排序,然后按FF 算法对物体装箱.不失一般性,对n 件物品的体积按从大到小排好序,即有v1≥v2≥…≥vn ,然后按排序结果对物品重新编号即可。CF 算法: step1:把物件{}n a a a L ,...,,21=按其大小进行非增序排列,不妨设()()()n a s a s a s ≥≥≥...21。

step2:首先把1a 放入箱子中1B ,然后从最右端开始,依次把物件,...,1-n n a a 放入1B ,直到下一个物件不能再放入箱子为止,开启新的箱子2B 。 step3:设在第i 步循环时,打开第i 个箱子,此时把物件i a 放入i B 中.假设第i-1个箱子中最后一个放入的物件为k a ,则在i 步循环时最右端的物件为1-k a ,那么当 ()()()C a s a s a s k i ≤+++-11...且()()()()C a s a s a s a s l l k i >++++--11...时,把 121,...,,a a a k k --放入i B 中,开启新的箱子1+i B 。 step4:直到把所有物件都放入箱子中,循环终止,并输出箱子数目m .五、实验题目 (1)物品数量为20,箱子容量为50,物品重量分别为:30,29,27,25,23,24,21,20,18,16,15,14,12,10,9,8,7,6,5,3设计CF 计算机程序解决该问题。 六、实验步骤及程序 (1)新建M 文件 function cf(W,C) fprintf('输入物品重量'); W=input('W='); fprintf('输入箱子容量'); C=input('C='); %按物品重量降序排序 [B,IX]=sort(W,2,'descend'); NW=B(IX); A=sort(NW); X=0; for j=1:length(NW) TW=0; if isempty(NW) break; else TW=TW+NW(1); X=X+1; CW=[]; for i=1:length(A) if C-TW>=A(i) TW=TW+A(i);

相关文档
最新文档