再谈奶牛问题

通过面向对象的方法解决了一道经典的奶牛繁殖问题。该问题描述为:一只新生小牛4年后开始每年生育一只小牛,计算20年后共有多少只牛。代码实现了奶牛实体类、非递归生育算法及结果显示。

在博客园上看到很多人讨论的”在csdn上看到奶牛问题,写了下算法“和“奶牛问题”,觉得好玩,自己尝试着用面向对象的方法算了一下,练练手,没有技术含量,记录下来。
一、问题还原
一只刚出生的小牛,4年后生一只小牛,以后每年生一只。现有一只刚出生的小牛,问20年后共有牛多少只?

ps:看到很多人在原题处留言说这题出的不严谨云云。下面的所有实现都是在理想状态下,特此声明。
二、具体实现
1、奶牛实体类

ExpandedBlockStart.gif 代码
   public   class  Cow
    {

        
public  Cow()
        {

        }

        
public  Cow( int  age,  int  generation,  int  id,  int  parentId)
        {
            
this .Age  =  age;
            
this .Generation  =  generation;
            
this .Id  =  id;
            
this .ParentId  =  parentId;
        }

        
///   <summary>
        
///  岁数
        
///   </summary>
         public   int  Age {  get set ; }

        
///   <summary>
        
///  第几代
        
///   </summary>
         public   int  Generation {  get set ; }

        
///   <summary>
        
///  唯一标识 id
        
///   </summary>
         public   int  Id {  get set ; }

        
///   <summary>
        
///  母亲id
        
///   </summary>
         public   int  ParentId {  get set ; }
    }

 2、生奶牛方法(非递归)

ExpandedBlockStart.gif 代码
         static  List < Cow >  listCows  =   new  List < Cow > ();
        
public   static   void  GetBirth( int  year)
        {
            List
< Cow >  listBornCows  =   new  List < Cow > (); // 用于添加新生的奶牛
            Cow firstCow  =   new  Cow( 1 1 1 0 );
            listCows.Add(firstCow);
            
for  ( int  i  =   0 ; i  <  year; i ++ )
            {
                
foreach  (Cow item  in  listCows)
                {
                    item.Age
++ // 年龄自增
                     if  (item.Age  >   4 )
                    {
                        
// 生出一头牛
                        Cow birth  =   new  Cow( 1 , item.Generation  +   1 , listCows.Count  +   1 , item.Id);
                        listBornCows.Add(birth); 
// 添加新生的奶牛
                    }
                }
                listCows.AddRange(listBornCows);
                listBornCows.Clear();
            }
        }

 3、输出
下面的显示是按照母亲id来显示结果的,您也可以改成按照第几代或者岁数显示。

ExpandedBlockStart.gif 代码
         public   static  List < Cow >  GetCowByParentId( int  parentId)
        {
            List
< Cow >  result  =   new  List < Cow > ();
            
foreach  (Cow item  in  listCows)
            {
                
if  (item.ParentId  ==  parentId)
                {
                    result.Add(item);
                }
            }
            
return  result;
        }

        
public   static   void  ShowCows()
        {
            
int  count  =   0 ;
            
if  (listCows  !=   null )
            {
                count 
=  listCows.Count;
            }
            Console.WriteLine(
string .Format( " After 20 years,cows count:{0} " , count.ToString()));

            
/* 下面按照所属母亲(ParentId)显示对应奶牛数 */
            
int  maxParentId  =   0 ;
            
if  (listCows.Count  >   0 )
            {
                
// 按照所属母亲 逆序排序
                listCows.Sort( delegate (Cow left, Cow right) {  return  right.ParentId.CompareTo(left.ParentId); });
                maxParentId 
=  listCows[ 0 ].ParentId;
            }
            
for  ( int  i  =   0 ; i  <  maxParentId; i ++ )
            {
                List
< Cow >  listModels  =  GetCowByParentId(i);
                Console.WriteLine(
string .Format( " Cow_{0}'s children as follows: " , i));
                
if  (listModels.Count  ==   0 )
                {
                    Console.WriteLine(
" Has no any child! " );
                }
                
else
                {
                    
foreach  (Cow item  in  listModels)
                    {
                        Console.WriteLine(
string .Format( " Age:{0},Id:{1},Generation:{2} " , item.Age, item.Id, item.Generation));
                    }
                }
            }
        }

 最后贴一下完整代码:

ExpandedBlockStart.gif 代码
    class  Program
    {
        
static  List < Cow >  listCows  =   new  List < Cow > ();
        
static   int  maxYear  =   20 ;
        
public   static   void  GetBirth( int  year)
        {
            List
< Cow >  listBornCows  =   new  List < Cow > (); // 用于添加新生的奶牛
            Cow firstCow  =   new  Cow( 1 1 1 0 );
            listCows.Add(firstCow);
            
for  ( int  i  =   0 ; i  <  year; i ++ )
            {
                
foreach  (Cow item  in  listCows)
                {
                    item.Age
++ // 年龄自增
                     if  (item.Age  >   4 )
                    {
                        
// 生出一头牛
                        Cow birth  =   new  Cow( 1 , item.Generation  +   1 , listCows.Count  +   1 , item.Id);
                        listBornCows.Add(birth); 
// 添加新生的奶牛
                    }
                }
                listCows.AddRange(listBornCows);
                listBornCows.Clear();
            }
        }

        
public   static  List < Cow >  GetCowByParentId( int  parentId)
        {
            List
< Cow >  result  =   new  List < Cow > ();
            
foreach  (Cow item  in  listCows)
            {
                
if  (item.ParentId  ==  parentId)
                {
                    result.Add(item);
                }
            }
            
return  result;
        }

        
public   static   void  ShowCows()
        {
            
int  count  =   0 ;
            
if  (listCows  !=   null )
            {
                count 
=  listCows.Count;
            }
            Console.WriteLine(
string .Format( " After 20 years,cows count:{0} " , count.ToString()));

            
/* 下面按照所属母亲(ParentId)显示对应奶牛数 */
            
int  maxParentId  =   0 ;
            
if  (listCows.Count  >   0 )
            {
                
// 按照所属母亲 逆序排序
                listCows.Sort( delegate (Cow left, Cow right) {  return  right.ParentId.CompareTo(left.ParentId); });
                maxParentId 
=  listCows[ 0 ].ParentId;
            }
            
for  ( int  i  =   0 ; i  <  maxParentId; i ++ )
            {
                List
< Cow >  listModels  =  GetCowByParentId(i);
                Console.WriteLine(
string .Format( " Cow_{0}'s children as follows: " , i));
                
if  (listModels.Count  ==   0 )
                {
                    Console.WriteLine(
" Has no any child! " );
                }
                
else
                {
                    
foreach  (Cow item  in  listModels)
                    {
                        Console.WriteLine(
string .Format( " Age:{0},Id:{1},Generation:{2} " , item.Age, item.Id, item.Generation));
                    }
                }
            }
        }

        
static   void  Main( string [] args)
        {
            GetBirth(maxYear);
            ShowCows();
            Console.ReadLine();
        }
    }



 

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值