贪心算法实例

【问题描述】

马的遍历问题。在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。

 

传统算法:

首先这是一个搜索问题,运用深度优先搜索进行求解。算法如下:

  1、 输入初始位置坐标x,y

  2、 步骤 c:

  如果c> 64输出一个解,返回上一步骤c--

  (x,y) ← c

  计算(x,y)的八个方位的子结点,选出那此可行的子结点

  循环遍历所有可行子结点,步骤c++重复2

  显然(2)是一个递归调用的过程,大致如下:

  void dfs(int x,int y,int count)

  {

  int i,tx,ty;

  if(count> N*N)

  {

  output_solution();//输入一个解

  return;

  }

  for(I=0;i <8;++i)

  {

  tx=hn[i].x;//hn[]保存八个方位子结点

  ty=hn[i].y;

  s[tx][ty]=count;

  dfs(tx,ty,count+1);//递归调用

  s[tx][ty]=0;

  }

  }

  这样做是完全可行的,它输入的是全部解,但是马遍历当8×8时解是非常之多的,用天文数字形容也不为过,这样一来求解的过程就非常慢,并且出一个解也非常慢。

  怎么才能快速地得到部分解呢?

 

 

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

  贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

  贪心算法的基本思路如下:

  1.建立数学模型来描述问题。

  2.把求解的问题分成若干个子问题。

  3.对每一子问题求解,得到子问题的局部最优解。

  4.把子问题的解局部最优解合成原来解问题的一个解。

  实现该算法的过程:

  从问题的某一初始解出发;

  while 能朝给定总目标前进一步 do

  求出可行解的一个解元素;

  由所有解元素组合成问题的一个可行解。

  下面是一个可以试用贪心算法解的题目,贪心解的确不错,可惜不是最优解。

 

其实马踏棋盘的问题很早就有人提出,且早在1823年,J.C.Warnsdorff就提出了一个有名的算法。在每个结点对其子结点进行选取时,优先选择出口最小的进行搜索,出口的意思是在这些子结点中它们的可行子结点的个数,也就是孙子结点越少的越优先跳,为什么要这样选取,这是一种局部调整最优的做法,如果优先选择出口多的子结点,那出口少的子结点就会越来越多,很可能出现结点(顾名思义就是没有出口又没有跳过的结点),这样对下面的搜索纯粹是徒劳,这样会浪费很多无用的时间,反过来如果每次都优先选择出口少的结点跳,那出口少的结点就会越来越少,这样跳成功的机会就更大一些。这种算法称为为贪心算法,也叫贪婪算法或启发示算法,它对整个求解过程的局部做最优调整,它只适用于求较优解或者部分解,而不能求最优解。这样的调整方法叫贪心策略,至于什么问题需要什么样的贪心策略是不确定的,具体问题具体分析。实验可以证明马遍历问题在运用到了上面的贪心策略之后求解速率有非常明显的提高,如果只要求出一个解甚至不用回溯就可以完成,因为在这个算法提出的时候世界上还没有计算机,这种方法完全可以用手工求出解来,其效率可想而知。

 

 

个人代码(仅供参考):

#if !defined(AFX_HORSE_H__7543DB1E_0FD1_438C_A261_5B8791E184F3__INCLUDED_)

#define AFX_HORSE_H__7543DB1E_0FD1_438C_A261_5B8791E184F3__INCLUDED_

 

#if _MSC_VER > 1000

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
共54个文件 2018地球巨大灾难之前的宁静(此文件某管家识别病毒,已加密,密码csdn) 05.eqx_frameskool 2007年作品.exe 12.fr-019 kkino64.exe 13.fr-030 candytron party火星美女.exe 14.flybye卡通.exe 15.fr-041_debris.exe 17.FAiRLiGHT(cpu).EXE 18.国内 psyong.exe 19.apc_universe.exe 22.chaostheory.exe 23.pb3.exe 24.zoom3_v1_02.exe 64K动画大赛作品_彗星撞地球.exe apc_universe.exe Beyond_Final.exe BinaryFlow_ATI.exe BinaryFlow_Nvidia.exe Brullwurfel.exe cat-F-Felix.exe cat-F-Felix_safe.exe chaostheory.exe fr-019-v110.exe fr-022.exe fr-027.exe fr-034.exe fr030-candytron-final-101.exe fr08v101.exe GaiaMachina.exe game. kkrieger.RAS.exe HEAVEN7W.EXE pb3.exe project_genesis.exe prophecy.exe prophecy《彗星撞地球》.exe ptct.exe rgba_195_95_256_win32_pc.exe rgba_paradise_final.exe rzr-the_scene_is_dead.exe squish.exe zoom3_v1_02.exe 之一:幽灵古堡.exe 之三:火域幻境.exe 之二:第七天堂.exe 之五:死亡阴影.exe 之六:金属迷城.exe 之四:爱之记忆.exe 光影.exe 幽灵古堡.exe 死亡阴影.EXE 火域幻境.EXE 爱之记忆.exe 第七天堂.EXE 金属迷城.EXE 彗星撞地球 据说半小时不重复 Warez出品的精品动画 近25万倍的压缩的精品 每年,世界各地著名的Warez组织都会推出一个小的动画片来比较,仅仅是用来炫耀其实力。64K的3D动画。要知道,一首普通的MP3,通常就有 4000K左右,一张普通的JPG压缩图片也要30-40K,而这个仅有63K的3D动画,你花半个小时也看不完而且不重复带音乐. prophecy《彗星撞地球》2000年时的最经典力作!相信大多网友对这个演示是相当熟悉了。将1.9G的数据压缩为64K,其3D渲染和声效却令人震撼,尤其是已64K的大小竟然演示了近30分钟的不重复3D影片,其技术令人震惊~因为,事实上,这个动画的真正容量超过15G,也就是说这个 Warez组织把它压缩了25万倍。注:系统必须安装有 directx8.0才行。因为动画支持DX8.0加速。 表面看起来这是一只小鸭的图片,然而把文件后缀名改成RAR,然后解压缩,很神奇的事情就发生了! 推荐配置:2G/512M/GF4Ti或ATi9600、128M以上 按A键可缩小,按S键放大,按F键快速放,按R键重放…… ++++++++++补充说明的分割线++++++++++++ 1、右键点鸭子图片,选择“图片另存为”。 2、文件后缀名可能无法直接修改,请: (1)右键点屏幕左下角“开始” (2)进入“资源管理器” (3)选择“工具”---“文件夹”选项---“查看” 取消“隐藏已知文件类型的扩展名”前的勾 (4)点“确定” 3、右键点鸭子图片,选择“重命名”,把文件名最后的“Jpg”改为“RAR”,注意,不要加引号。 4、解压缩,出现文件夹。双击其中的“彗星撞地球.exe
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值