Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 495|回复: 0

[算法学习]动态规划

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-28 23:57:38 | 显示全部楼层 |阅读模式

    1.                           
    复制代码
    动态规划 是最优化原理 中的一种重要的方法。        动态规划在查找有很多 重叠子问题 的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。       动态规划只能应用于有 最优子结构 的问题。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决。

    总的来说,动态规划的优势在于:  
         
          
          
          
          

          
         
       
       
         
         重叠子问题
         最优子结构
         记忆化
         
         问题描述:
    动态规划举例
    图10-3(a)示出了一个数字三角形,请编一个程序, 计算从顶至底的某处的一条路径, 使该路径所经过的数字的总和最大。

    (1) 每一步可沿左斜线向下或右斜线向下;
    (2) 1<三角形行数≤100;
    (3) 三角形中的数字为0,1,……99。

    输入数据:
    由INPUT.TXT文件中首先读到的是三角形的行数,
    在例子中INPUT.TXT表示如图13-3(b).


       
       
    1.                            
    2.                                7
    3.                               3 8
    4.                              8 1 0
    5.                             2 7 4 4
    6.                            4 5 2 6 5
    7.                           5 6 9 5 9 8
    8.                           
    复制代码

       
      
      思路:
    1.算出每个节点的规划值(也就是待比较的最大值),并记录搜索路径
    2.取三角形底边所有规划值中的最大值
    3.输出路径

    主程序

    1. import  java.util. * ;
    2. /**
    3. *  用动态规划法求出最优路径
    4. *   @author  zqc
    5. *  */
    6.   public   class  DynamicSolveTrianglePath   {
    7.    
    8.      private  String[][] str_triangle  =   null ;
    9.      private  Node[][] triangle_nodes  =   null ;
    10.      private  List nodes;
    11.      private  List paths;
    12.    
    13.      // 节点
    14.        static   class  Node  {
    15.          private   int  value;
    16.          private  List path  =   new  Vector();
    17.          public  List getPath()   {
    18.              return  path;
    19.         }
    20.           public   void  setPath(List p)  {
    21.             path  =  p;
    22.         }
    23.          // n=(0,0) or (0,1) or (2,2)
    24.            public   void  addPath(String n)  {
    25.             path.add(n);
    26.         }
    27.           public   void  addPath(List pa)  {
    28.             path.addAll(pa);
    29.         }
    30.           public   int  getValue()   {
    31.              return  value;
    32.         }
    33.           public   void  setValue( int  value)   {
    34.              this .value  =  value;
    35.         }
    36.     }
    37.    
    38.      public  DynamicSolveTrianglePath()  {
    39.         initNodes();
    40.         findPath();
    41.     }
    42.    
    43.      // 从根节点开始,逆向推解出到达所有节点的最佳路径
    44.     private void initNodes(){
    45.         this.str_triangle = ReadTriangle.getTriangle();
    46.         triangle_nodes = new Node[str_triangle.length][];
    47.         nodes = new Vector();
    48.         for(int i = 0 ; i < str_triangle.length; i++){
    49.             triangle_nodes[i] = new Node[str_triangle[i].length];
    50.             for(int j = 0 ; j< str_triangle[i].length;j++){
    51.                 String currentPath = "("+i+","+j+")";
    52.                 Node n = new Node();
    53.                if(i==0&&j==0){
    54.                    n.setValue(c(str_triangle[0][0]));
    55.                    n.addPath(currentPath);
    56.                    triangle_nodes[i][j] = n;
    57.                    continue;
    58.                }
    59.                //左右边界节点
    60.                if((j==0||j==str_triangle[i].length-1)){
    61.                    if(i==1){//第2行的节点
    62.                        int value = c(str_triangle[0][0])+c(str_triangle[i][j]);
    63.                        List ph = triangle_nodes[0][0].getPath();
    64.                        n.addPath(ph);
    65.                        n.addPath(currentPath);
    66.                        n.setValue(value);
    67.                        ph = null;
    68.                    }else{//0,1行以下的其他边界节点
    69.                      int value = j==0?c(str_triangle[i][j])+triangle_nodes[i-1][j].getValue():
    70.                          c(str_triangle[i][j])+triangle_nodes[i-1][j-1].getValue();
    71.                      List ph = j==0?triangle_nodes[i-1][j].getPath():
    72.                          triangle_nodes[i-1][j-1].getPath();
    73.                      n.addPath(ph);
    74.                      n.addPath(currentPath);
    75.                      n.setValue(value);
    76.                    }
    77.                }else{//除边界节点外其他节点
    78.                        Node node1 = triangle_nodes[i-1][j-1];
    79.                        Node node2 = triangle_nodes[i-1][j];
    80.                        Node bigger = max(node1,node2);
    81.                        List ph = bigger.getPath();
    82.                        n.addPath(ph);
    83.                        n.addPath(currentPath);
    84.                        int val = bigger.getValue()+c(str_triangle[i][j]);
    85.                        n.setValue(val);
    86.                }
    87.               triangle_nodes[i][j] = n;
    88.               n = null;
    89.             }//end of for j
    90.         }//end of for i
    91.     }
    92.    
    93.     private Node max(Node node1,Node node2){
    94.         int i1 = node1.getValue();
    95.         int i2 = node2.getValue();
    96.         return i1>i2?node1:node2;
    97.     }
    98.    
    99.     private int c(String s){
    100.         return Integer.parseInt(s.trim());
    101.     }
    102.    
    103.     //找出最佳路径
    104.     private void findPath(){
    105.         if(this.triangle_nodes==null)return;
    106.         int max = 0;
    107.         int mi = 0;
    108.         int mj = 0;
    109.         for(int i = 0 ; i < triangle_nodes.length; i++){
    110.             for(int j = 0 ; j< triangle_nodes[i].length;j++){
    111.                 int t = triangle_nodes[i][j].getValue();
    112.                 if(t>max){
    113.                     max = t;
    114.                     mi = i;
    115.                     mj = j;
    116.                 }
    117.             }
    118.         }
    119.         System.out.println("Max Path:"+triangle_nodes[mi][mj].getPath());
    120.         System.out.println("Max Value:"+max);
    121.     }
    122.    
    123.     public static void main(String[] args)throws Exception{
    124.         DynamicSolveTrianglePath dsp = new
    125.            DynamicSolveTrianglePath();
    126.     }
    127.    
    128. }
    复制代码
    用于读取文件的辅助类

    1. import  java.io. * ;
    2. import  java.util. * ;
    3. /**
    4. *  输入文本格式为
    5. *  类似这样一个数字三角形
    6. *  
    7. *          x
    8. *         x x
    9. *        x x x
    10. *       x x x x
    11. *      x x x x x
    12. *      
    13. *   @author  zqc
    14. *  */
    15.   public   class  ReadTriangle   {
    16.      public   static  String TRIANGLE_FILE  ="c:/java/triangle.txt" ;
    17.    
    18.      public   static  String[][] getTriangle()  {
    19.         String[][] rtn;
    20.          try{
    21.             File f  =new File(ReadTriangle.TRIANGLE_FILE);
    22.             BufferedReader br=new BufferedReader(new  FileReader(f));
    23.             List l  =new Vector();
    24.             String line  =br.readLine();
    25.              while (line != null )  {
    26.                 l.add(line.trim());
    27.                 line=br.readLine();
    28.             }
    29.              int heigth=l.size();
    30.             rtn  =new  String[heigth][];
    31.              for ( int i  =0  ; i< heigth ; i ++ )  {
    32.                 String s  = (String)l.get(i);
    33.                 String[] tk  =s.split(" ");
    34.                  int  tklen  =tk.length;
    35.                 rtn[i]  =new String[tklen];
    36.                  for ( int  k  =0  ; k  < tklen ; k ++ )  {
    37.                     rtn[i][k]  =  tk[k];
    38.                 }
    39.             }
    40.              return  rtn;
    41.         }   catch  (FileNotFoundException e)   {
    42.             System.out.println("err1="+e);
    43.         }   catch  (IOException e)   {
    44.             System.out.println("err2="+e);
    45.         }
    46.          return   null ;
    47.     }
    48.    public static void main(String args[]){
    49.        String[][] trn=ReadTriangle.getTriangle();
    50.        System.out.println("toal="+trn.length);
    51.        for(int i=0;i< trn.length;i++){
    52.             System.out.println("ok="+trn[i].length);
    53.             for(int j=0;j< trn[i].length;j++)              
    54.               System.out.println(trn[i][j]);
    55.       }
    56.      }
    57.    
    58. }
    复制代码
    结果输出如下:

    Max Path:[(0,0), (1,0), (2,0), (3,1), (4,1), (5,2)]
    Max Value:39

    同样的方法可以解决很多类似的问题,比如,游戏中的最短路径;最优化投资问题;背包问题等等.  

      
      
       
       

         
       

         
       
      


    源码下载:http://file.javaxxz.com/2014/10/28/235738531.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 01:23 , Processed in 0.318391 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表