我正在尝试解决汉密尔顿路径问题的稍微修改的版本。对其进行了修改,因为已将起点和终点提供给我们,而不是确定解决方案是否存在,我们希望找到解决方案的
数量 (可以为0)。
该图以二维数组的形式提供给我们,节点是数组的元素。另外,我们只能水平或垂直移动,而不能对角移动。不用说,我们不能从一个城市到两个城市,因为要做到这一点,我们将需要两次访问一个城市。
我写了一个蛮力解决方案,尝试在每个节点上尝试所有4个(边缘节点为3或2)可能的移动,然后计算解决方案的数量(达到目标并看到所有其他节点时),但是它在大小适中的输入(例如7x7阵列)上运行了可笑的时间。
我也考虑过使用双向搜索,因为我们知道目标,但这并没有真正的帮助,因为我们不仅希望满足这些要求,而且还希望确保已访问所有节点。而且,可能是当两个条纹之间的所有节点都用尽时,它们以无法连接的方式结束。
我觉得有些事情我不知道,这使我只能解决蛮力问题。我知道问题本身是NP完全的,但是我想知道在蛮力方面是否有任何改进。有人可以提出其他建议吗?
- 编辑 -
我提到使用双向搜索并没有真正的帮助,我想阐明为什么会这样。考虑一个2x3图,左上角和右下角分别是起点和目标。让双向搜索的边缘从目标向右移动,从目标向左移动。经过2步移动后,所有节点都将被访问,但是无法加入边缘,因为我们只能从一个节点沿一个方向前进。但是,正如大卫在下面的回答中指出的那样,可能可以对算法进行一些修改。
根据Wolfram Alpha的说法,
…确定给定一般图是否具有哈密顿路径的唯一已知方法是进行详尽搜索
我相信您会想从找到一条哈密顿路径开始,然后将其分为两条路径,使分割点尽可能清楚地将两条路径分开。然后,您可以在子图中找到排列(当然还有递归!)
我不知道确切的算法,但是那种分而治之的方法就是我要开始的地方。
本文向大家介绍欧拉路径和哈密顿路径,包括了欧拉路径和哈密顿路径的使用技巧和注意事项,需要的朋友参考一下 如果您可以在所有顶点之间绘制一条路径而无需重新绘制同一条路径,则该图形是可遍历的。基于此路径,本章将介绍一些类别,例如欧拉路径和欧拉电路。 欧拉之路 欧拉路径仅包含一次“ G”的每个边缘,至少包含一次“ G”的每个顶点。连通图G如果包含欧拉路径,则被认为是可遍历的。 示例 欧拉路径= dcabd
哈密顿通路(回路)与哈密顿图(Hamilton图)通过图G的每个结点一次,且仅一次的通路(回路),就是哈密顿通路(回路)。下面总结四个定义,帮助大家理解。 一、哈密顿图定义 通过图中所有顶点一次且仅一次的通路称为哈密顿通路。 通过图中所有顶点一次且仅一次的回路称为哈密顿回路。 具有哈密顿回路的图称为哈密顿图。 具有哈密顿通路而不具有哈密顿回路的图称为半哈密顿图。 (1)哈密顿通路 设G=《V,E》
我在JavaFX中创建了一个迷宫游戏,用户可以创建自己的迷宫并玩它。迷宫是使用带有CSS IDs的按钮构建的,CSS IDs取决于关卡临时存储的二维数组。 问题出现在项目的下一部分。我创建了一个生成随机迷宫的算法。为了使水平成为可能,我需要检查迷宫是否可解(即,你可以从起点(0,3)到终点(6,3))。 我使用相同的显示算法创建了一个单独的项目,类如下: 主要.java Runner.java M
我有图1(第一个图像)中的一个图,并且希望连接红色节点以获得循环,但是循环不一定要像图2和图3(最后两个图像)那样是哈密顿的。这个问题比TSP有更大的搜索空间,因为我们可以访问一个节点两次。与TSP一样,不可能在一个大图中计算所有的组合,我应该尝试启发式,但问题是,与TSP不同,循环或巡回的长度在这里不是固定的。因为,访问所有的蓝色节点并不是强制性的,这导致包括一些蓝色节点在内的长度可变。如何每次
你好,亲爱的朋友们。 我想在随机图中找到最短路径。我使用boost图形库。据我所知,我需要利用点之间的现有距离构建图形。之后,我需要使用一些算法。。。 正如我所见,Dijkstra的算法实际上是找到从1点到其他点的所有路径。(应该很慢?) A*需要一些额外的数据(不仅仅是距离) 如何找到2点之间的最短路径?我在bgl文件夹中看到了许多最短路径算法标头,但我没有找到如何使用它们的示例。 此外,我可以
主要内容:哈希表是什么,哈希查找算法哈希查找算法又称 散列查找算法,是一种借助哈希表(散列表)查找目标元素的方法,查找效率最高时对应的时间复杂度为 O(1)。 哈希查找算法适用于大多数场景,既支持在有序序列中查找目标元素,也支持在无序序列中查找目标元素。讲解哈希查找算法之前,我们首先要搞清楚什么是哈希表。 哈希表是什么 哈希表(Hash table)又称 散列表,是一种存储结构,通常用来存储多个元素。 和其它存储结构(线性表、树等)
我有一个无向图,我想从一个起始节点列出所有可能的路径。2个节点之间的每个连接在列出的路径中是唯一的,例如,给出以下图表示: 我无法使用现有的算法来完成它,我知道像DFS。任何帮助都将非常感谢。
处理以下问题(https://leetcode.com/problems/friend-circles/): 一个班有N个学生。他们有些是朋友,有些不是。他们的友谊本质上是可传递的。比如A是B的直接好友,B是C的直接好友,那么A就是C的间接好友,而我们定义的朋友圈就是一群直接或者间接好友的同学。 给定一个N*N矩阵M,表示班级学生之间的朋友关系。如果M[i][j]=1,则第i和第j个学生是彼此的直