我在这个网站上阅读了很多关于完整加权图和汉密尔顿旅游主题的内容,其中一位用户询问,询问我大学的很多工作人员,但无法得到一个好的答案,我将这个问题的一个重要部分更改为如下:
问题A:给出一个完整的加权图G,找到
weights最小权重的哈密顿游.问题B:给定一个完整的加权图G和实数R,G是否具有最多R的哈密顿巡回训练?
假设有一台机器可以解决B.我们可以多少次调用B(每次给出G和实数R),用该机器解决问题A?假设G中边缘的总和达到M.
我们不能这样做,因为有无数的状态.
O(| E |)次
O(lg m)次
因为A是NP-Hard,这是无法做到的.
我读了这个文件,在第2页他写道:
a)优化问题(严格意义上):找到最优解
b)评估问题:确定最优解的价值
c)绑定问题:给定绑定B,确定最优解的值是高于还是低于B.
在接下来的两段
为了在解决b)中利用c),我们使用这样的事实:组合问题的可能值通常是离散的并且可以被认为是整数.假设我们可以在时间T内解决约束问题c)对于相应的评估问题b)人们通常知道该值在整数的某个范围[L,U]内.使用二进制搜索,我们用log |来解决评估问题 U - L | 调用绑定问题c),因此在时间T log | U - L |.
在接下来他写道:
例如:加权图上的TSP Kn =(V,E,w:E - > Reals),| V | = n,| E | = n-choose-2.用c)解决b).n个顶点图中的巡回或哈密顿循环恰好有n个边.因此,n个最长边的和S是最佳巡回长度的上限.另一方面,n个边缘的所有m个选择n子集的和是一组有限数,并且这些数中的两个中的最小非零差d定义了巡回长度的粒度.两个不同的游览具有相同的值,或者它们的长度相差至少d.因此,计算log(S/d)约束问题的二进制搜索确定最佳游览的长度(值).
我的问题是我们可以通过这种方式调整这个解决方案来选择(3)吗?
我试图在java中实现一个邻接矩阵,它将产生哈密顿循环的输出,然后可以用不同的算法解决,例如kruskurals,djikstras和2opt方法.我知道我需要一个2d阵列,但我不知道从哪里开始.我需要能够存储矩阵并将其应用于我拥有的图形,该图形目前是具有"n"个节点的圆(取决于矩阵).欢迎所有的帮助,谢谢
我有这个项目,我必须提出实现哈密顿循环的Java源代码.我在谷歌搜索,至少现在我知道汉密尔顿循环是什么,除了起始顶点之外只穿过所有顶点的路径,因为它也是最后一个顶点(告诉我,如果我错了).问题是我不知道如何实现它.基本上,我的问题是:
我从昨天开始就被这个问题困住了。不幸/幸运的是,这个问题只占我超级庞大(对我来说,一个 c++ 新手)算法的 0.5% 左右,因此需要一个现有代码库,一个可以适应并让事情正常工作的现有代码库。
我想检测并给出无向图中的所有圆圈。我的边缘没有加权。是的,我真正需要的是所有循环,即类似于有向图的所有哈密顿循环
我一直在玩boost图库,DFS算法似乎很有前途,但是,它只访问顶点一次,因此不能给出所有的哈密顿圆。
目前,我只需要代码工作,这样我就可以继续我的算法设计,之后我可能会考虑性能问题。即使是带有 5 个嵌套 for 循环的解决方案也是受欢迎的。
这是我从 boost 得到并玩过的代码,但我不知道如何记录和访问我的 back_edges 的前辈,即使解决了,boost DFS 也只会访问顶点一次:
struct detect_loops : public boost::dfs_visitor<>
{
template <class Edge, class Graph>
void back_edge(Edge e, const Graph& g) {
std::cout << source(e, g)
<< " -- "
<< target(e, g) << "\n";
}
};
int main(int,char*[])
{
typedef std::pair<int,int> Edge;
std::vector<Edge> edges;
edges.push_back(Edge(0,1));
edges.push_back(Edge(1,2));
edges.push_back(Edge(2,3));
edges.push_back(Edge(3,1));
edges.push_back(Edge(4,5));
edges.push_back(Edge(5,0));
edges.push_back(Edge(4,0));
edges.push_back(Edge(5,6));
edges.push_back(Edge(2,6));
typedef adjacency_list<
vecS, vecS, undirectedS, no_property,
property<edge_color_t, default_color_type>
> graph_t;
typedef …Run Code Online (Sandbox Code Playgroud) 代码堵塞问题如下:
您将获得一个包含N个节点和K"禁止"边缘的完整无向图.N <= 300,K <= 15.在图中找出不使用任何K"禁止"边的哈密顿循环数.
不幸的是,这里对堆栈和整个网络的解释是非常不充分的.我可以找出HamCycles的某个'n':( n-1)!/ 2.
我可以通过动态编程做短集.
但我没有得到博洛尼亚的所有子集,如何使它成为O ^ K?我是Python的,还没有破译可用的C++.最后我确定我会花时间学习C++,然后我会解读它.但与此同时,为什么有人不能在网络上的某个地方更好地解释这一点?它们总是一半的解释.
我认为汉密尔顿循环问题可归纳如下:
给定一个无向图
G = (V, E),哈密顿量电路是一次G通过每个顶点G一次而不是一次.
现在,我想做的是减少我的问题.我的问题是:
给定的加权无向图
G,整数k,和顶点u, v都在G,有在一个简单的路径G从u到v具有至少总重量k?
因此,要知道哈密顿循环问题是NP完全的,通过将这个问题简化为哈密顿量,这个问题也被证明是NP完全的.我的问题是将它减少为哈密顿量的函数.
对于(1),我正在考虑通过一个图表,其中所有简单的路径总重量不超过k.对于(2),我认为这不是一个问题,因为如果存在哈密顿循环,则从u到v的简单路径可以从中切除.
所以,我真正的问题是:
谢谢!
首先是一些定义:
定义1
如果对于每对非相邻顶点u和v,则d =(V,E)被称为"密集",d(u)+ d(v)> = n其中n = | V | 和d(*)表示顶点的程度*
定义2
G上的"哈密顿循环"是一个顶点序列(vi1,vi2,...... vin,vi1),所有l!= h的vil!= vih和{vil,vil}是G的边缘.
问题是:编写一个程序,给定一个密集的无向图G =(V; E)作为输入,确定G是否允许G上的哈密顿循环并输出该循环(如果有),或输出"N"如果没有.
我的解决方案是找到从源开始的所有可能路径,并检查是否存在返回此源的路径.不幸的是,这种解决方案效率不高.
有什么建议?谢谢.
假设有一个有向图由以下命名的顶点组成:
"ABC", "ABD", "ACB", "ACD", "ADB", "ADC", "BAC", "BAD",
"BCA", "BCD", "BDA", "BDC", "CAB", "CAD", "CBA", "CBD",
"CDA", "CDB", "DAB", "DAC", "DBA", "DBC", "DCA", "DCB"
Run Code Online (Sandbox Code Playgroud)
这些是4个不同字母的3个字母排列.(total = 4*3*2=24)顶点名称还描述它们之间的边.如果源的最后两个字符等于目标的前两个字符,则任何两个顶点相互连接
甲BC - > BC d
要么
D CB - > CB A.
该图与De Burjin或Kautz非常相似,但不相同.它有很强的联系,我知道它有汉密尔顿循环.
为了解决这个问题,我不是算法方面的专家,我只是通过最新的boost图库找到了hawick_unique_circuits()函数,它枚举了所有周期,这里是我的示例代码:
#include <iostream>
#include <cstdint>
#include <vector>
#include <string>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/hawick_circuits.hpp>
#include "combination.hpp" // from http://howardhinnant.github.io/combinations.html
using namespace std;
using namespace boost;
typedef boost::adjacency_list<vecS, vecS, directedS, no_property, property<edge_weight_t, uint32_t> > TGraph;
TGraph m_Graph; …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,其X和Y坐标点如下:
structure(list(X = c(666L, 779L, 176L, 272L, 232L, 74L, 928L,
667L, 1126L, 919L), Y = c(807, 518, 724, 221, 182, 807, 604,
384, 142, 728)), .Names = c("X", "Y"), row.names = c(NA, 10L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
我只是想找出连接所有这些点的最短路径,并返回它的总距离.没有其他条件:每个点都可以连接到任何其他点,没有特定的点开始或结束,没有权重等...我发现了很多关于igraph包的主题但我无法弄清楚如何提供我的数据进去.发现这个但不是R语言.也许一个"蛮力"剧本会很好,因为我得到的分数不超过20分..谢谢
graph ×4
algorithm ×3
graph-theory ×2
java ×2
boost ×1
boost-graph ×1
c++ ×1
igraph ×1
np ×1
np-complete ×1
r ×1