动态规划、回溯搜索、分治算法、分支定界等计算机算法

计算机算法

数学建模中有一类计算机算法的类,这里给实例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中相关参数来选择

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值