本文总结了matlab常用的几个算法,希望对数学建模有帮助。
利用matlab编程FFD算法完成装箱问题:设有6种物品,它们的体积分别为:60、45、35、20、20和20单位体积,箱子的容积为100个单位体积。
建立box_main.mfunction[box_count,b]=box_main(v) vmax=100;sort(v,'descend');n=length(v);b=zeros(1,n);for i=1:nb(i)=vmax;endbox_count=1;for i=1:nfor j=1:box_countif v(i)<=b(j) %可以放入 b(j)=b(j)-v(i);break;else%不可放入时continue;endendif j==box_countbox_count=box_count+1;endendbox_count=box_count-1;end主程序为:v=[60 45 35 20 20 20];[box_count,b]=box_main(v)结果:box_count =3 b =5 15 80 100 100 100所以,使用的箱子数为3, 使用的箱子的剩余空间为5,15 ,80。
“超市大赢家”提供了50种商品作为奖品供中奖顾客选择,车的容量为1000dm3 , 奖品i 占用的空间为wi dm3 ,价值为vi 元, 具体的数据如下:vi = { 220, 208, 198, 192, 180, 180, 165, 162, 160, 158,155, 130, 125, 122, 120, 118, 115, 110, 105, 101, 100, 100, 98,96, 95, 90, 88, 82, 80, 77, 75, 73, 72, 70, 69, 66, 65, 63, 60, 58,56, 50, 30, 20, 15, 10, 8, 5, 3, 1}wi = {80, 82, 85, 70, 72, 70, 66, 50, 55, 25, 50, 55, 40, 48,50, 32, 22, 60, 30, 32, 40, 38, 35, 32, 25, 28, 30, 22, 50, 30, 45,30, 60, 50, 20, 65, 20, 25, 30, 10, 20, 25, 15, 10, 10, 10, 4, 4, 2,1}。
解:模型建立:用价值密度贪婪准则的方法设x=v/w,对x做正向排序,依次选取商品。
建立chaoshi.mfunction[item_count,y]=chaoshi(v,w,car) n=length(v);x=zeros(n,3);x(:,1)=v';x(:,2)=w';x(:,3)=v'./v';x=sortrows(x,-3);item_count=0;for i=1:nif car>=x(i,2)car=car-x(i,2);item_count=item_count+1;elsebreak;endendy=zeros(item_count,2); for i=1:item_county(i,1)=x(i,1);y(i,2)=x(i,2);endend主程序为:v= [220, 208, 198, 192, 180, 180, 165, 162, 160, 158,155, 130, 125, 122, 120, 118, 115, 110, 105, 101, 100, 100, 98,96, 95, 90, 88, 82, 80, 77, 75, 73, 72, 70, 69, 66, 65, 63, 60, 58,56, 50, 30, 20, 15, 10, 8, 5, 3, 1];w= [80, 82, 85, 70, 72, 70, 66, 50, 55, 25, 50, 55, 40, 48,50, 32, 22, 60, 30, 32, 40, 38, 35, 32, 25, 28, 30, 22, 50, 30, 45,30, 60, 50, 20, 65, 20, 25, 30, 10, 20, 25, 15, 10, 10, 10, 4, 4, 2,1];car=1000;[item_count,y]=chaoshi(v,w,car);y’;结果为:ans =Columns 1 through 11158 58 115 95 82 118 105 69 65 162 9025 10 22 25 22 32 30 20 20 50 28Columns 12 through 22101 125 155 96 88 160 98 56 220 192 10032 40 50 32 30 55 35 20 80 70 38Columns 23 through 26180 77 122 20870 30 48 82最大总价值为3095元,可装入体积为996贪婪算法练习练习题1:考虑1、8、9、11这四种面值的硬币,要找出币值24的零钱,怎么找能使硬币数最少?利用matlab编程求解。
解:设xj为二进制变量,如果硬币j被选中,则,xj=1,否则xj=0,则找硬币问题的数学模型如下:minnjj1;mnjjjxv 1;用贪婪算法求解,其MATLAB程序如下: function [n,x]=payback(v,y,m) [m,n]=size(y); for i=1:n for j=1:n练习题2:利用matlab编程FFD算法完成下题:设有6种物品,它们的体积分别为:60、45、35、20、20和20单位体积,箱子的容积为100个单位体积。
function [nbox,p]=sjy(n,v,limitv) [m,n]=size(v);w=limitv*ones(m,n); p=zeros(n); nbox=0; for i=1:n for j=1:iif v(i)<w(j) w(j)=w(j)-v(i);p(i,j)=1;break; elsecontinue; endw(j+1)=w(j+1)-v(i);p(i,j+1)=1; nbox=nbox+1; end end运行结果:p =1 0 0 0 0 0 0 1 0 0 0 01 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0练习题3:如果把选择策略从“选出一个下标最小的箱子并把物品ai放入该箱子中”(FF算法)改为选择最佳的箱子(已装载物品大小和最大的-这个称为best fit-BF最佳适应算法),再计算一次上题。
比较两次求解的结果。
练习题4:背包问题:c=[10,5,15,7,6,18,3];w=[2,3,5,7,1,4,1];limitw=15;n=7;求最优解。
“超市大赢家”提供了50种商品作为奖品供中奖顾客选择,车的容量为1000dm3 , 奖练习题5:品i占用的空间为wi dm3 ,价值为vi 元, 具体的数据如下:vi = { 220, 208, 198, 192, 180, 180, 165, 162, 160, 158,155, 130, 125, 122, 120, 118, 115, 110, 10 5, 101, 100, 100, 98,96, 95, 90, 88, 82, 80, 77, 75, 73, 72, 70, 69, 66, 65, 63, 60, 58,56, 50, 30, 20, 15, 10, 8, 5, 3, 1}wi = {80, 82, 85, 70, 72, 70, 66, 50, 55, 25, 50, 55, 40, 48,50, 32, 22, 60, 30, 32, 40, 38, 35, 32, 25, 28, 30, 22, 50, 30, 45,30, 60, 50, 20, 65, 20, 25, 30, 10, 20, 25, 15, 10, 10, 10, 4, 4, 2,1}。
模型的建立:设xj为二进制变量,如果物品j被选中,则j=1,否则,xj=0,如此可将本题转化为如下优化模型:maxnjjjxv1;s.t.njWxxwjnjjj,,2,1},1,0{;1模型的解决:对此优化问题,我们可以选用价值密度贪婪准则,从剩下的物品中选择可装入购物车的单位价值wvjj,最大的物品,即按wvjj非递增的次序装入物品,只要正被考虑的物品装的进就装入小车。
其MA TLAB编程代码如下:function [a1,b1]=sort1(n,a,b)%按单位价值排序 [m,n]=size(a); d=zeros(m,n); for k=1:nd(k)=a(k)/b(k); end%单位价值 for h=1:n-1for j=1:n-h%向后排序if d(j)<d(j+1)t1=a(j);a(j)=a(j+1);a(j+1)=t1; t2=b(j);b(j)=b(j+1);b(j+1)=t2; t3=d(j);d(j)=d(j+1);d(j+1)=t3;% end end end a1=a; b1=b;function [p,c,w]=goodsinknapsack(n,limitw,v,w,x)%计算背包中物品数 cl=limitw;%cl为背包剩余可装载重量 p=0;[m,z]=size(c); x=zeros(m,z);[v,t]=sort1(n,c,w);%物品按单位价值排序 c=v;w=t; for i=1:nif w(i)>cl break%待放入包的物品重量大于包的重量,跳出循环 elsex(i)=1;%x(i)为1时,物品i在包中 cl=cl-w(i);p=p+1;%p记录放入背包物品的个数 end endfunction knapsack(n,limitw,w,v) totalc=0;totalw=0;[m,n]=size(w); %m 是w 的行数n 是w 的列数 x=zeros(m,n);t=w;%记录原数组 k=c; y=x;[p,c,w]=goodsinknapsack(n,limitw,v,w,x);%排序及计算装箱物品数 for j=1:p%装包的p件物品 for i=1:n%原n件物品if (w(j)==t(i))&&(c(j)==k(i))%被选择的物品装箱 y(i)=1; end end end yfor i=1:ntotalc=totalc+k(i)*y(i);%背包的总价值 if y(i)==1totalw=totalw+t(i);%背包所装载总体积 end end totalw totalcv=[220,208,198,192,180,180,165,162,160,158,155,130,125,122,120,118,115,110,105,101,100,100 ,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8,5,3,1];w=[80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,50,30, 45,30,60,50,20,65,20,25,30,10,20,25,15,10,10,10,4,4,2,1]; limitw=1000;n=50;knapsack(n,limitw,w,v);运行结果为:y =Columns 1 through 161 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 Columns 17 through 321 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0 Columns 33 through 480 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 Columns 49 through 500 0层次分析法matlab源程序disp('请输入判断矩阵A(n阶)');A=input('A=');[n,n]=size(A);x=ones(n,100);y=ones(n,100);m=zeros(1,100);m(1)=max(x(:,1));y(:,1)=x(:,1);x(:,2)=A*y(:,1);m(2)=max(x(:,2));y(:,2)=x(:,2)/m(2);p=0.0001;i=2;k=abs(m(2)-m(1));while k>pi=i+1;x(:,i)=A*y(:,i-1);m(i)=max(x(:,i));y(:,i)=x(:,i)/m(i);k=abs(m(i)-m(i-1));enda=sum(y(:,i));w=y(:,i)/a;t=m(i);disp(w);disp(t);%以下是一致性检验CI=(t-n)/(n-1);RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];CR=CI/RI(n);if CR<0.10disp('此矩阵的一致性可以接受!');disp('CI=');disp(CI);disp('CR=');disp(CR);endfunction AHPInit1(x,y)%层次分析的初始化%默认只有两层x为准则数,y为方案数%CToT为准则对目标生成的比较阵%EigOfCri为准则层的特征向量%EigOfOpt为选项层的特征向量EigOfCri=zeros(x,1);%准则层的特征向量EigOfOpt=zeros(y,x);dim=x;%维度RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51];%RI标准%生成成对比较阵for i=1:dimCToT(i,:)=input('请输入数据:');endCToT %输出pause,tempmatrix=zeros(x+1);tempmatrix=AHP1(dim,CToT);EigOfCri=tempmatrix(1:x);ci1=tempmatrix(1+x);EigOfCrici1pause,matrix=cell(x);%元胞数组ci=zeros(1,x);dim=y;for k=1:xmatrix{k}=zeros(dim,dim);%生成成对比较阵for i=1:dimmatrix{k}(i,:)=input('请输入数据:');end%判断该比较阵是不是一致阵tempmatrix=zeros(y+1);tempmatrix=AHP1(dim,matrix{k});EigOfOpt(:,k)=tempmatrix(1:y);ci(k)=tempmatrix(y+1);EigOfOpt(:,k)ci(k)pause,end%下面进行组合一致性检查RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51]; CR=ci1/RI(x)+ci*EigOfCri/RI(y);CRif CR>0.1disp('组合一致性不通过,请重新评分')returnend%下面根据比较阵的结果进行组合result=EigOfOpt*EigOfCri;resultfunction f=AHP1(dim,CmpMatrix)RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51]; %判断该比较阵是不是一致阵%判断该比较阵是不是一致阵[V,D]=eig(CmpMatrix);%求得特征向量和特征值%求出最大特征值和它所对应的特征向量tempNum=D(1,1);pos=1;for h=1:dimif D(h,h)>tempNumtempNum=D(h,h);pos=h;endendeigVector=V(:,pos);maxeig=D(pos,pos);maxeigdimCI=(maxeig-dim)/(dim-1);CR=CI/RI(dim);if CR>0.1disp('准则对目标影响度评分生成的矩阵不是一致阵,请重新评分') returnendCI%归一化sum=0;for h=1:dimsum=sum+eigVector(h);endsumpause,for h=1:dimeigVector(h)=eigVector(h)/sum;endf=[eigVector;CI];多目标线性规划的若干解法及MATLAB实现摘要:求解多目标线性规划的基本思想大都是将多目标问题转化为单目标规划,本文介绍了理想点法、线性加权和法、最大最小法、目标规划法[1],然后给出多目标线性规划的模糊数学解法[2],最后对每种解法给出例子,并用Matlab软件加以实现。