这几天,小伙伴又来找笨小葱,说她有一道运筹学实验题需要笨小葱帮忙解决一下。我一看题目,顿时感觉,好高端的样子。幸好小伙伴提供了答案,需要的是,笨小葱使用matlab编程实现一下答案。于是乎matlab学习之路就此开始咯。首先选择版本,看了一下最新的2014要7个G,吓了一跳。都赶上网游了。。。于是选用了十年前的金典matlab7.0版本,1个G左右。
下面是整个解决问题过程:
1.网上下载matlab7.0
安装:修改系统变量tmp和temp的值为:c:\temp
不要解压下载的安装包,直接通过winrar进去,双击setup按钮
安装界面输入cdkey(百度一下)
安装完成后,如果点击运行,出现如下界面:
那么,进入到软件执行程序,也就是这个
![]()
,右键
属性->兼容性
->勾选"以兼容模式运行这个程序"->选择Windows Vista SP1->勾选"以管理员身份运行此程序"->确定即可
下面进入matlab运行界面:
matlab基础知识:
这里clear需要注意,清除内存变量,比较实用。
了解了基本命令和使用方法后,直接跳到矩阵的生成知识(因为立马要用到)
首先看数组:
>>array=[1 2 3 4];
要访问array数组中的第2个元素:
>>array(2)
要访问array数组中的第2到4个元素:
>>array(2:4
)
我们这里需要通过函数生成矩阵:
>>B=zeros(4,5) %生成4行5列的零矩阵
matlab程序书写在M文件中,M文件有2中,一种脚本式(script),一种函数式(function)
(1)函数式M文件名和出现在文件的第一行的函数名必须相同。实际上,matlab忽略第一行函数名,并根据文件名来执行函数。
(2) 函数的文件名最多可以有31个字符。
(3)函数名必须以字母开头
下面我们用一个简单的demo来看看2中M文件间的调用。
首先写一个add(a,b)函数,将其保存在MATLAB7\work目录下。
然后写一个脚本调用这个add函数。同样保存在work目录下
然后执行脚本
>>test
得到输出结果:
到这里我们暂时需要的技能都已经get啦。
下面开始解决问题:
【3】购车问题
Tom大学毕业后刚取得汽车驾驶执照,对SKY05型小汽车情有独钟。准备第1年年初买一辆使用了3年的SKY05型二手车,价格为7.12万元。1年后可以继续使用该车,也可以卖掉购买同一品牌的新车,不再购买二手车。通过市场调查和预测,得到有关资料。
(1)该车第1年初的价格为10万元,以后逐年降价,第2年到第5年的的降价幅度分别为4%、5%、7%、5%。第t年的价格记为Pt,t=1,2,…。
(2)购新车必须支付10%的各项税费。购置费用记为Ct,Ct=1.1Pt。
(3)该车第t年的维护费用Mt是使用年限t的函数,Mt=0.4t1.3。
(4)汽车年折旧率为15%,汽车残值为:Bt=0.85 tPt。
无论第5年末更新或不更新,将汽车残值从总成本中减去,等价于将车卖掉。Tom如何制定一个5年的购车方案使5年的总成本最低(不计其它成本)。
------------------------------------------------------------------------
模型建立:
(1)由题意可该购车问题分为五个阶段T=[1,2,3,4,5],T表示第i各阶段(第i年)
(2)某个阶段的指标函数为:d=购置费+维修费-残值,当汽车未更新是购置费减去残值即为某一年对汽车的折旧费,
(3)记第一年到某一年的总成本为55万,A中第i行第j列的某个值,当i=j时表示为第i年更换汽车
(4)所以第5列中的最小值为5年内的最低成本,由此依次向前推找出每列的最小值,当i=j时A(i,j)为第i列中最小值时,即第j年更换汽车,由此可得一个总成本最低的购车方案。
MATLAB编程实现:
首先定义维修费函数:
function y=repaire(t)
y=0.4*t^1.3;
残值函数:
function y=residual(t,pt)
y=(0.85^t)*pt;
指标函数:
function y=cost(a,b,c)
y=a+b-c;
然后编写代码调用
B=[7.2,9.6,9.12,8.482,8.058]; %汽车价格
C=[7.2,10.56,10.032,9.330,8.863]; %汽车购置费
A=zeros(5,5); %对角线上的值表示那一年购买新车,理解这个便于理解下面的t的取值问题
for i=1:5
%第一重循环
if i==1 %因为tom第一年购买的是使用三年的二手车,所以t=4,维修费是repaire(4)
t=4;
else
t=1;
end
for j=i:5
%j=i,说明只取矩阵上三角
y1=repaire(t);
if i==1
y2=residual(t-3,B(i)); %残值从拿到车后就从当年开始计算(购买时,已经是花的残值的价格购买的)
else
y2=residual(t,B(i));
end
if j==i
switch i
case 1
A(i,j)=cost(C(i),y1,y2);
case 2
Q=A(:,1);
%
符号:表示列所有元素,1表示第一列
Q(find(Q==0))=NaN;
m=min(Q);
A(i,j)=cost(C(i),y1,y2)+m; %
这里取对映列的最小值,求和,表示这一年购买新车的累计最低消费
case 3
Q=A(:,2);
Q(find(Q==0))=NaN;
m=min(Q);
A(i,j)=cost(C(i),y1,y2)+m;
case 4
Q=A(:,3);
Q(find(Q==0))=NaN;
m=min(Q);
A(i,j)=cost(C(i),y1,y2)+m;
case 5
Q=A(:,4);
Q(find(Q==0))=NaN;
m=min(Q);
A(i,j)=cost(C(i),y1,y2)+m;
end
else
A(i,j)=cost(y2/0.85,y1,y2)+A(i,j-1);
end
t=t+1;
end
end
A
得到矩阵如下:
由运行程序得到的结果可得一个5年的购车计划始终成本最低:
第一年购买二手车使用一年,第二年购买新车使用两年,第四年更换新车使用到第五年末,可得最低成本为13.1007万元。
ps:好啦,到这里就可以交差了,再次说明,答案是小伙伴提供的,笨小葱太笨了搞不懂运筹学这种高端东东(⊙o⊙)