穷举查找

对于组合问题来说,穷举查找是一种简单的蛮力算法。它要求生成问题域中的每一个元素,选出其中满足问题约束的元素,然后再找出一个期望元素。

旅行商问题

简单来说,这个问题要求找出一条n个给定的城市间的最短路径,使我们在回到出发的城市之前,对每个城市都只访问一遍。这个问题可以很方便地用加权图来建模,也就是说,用图的顶点代表城市,用边的权重表示城市间的距离。这样该问题就可以表述为求一个图的最短哈密顿回路问题。

哈密顿回路:一个对图的每个顶点都只穿越一次的回路

对于四个点都连通的图,我们假定从a点出发,可以将获得(4-1)!条路径(公式(n-1)!),但是需要注意的是,如果没有假定起点,那么这个问题的规模将增大n倍

对于图中的例子,其实我们发现它们是两两成对的,同对之间不同的仅仅是方向,因此,我们可以将路径总数减半(n-1)!/2,但是,显然,这并没有提高太大的效率。

背包问题

这是计算机科学中另一个著名的问题。给定n个重量为w1,w2,...,wn,w_1,w_2,...,w_n,w1​,w2​,...,wn​,价值为v1,v2,...,vnv_1,v_2,...,v_nv1​,v2​,...,vn​的物品和一个承重为W的背包,求这些物品中一个最优价值的子集,并且要能够装到背包中。
在这个问题中,穷举查找需要考虑给定的n个子集,为了找出可行的子集(也就是说,总重量不超过背包承重能力的子集),要计算出每个子集的总重量,然后在它们中间找到价值最大的子集。因为一个n元素集合的子集数量为2n2^n2n个,所以无论生成独立子集的效率有多高,穷举查找都会导致一个Ω(2n)\Omega(2^n)Ω(2n)的算法。如下例子:

因此无论是对旅行商问题还是背包问题,穷举查找型算法对于任何输入都是非常低效的。实际上,这两个问题就是所谓的NP困难问题中最著名的例子。

分配问题

对于可以穷举查找求解的问题,我们再举第三个例子:有n个任务需要分配给n个人执行,一个任务对应一个人(意思是说:每个任务只分配一个人,每个人只分配一个任务)。对于每一对i,j=1,2,…,n来说,将第j个任务分配给第i个人的成本是C[i,j],该问题要找出总成本最小的分配方案。
下面是该问题的一个小规模的实例,表中的数值代表的是分配成本C[i,j]

很容易发现,分配问题的实例完全可以用它的成本矩阵C来表示。就这个矩阵来说,这个问题要求在矩阵的每一行中选出一个元素,这些元素分别属于不同的列,而且元素的和是最小的。请注意,求解该问题并没有一个显而易见的策略。例如,我们不能选择每行中的最小元素,因为这些元素可能属于同一列。实际上,整个矩阵的最小元素并不一定是最优解的一部分。下面是上面例子的答案:

由于在分配问题的一般情况下,需要考虑的排列数量是n!,所以除了该问题的一些规模非常小的实例,穷举查找法几乎不实用。幸运的是,对于该问题有一个效率高得多的算法,叫匈牙利方法。

笔者打算先把穷举的情况先了接了,再深入后面的改良,穷举算法的改进版后续会再做补充

