计算机算法
数学建模中有一类计算机算法的类,这里给实例Mark一下
原文:http://blog.csdn.net/qq_34861102/article/details/77868357
动态规划
主函数
x=nan*ones(14,4);% x是10的倍数,最大范围0≤x≤130, x(1:7,1)=10*(0:6)'; % 按月定义x的可能取值 x(1:11,2)=10*(0:10)';x(1:12,3)=10*(2:13)'; x(1:7,4)=10*(0:6)'; [p,f]=dynprog(x,'DecisF_1','ObjF_1','TransF_1') %这里求出来是对应着1、2、3个不同月份下的最佳存储量
调用函数
function [p_opt,fval]=dynprog(x,DecisFun,ObjFun,TransFun) k=length(x(1,:));f_opt=nan*ones(size(x));d_opt=f_opt; t_vubm=inf*ones(size(x));x_isnan=~isnan(x);t_vub=inf; % 计算终端相关值 tmp1=find(x_isnan(:,k));tmp2=length(tmp1); for i=1:tmp2 u=feval(DecisFun,k,x(i,k));tmp3=length(u); for j=1:tmp3 tmp=feval(ObjFun,k,x(tmp1(i),k),u(j)); if tmp<=t_vub, f_opt(i,k)=tmp;d_opt(i,k)=u(j);t_vub=tmp; end;end;end % 逆推计算各阶段的递归调用程序 for ii=k-1:-1:1 tmp10=find(x_isnan(:,ii));tmp20=length(tmp10); for i=1:tmp20 u=feval(DecisFun,ii,x(i,ii));tmp30=length(u); for j=1:tmp30 tmp00=feval(ObjFun,ii,x(tmp10(i),ii),u(j)); tmp40=feval(TransFun,ii,x(tmp10(i),ii),u(j)); tmp50=x(:,ii+1)-tmp40; tmp60=find(tmp50==0); if ~isempty(tmp60), tmp00=tmp00+f_opt(tmp60(1),ii+1); if tmp00<=t_vubm(i,ii) f_opt(i,ii)=tmp00;d_opt(i,ii)=u(j); t_vubm(i,ii)=tmp00; end;end;end;end;end; fval=f_opt(tmp1,1); % 记录最优决策、最优轨线和相应指标函数值 p_opt=[];tmpx=[];tmpd=[];tmpf=[]; tmp0=find(x_isnan(:,1));tmp01=length(tmp0); for i=1:tmp01, tmpd(i)=d_opt(tmp0(i),1); tmpx(i)=x(tmp0(i),1); tmpf(i)=feval(ObjFun,1,tmpx(i),tmpd(i)); p_opt(k*(i-1)+1,[1,2,3,4])=[1,tmpx(i),... tmpd(i),tmpf(i)]; for ii=2:k tmpx(i)=feval(TransFun,ii-1,tmpx(i),tmpd(i)); tmp1=x(:,ii)-tmpx(i);tmp2=find(tmp1==0); if ~isempty(tmp2) tmpd(i)=d_opt(tmp2(1),ii); end; tmpf(i)=feval(ObjFun,ii,tmpx(i),tmpd(i)); p_opt(k*(i-1)+ii,[1,2,3,4])=[ii,tmpx(i),... tmpd(i),tmpf(i)]; end;end;
function u = DecisF_1(k,x) % 在阶段k由状态变量x的值求出其相应的决策变量所有的取值 c=[70,72,80,76]; q=10*[6,7,12,6]; if q(k)-x<0 u=0:100; %决策变量不能取为负值 else u=q(k)-x:100; end; %产量满足需求且不超过100 u = u(:); end
function v = ObjF_1(k,x,u) % 阶段k的指标函数 c=[70,72,80,76]; v=c(k)*u+2*x; end
function y = TransF_1(k,x,u) % 状态转移方程 q=10*[6,7,12,6]; y=x+u-q(k); end
回溯搜索
主函数(八皇后问题求解)
global solutionNum; solutionNum=0;%全局变量记录方法数 N=8;%皇后个数 matrix=zeros(N);%存储皇后位置信息 PlaceQueen(1,matrix,N)%调用放置方法
调用函数列表
function PlaceQueen(row,matrix,N)%回溯法放置皇后 if row>N PrintQueen(N,matrix);%打印棋盘 else for col=1:N matrix(row,col)=1; if row==1||Conflict(row,col,N,matrix)%检测是否冲突 PlaceQueen(row+1,matrix,N); end matrix(row,col)=0; end end
%子函数:检测冲突 function result=Conflict(row,col,N,matrix)%检测是否冲突 result=1; for i=1:row-1 for j=1:N if matrix(i,j)==1 if ((j==col)||(abs(row-i)==abs(col-j)))%是否产生冲突:在同一直线,斜线上 result=0; break; end end end if result==0 break; end end
%子函数:打印棋盘信息 function PrintQueen(N,matrix) global solutionNum; %定义全局变量,来累积方法数 solutionNum=solutionNum+1; disp(['第',num2str(solutionNum),'种方法:']) disp(matrix)
分治算法
主函数
BinarySearch1(1200,3000);
二分搜索
function[outputs] = BinarySearch1(low,high); while (1) mid = (low+high)/2; [out_1,out_2] = get(211,mid,que(211,mid)); if abs((out_1-5)/5)<0.01 disp(mid); return; end if abs(low - high) < 100 disp(low); return; end if out_1 > 5 high = mid - 1 end if out_1 < 5 low = mid + 1 end end end
其中
out_1
是评价函数的值分支定界
可以直接通过
intlinprog
中相关参数来选择