优化小练习.docx
- 文档编号:10405774
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:19
- 大小:82.40KB
优化小练习.docx
《优化小练习.docx》由会员分享,可在线阅读,更多相关《优化小练习.docx(19页珍藏版)》请在冰豆网上搜索。
优化小练习
1优化模型及其求解
1.1案例:
背包问题
有一组物品S,共有9件,其中第i件重
,价值
,从S中取出一些物品出来装背包,使总价值最大,而不超过总重量的给定上限30kg。
i
1
2
3
4
5
6
7
8
9
(kg)
2
1
1
2.5
10
6
5
4
3
(元)
10
45
30
100
150
90
200
180
300
1.1.1问题分析
这是一个典型的最优化问题,优化目标是总价值最大,决策是决定装哪些物品,而装载物品又受到背包所能承受重量30kg的限制。
因此可以建立该问题的最优化数学模型,而且是0-1整数规划模型。
1.1.2变量与符号说明
:
用来表示是否装载第i件物品,如果
表示不装载该物品,如果
表示装载该物品(
),令
。
:
第i件物品重量(
),单位:
kg。
:
第i件物品价值(
),单位:
元。
:
表示按照决策
,得到的装载物品的总价值,单位:
元。
1.1.3模型建立
通过前面的分析及变量的定义,可得
。
原问题抽象为如下的0-1整数线性规划模型:
1.1.4模型求解及结果
可以采用求解线性规划的Lindo软件求解,下面采用求解可以求解非线性规划的Lingo软件求解。
Lingo功能非常强大,其语法本身较复杂,这里只用到最简单的语法。
直接参看代码。
Lindo基本语法
(1)模型用“MODEL:
”开始,“END”结束,参考下面的Lingo程序;
(2)语句用分号中断。
注释行用感叹号开头,通样是分号结束。
(3)如果变量只取0或1,则用@BIN设置,比如@BIN(x2),表示变量x2只能取0或1。
(4)如果变量只取整数,则用@GIN设置,比如@GIN(x2),表示变量x2为整数变量。
Lingo程序如下:
!
求解背包问题的线性整数规划模型(0-1整数规划);
MODEL:
!
目标函数;
max=10*x1+45*x2+30*x3+100*x4+150*x5+90*x6+200*x7+180*x8+300*x9;
!
重量约束;
2*x1+x2+x3+2.5*x4+10*x5+6*x6+5*x7+4*x8+3*x9<=30;
!
整数约束的设置;
@BIN(x1);@BIN(x2);@BIN(x3);@BIN(x4);@BIN(x5);
@BIN(x6);@BIN(x7);@BIN(x8);@BIN(x9);
END
求解显示结果:
Globaloptimalsolutionfoundatiteration:
0
Objectivevalue:
1015.000
VariableValueReducedCost
X11.000000-10.00000
X21.000000-45.00000
X31.000000-30.00000
X41.000000-100.0000
X51.000000-150.0000
X60.000000-90.00000
X71.000000-200.0000
X81.000000-180.0000
X91.000000-300.0000
RowSlackorSurplusDualPrice
11015.0001.000000
21.5000000.000000
结果显示已经找到了最优解。
通过结果可见:
除了不装载第6件物品外,其余全部装载,这种装包方法达到总价值最大为1015元。
下面介绍其它求解方法。
1.1.5贪婪法
建立优选指标
,即第i件物品单位重量的价值(元/kg)。
选择装背包的物品时,就从优选指标
中最大的开始选,直到不能再装为止。
由已知数据,可得
i
1
2
3
4
5
6
7
8
9
5
45
30
40
15
15
40
45
100
1.1.6贪婪法求解程序
%背包问题求解得贪婪算法实现
w=[2112.5106543];
v=[10453010015090200180300];
g=v./w;%单位质量的价值(指标)
maxw=30;
%对指标排序,以便根据指标选择物品
[y,idx]=sort(g);
curw=0;%存储当前装的总重
curv=0;%存储当前装的价值
hasidx=[];%存储当前装的物品序号
fori=length(g):
-1:
1,%从指标g最大的开始选择
id=idx(i);%important
ifcurw+w(id)<=maxw,
curw=curw+w(id);
curv=curv+v(id);
hasidx=[hasidx,id];
else
break;%结束,不能再装
end
end
disp(sprintf('总共装载物品数=%5d件',length(hasidx)))
disp(sprintf('质量=%10.2fkg',curw))
disp(sprintf('价值=%10.2f元',sum(v(hasidx))))
%实际上curw=sum(w(hasidx))
%curv=sum(v(hasidx))
1.1.7贪婪法求解结果
运行程序输出为:
总共装载物品数=7件
质量=22.50kg
价值=945.00元
按照贪婪法策略,得到装载物品的顺序依次为:
9,8,2,7,4,3,6。
思考:
以上装载结果是否达到最优?
1.1.8穷举法求解程序
%背包问题求解得穷举法得到最优解的程序
w=[2112.5106543];%各件物品重量
v=[10453010015090200180300];%价值
maxw=30;%背包承受重量上限
optvalue=-1;%最优目标(最大价值)初始化
forx1=0:
1,
forx2=0:
1,
forx3=0:
1,
forx4=0:
1,
forx5=0:
1,
forx6=0:
1,
forx7=0:
1,
forx8=0:
1,
forx9=0:
1,
x=[x1x2x3x4x5x6x7x8x9];%决策向量
%不超过重量限制,也要比以前装包方案好
if(dot(x,w)<=maxw)&(dot(x,v)>optvalue),
optx=x;%存储
optvalue=dot(x,v);%存储
end
end
end
end
end
end
end
end
end
end
hasidx=find(optx~=0);
optx
disp(sprintf('总共装载物品数=%5d件',length(hasidx)))
disp(sprintf('质量=%10.2fkg',dot(optx,w)))
disp(sprintf('价值=%10.2f元',dot(optx,v)))
%实际上:
dot(optx,v)=sum(v(hasidx))
%dot(optx,w)=sum(w(hasidx))
1.1.9穷举法程序运行结果
总共装载物品数=8件
质量=28.50kg
价值=1015.00元
hasidx=
12345789
只有编号为6的物品没有装上。
1.2案例:
高速公路问题
A城和B城之间准备建一条高速公路,B城位于A城正南20公里和正东30公里交汇处,它们之间有东西走向连绵起伏的山脉。
公路造价与地形特点有关,图4.2.4给出了整个地区的大致地貌情况,显示可分为三条沿东西方向的地形带。
你的任务是建立一个数学模型,在给定三种地形上每公里的建造费用的情况下,确定最便宜的路线。
图中直线AB显然是路径最短的,但不一定最便宜。
而路径ARSB过山地的路段最短,但是否是最好的路径呢?
你怎样使你的模型适合于下面两个限制条件的情况呢?
1.当道路转弯是,角度至少为1400。
2.道路必须通过一个已知地点(如P)。
A
B
1.2.1问题分析
在建设高速公路时,总是希望建造费用最小。
如果要建造的起点、终点在同一地貌中,那么最佳路线则是两点间连接的线段,这样费用则最省。
因此本问题是一个典型的最优化问题,以建造费用最小为目标,需要作出的决策则是确定在各个地貌交界处的汇合点。
1.2.2变量说明
:
在第i个汇合点上的横坐标(以左下角为直角坐标原点),I=1,2,。
。
。
,4;
x5=30(指目的地B点的横坐标),设
;
:
第i段南北方向的长度(i=1,2,。
。
。
,5);
Si:
在第i段上地所建公路的长度(i=1,2,。
。
。
,5);
由问题分析可知,
C1:
平原每公里的造价(单位:
万元/公里)
C2:
高地每公里的造价(单位:
万元/公里)
C3:
高山每公里的造价(单位:
万元/公里)
1.2.3模型假设
1、假设在相同地貌中修改高速公路,建造费用与公路长度成正比;
2、假设在相同地貌中修改高速为直线。
在理论上,可以使得建造费用最少,当然实际中一般达不到。
1.2.4模型建立
在A城与B城之间建造一条高速公路的问题可以转化为下面的非线性规划模型。
优化目标是在A城与B城之间建造高速公路的费用。
1.2.5模型求解
这里采用Matlab编程求解。
模型求解时,分别去Ci如下。
平原每公里的造价C1:
=400(单位:
万元)
高地每公里的造价C2:
=800(单位:
万元)
高山每公里的造价C3:
=1200(单位:
万元)
(注意:
实际建模时必须查找资料来确定参数或者题目给定有数据)
输入主程序model_p97.m,运行结果如下:
model_p97
optans=
2.2584e+004
len=
38.9350
ans=
12.173114.332315.667717.8269
求解程序见附录。
1.2.6模型结果及分析
通过求解可知,为了使得建造费用最小。
建造地点的选择宜采取下列结果。
建造总费用为2.2584亿元。
总长度为38.9350公里。
1.2.7求解模型的主程序文件
程序名:
model_p97
functionx=model_p97
%数学建模教材P97高速公路
clearall
globalCL
C=[4008001200];
L=[44444];
x=fmincon('objfun_97',[1,1,1,1],[],[],[],[],zeros(1,4),ones(1,4)*30,'mycon_p97');
optans=objfun_97(x)
C=ones(3,1);
len=objfun_97(x)
2、模型中描述目标函数的Matlab程序objfun_97.m
functionobj=objfun_97(x)
globalCL
obj=C
(1)*sqrt(L
(1)^2+x
(1)^2)+C
(2)*sqrt(L
(2)^2+(x
(2)-x
(1))^2)+...
C(3)*sqrt(L(3)^2+(x(3)-x
(2))^2)+C
(2)*sqrt(L(4)^2+(x(4)-x(3))^2)+...
C
(1)*sqrt(L(5)^2+(30-x(4))^2);
3、模型中描述约束条件的Matlab函数mycon_p97.m
function[c,ceq]=mycon_p97(x)
%
c
(1)=x
(1)-x
(2);
c
(2)=x
(2)-x(3);
c(3)=x(3)-x(4);
c(4)=x(4)-30;
ceq=[];
1.3随机跳跃法
1.3.1随机跳跃法简介
对于如下的优化模型,可以采用随机跳跃法求解。
思路:
产生若干组[0,1]均匀分布的随机数,然后求出对应每组随机数的X,随机产生m组这样的点X,然后从这些点中找出目标函数的最小值,则找到一个近似最优解。
特点:
1、方法简单,但并不适用于变量很多的情形。
如果不考虑运行效率,倒是可以用该方法一试。
随机产生的点越多,就越接近于最优解。
2、一般不用于实时系统。
1.3.2求解高速公路问题的随机跳跃法程序
程序:
solvP97rand.m
%2004-12-3
%随机跳跃法示例:
求解高速公路问题
%
globalCL
C=[4008001200];
L=[44444];
time_begin=clock;
N=4;%决策变量个数
TotalCount=1e5;
a=0;
b=30;
opt_obj=inf;%init
opt_dec=zeros(1,4);
forc=1:
TotalCount,
fori=1:
N,
x(i)=a+rand*(b-a);
end%fori
cur_obj=objfun_97(x);
ifcur_obj opt_obj=cur_obj; opt_dec=x; end end%forc disp(sprintf('最优目标=%20.6f',opt_obj)) fori=1: N, disp(sprintf('x(%d)=%20.4f',i,x(i))) end exp_time=etime(clock,time_begin) C=ones(3,1);%相对于讲目标函数中单价设为1,则计算结果应为总长度S1+S2+S3+S4+S5 len=objfun_97(opt_dec) 1.3.3程序运行结果 运用随机跳跃法搜索高速问题的近似最优解,程序输出结果如下: 最优目标=22623.036913 x (1)=18.1229 x (2)=0.5607 x(3)=28.1015 x(4)=24.4806 exp_time= 15.5500 len= 38.6446 发现超出最优值 ,可见已经非常接近最优值了,这里采用随机跳跃法的效果较好。 思考: 为什么随机跳跃法在这里运用的效果这么好? 1.4网格法 1.4.1网格法简介 对于如下的优化模型,也可以采用网格法求解。 思路: 将各决策变量的取值区间等分为多个区间,比如m等分,而在搜索中对各决策变量的取值,只从这等分点上取出组合,各变量有m+1个可能的取值。 由于m等分后,各决策变量就只搜索m+1个点,模型有n个决策变量,则要搜索 个可行解。 然后从这些点中找出目标函数的最小值,则找到一个近似最优解。 特点: 1、方法简单,并不适用于变量很多的情形。 如果不考虑运行效率,倒是可以用该方法一试。 2、如果要结果更精确,m可以取更大些,就越接近于最优解,当如搜索点更多,更费时。 3、一般不用于实时系统。 1.4.2求解高速公路问题的网格法程序 %2004-12-3 %网格法示例: 求解高速公路问题 % clearall globalCL C=[4008001200]; L=[44444]; time_begin=clock; N=4;%决策变量个数 a=0; b=30; opt_obj=inf;%init opt_dec=zeros(1,4); gridnum=30; step=b/gridnum count=0; forx1=0: step: b, forx2=0: step: b, forx3=0: step: b, forx4=0: step: b, x=[x1x2x3x4]; count=count+1; cur_obj=objfun_97(x); ifcur_obj opt_obj=cur_obj; opt_dec=x; end end%forx4 end%forx3 end%forx2 end%forx1 count disp(sprintf('最优目标=%20.6f',opt_obj)) fori=1: N, disp(sprintf('x(%d)=%20.6f',i,x(i))) end exp_time=etime(clock,time_begin) C=ones(3,1);%相对于讲目标函数中单价设为1,则计算结果应为总长度S1+S2+S3+S4+S5 len=objfun_97(opt_dec) 1.4.3程序运行结果 count= 923521 最优目标=22603.376739 x (1)=30.000000 x (2)=30.000000 x(3)=30.000000 x(4)=30.000000 exp_time= 105.7900 len= 39.3180 1.5实验: 开放式基金的投资问题 某开放式基金现有总额为15亿元的资金可用于投资,目前共有8个项目可供投资者选择。 每个项目可以重复投资,根据专家经验,对每个项目投资总额不能太高,且有个上限。 这些项目所需要的投资额已经知道,在一般情况下,投资一年后各项目所得利润也可估计出来,见表一: 表1投资项目所需资金及预计一年后所得利润 单位: 万元 项目编号 A1 A2 A3 A4 A5 A6 A7 A8 投资额 6700 6600 4850 5500 5800 4200 4600 4500 预计利润 1139 1056 727.5 1265 1160 714 1840 1575 上限 34000 27000 30000 22000 30000 23000 25000 23000 请帮助该公司解决以下问题: 1、就表一提供的数据,试问应该选取哪些项目进行投资,使得第一年所得利润最大? 2、在具体对这些项目投资时,实际还会出现项目之间相互影响等情况。 公司在咨询了有关专家后,得到如下可靠信息: 1)如果同时对第1个和第3个项目投资,它们的预计利润分别为1005万元和1018.5万元; 2)如果同时对第4、5个项目投资,它们的预计利润分别为1045万元和1276万元; 3)如果同时对第2、6、7、8个项目投资,它们的预计利润分别为1353万元、840万元、1610万元、1350万元; 4)如果考虑投资风险,则应该如何投资使得收益尽可能大,而风险尽可能的小。 投资项目总风险可用所投资项目中最大的一个风险来衡量。 专家预测出的投资项目Ai的风险损失率为qi,数据见表二。 表2投资项目的风险损失率 项目编号 风险损失率 A1 A2 A3 A4 A5 A6 A7 A8 qi(%) 32 15.5 23 31 35 6.5 42 35 由于专家的经验具有较高的可信度,公司决策层需要知道以下问题的结果: (1)如果将专家的前3条信息考虑进来,该基金该如何进行投资呢? (2)如果将专家的4条信息都考虑进来,该基金又应该如何决策? 开放式基金一般要保留适量的现金,降低客户无法兑付现金的风险。 在这种情况下,将专家的4条信息都考虑进来,那么基金该如何决策,使得尽可能的降低风险,而一年后所得利润尽可能多?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优化 练习