穷举查找之旅行商问题、背包问题、分配问题相关推荐

  1. 【算法设计zxd】第四章蛮力法 1.枚举法 02穷举查找

    目录 蛮力法(brute force): [例4-1]链环数字对  问题分析  计算模型 pair_digital(int n): 代码: [例4-2]解数字迷: 思考题:ACM预测:​ 问题分析 ...

  2. 旅行商问题穷举算法c语言,什么是旅行商问题——算法NP、P、NPC知识

    旅行商问题 旅行商问题所描述的是这样一个场景: 有一个商品推销员,要去若干个城市推销商品.该推销员从一个城市出发,需要经过所有城市后,回到出发地.每个城市之间都有道路连通,且距离各不相同,推销员应该如 ...

  3. 【算法】最直接的算法——穷举法详解

    第三章 穷举法 一.基本概念 穷举法又称为枚举法或者蛮力法,是一种简单直接解决问题的方法,常常是基于问题的直接描述去编写程序,比如说求n的阶乘,那么就直接一个循环n次的for循环. 穷举法依赖的基本技 ...

  4. 任务分配的穷举法、匈牙利法、分支定界法

    1.(必做)任务分配问题.设有 4 项任务 B1.B2.B3.B4,派 4 个人 A1. A2.A3.A4 去完成.每个人都可以承担 4 项任务中的任何一项,但所消耗的资金不同.设 Ai 完成 Bj ...

  5. java递归实现汉字组词穷举_01背包各种算法代码实现总结(穷举,贪心,动态,递归,回溯,分支限界)...

    2020-05-22 所有背包问题实现的例子都是下面这张图 01背包实现之--穷举法: 1.我的难点: (1)在用穷举法实现代码的时候,我自己做的时候认为最难的就是怎么将那么多种情况表示出来,一开开始 ...

  6. 《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)

    1.对于计算机学科的人员,无论是怎么样子的工作都是需要了解算法的-----从而获得解决日常问题的基本的思路 2.计算机底层的数理计算逻辑仍然是"与""或"&qu ...

  7. 【最优化方法】穷举法 vs. 爬山法 vs. 模拟退火算法 vs. 遗传算法 vs. 蚁群算法

    一. 穷举法 列举所有可能,然后一个个去,得到最优的结果.如图一,需要从A点一直走到G点,才能知道,F是最高的(最优解).这种算法得到的最优解肯定是最好的,但也是效率最低的.穷举法虽然能得到最好的最优 ...

  8. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  9. java获取数组穷举_被BAT疯抢的Java工程师,都是怎么拿到年薪50W的offer

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名遭到BAT疯抢的架构师. 那么遭到BAT疯抢的架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员也是工作三五年之 ...

  10. 用vc++穷举windows应用程序密码

    一.引言 随着计算机信息技术的发展,人们越来越重视信息的安全性,信息数据的安全保密已经成为影响计算机发展的一个重要课题.机密文件.商业情报.银行账号.网络密码.科技成果.包括私人信件等等,都成了用户为 ...

最新文章

  1. 如何使用深度学习训练聊天机器人
  2. 走出“搜索引擎营销”三个误区
  3. maven 打包jar_Maven一定要会的这几个知识!
  4. 【学习笔记】第二章——进程同步、进程互斥、进程互斥的硬件/软件实现方法
  5. SAP Java Connector(JCo)
  6. ShotCut——视频处理剪辑神器
  7. 高效管理CrossOver容器里的程序
  8. [CTSC1999][网络流24题]家园
  9. 【测试】对网易邮箱登录的测试流程
  10. 几何分布的期望和方差公式推导_常用概率分布总结(1)
  11. 苹果电脑安装双系统教程(使用bootcamp手动完成/MacOS X+Windows10双系统)
  12. New Year Snowmen codeforces 140C
  13. 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)
  14. 基于PHP+MySQL托管中心管理系统的设计与实现#计算机毕设
  15. C++——素数(质数)专题训练
  16. 20175227张雪莹 2018-2019-2 《Java程序设计》第五周学习总结
  17. 【墨者学院】WebShell文件上传漏洞分析溯源(第3题)
  18. word 直接插入参考文献,不借助插件
  19. linux 串口连接交换机,怎么用串口线连接电脑和交换机 连接步骤教程
  20. JS(JavaScript)

热门文章

  1. 计算机桌面搜狗输入图标不见了怎么办,win7搜狗输入法不见了怎么办
  2. 360中不显示html中图片不显示图片,360极速浏览器无法显示图片解决方法详解
  3. Maya材质球与渲染基础--Redshift,Arnold,Xgen
  4. html设置请求头host,Http请求头Host字段作用
  5. 十个你必须知道的ps技巧
  6. python为在线漫画站点自制非官方API(未完待续)
  7. PythonR LEfSe 分析
  8. 注塑模具设计的技术知识汇总
  9. 程序员出海创富的机会在哪里?三位专家给出具体建议
  10. java微信昵称处理_Java微信开发昵称表情符过滤