MATLAB7.0学习之一到运筹学的实验题解答

来源:互联网 发布:雷洋事件 知乎 编辑:程序博客网 时间:2024/05/17 11:57

        这几天,小伙伴又来找笨小葱,说她有一道运筹学实验题需要笨小葱帮忙解决一下。我一看题目,顿时感觉,好高端的样子。幸好小伙伴提供了答案,需要的是,笨小葱使用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年的价格记为Ptt=1,2,…。

    (2)购新车必须支付10%的各项税费。购置费用记为CtCt=1.1Pt

    (3)该车第t年的维护费用Mt是使用年限t的函数,Mt=0.4t1.3

(4)汽车年折旧率为15%,汽车残值为:Bt0.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⊙)大哭

0 0