C++ 需要找到最小距离并制定路线
图表: 以及各点之间的连接方式: 点如何连接的文件是我的输出。预期输出应该是C++ 需要找到最小距离并制定路线,c++,c++11,visual-c++,C++,C++11,Visual C++,图表: 以及各点之间的连接方式: 点如何连接的文件是我的输出。预期输出应该是1216、23157 115157,然后是115216。顺序不重要,但这些点应该以这种方式连接 让我问你一个问题。 我有以下代码: for (int i = 0; i < values.size()-1;i++) { int result = 0; double Min2 = DBL_MAX; int x = 0; for (int j =
1216、23157 115157
,然后是115216
。顺序不重要,但这些点应该以这种方式连接
让我问你一个问题。
我有以下代码:
for (int i = 0; i < values.size()-1;i++)
{
int result = 0;
double Min2 = DBL_MAX;
int x = 0;
for (int j = i+1; j < values.size(); j++)
{
/*if (visited[j] == false)*/
{
distance = sqrt(pow((values[i].x2 - values[j].x2), 2) + pow((values[i].y2 - values[j].y2), 2));
if (distance < Min2 && distance != 0)
{
Min2 = distance;
x = j;
}
}
}
for(int i=0;i
如果你看图表,左边的第一个节点是1,然后是216,然后是115,然后是157,然后是23。除了216-115之外,我有右边的连接,但它没有连接216-157。为什么它会忽略或者最小距离没有帮助。我试着使用标志(比如是否访问)同样的结果。所有节点都工作,只是这个节点不希望连接正确。代码的逻辑似乎有点奇怪
for (int i = 0; i < values.size()-1;i++) {
int result = 0;
double Min2 = DBL_MAX;
int x = 0;
for (int j = i+1; j < values.size(); j++) {
a将b作为最近的节点,(碰巧)b也将a作为最近的节点,但c将b作为最近的节点,您将错过此连接
此外,在i+1
处开始第二个循环似乎有些奇怪,因为它假设向量中的点已经排序(如果是这种情况,那么搜索最近节点的意义是什么?)
如果您已经知道节点位于一条路线上,那么我会这样做:
1) 从路由中的第一个节点n0
开始(如果您不知道该节点,则会有点复杂)
2) 找到距离n0
最近的节点,调用它n1
3) 继续在尚未连接到路由的节点中查找距离ni
最近的节点,将其称为ni+1
4) 重复3)直到到达路线的终点
我的印象是,您不理解这些步骤与代码之间的区别。我不想放弃,因此我将尝试以不太虚假的方式再次解释:
int currentNode = startNode; // as mentioned before, if you dont know
// this its a bit more involved
std::vector<int> route;
route.push_back(currentNode);
while (currentNode != endNode) { // also knowing the last node of the route helps...
double minDistance = std::numeric_limits<double>::max();
int nextNode = -1;
for (int i=0;i<nodes.size();i++) {
if (std::find(route.begin(), route.end(), i) == route.end()){
double distance = getDistance(currentNode,i);
if (distance < minDistance) {
minDistance = distance;
nextNode = i;
}
}
}
route.push_back(nextNode);
currentNode = nextNode;
}
int currentNode=startNode;//如前所述,如果您不知道
//这有点复杂
std::向量路径;
路由。推回(当前节点);
而(currentNode!=endNode){//同时了解路由的最后一个节点有助于。。。
double minDistance=标准::数值限制::最大值();
int nextNode=-1;
for(int i=0;ifor(int i=0;i
您在问题中描述的内容(节点顺序:1->216->115->157->23)与图像“点如何连接”…“点如何连接”中的内容完全不匹配是你的代码的输出吗?第一幅图是带点的图形,第二幅图是点如何连接的。点是从1-216还是从216-1连接并不重要。主要的是,所有点都应该连接,除了115-157之外,所有点都正确连接,因为代码连接157-216你说的1->216->115->157->23这是图形表示的方式。我将这些点添加到向量中,可以先是1,然后是23,但我无法对它们进行排序,因为这是它应该的方式。想法是我需要正确连接它们,代码连接,我有更多的点,它们是正确的。预期输出是什么,预期输出是什么?预期输出应该是.1->216 23->157 115->157 115->216,可以是216->1 157->23 157->115 216->115我的输出是1->216 23->157 115->157然后是157->216它溢出了115是的,你是对的,我这么做了,但结果如下。1->216 23->157 115->157->115然后是115->216我没有使用那种方法,因为它创建的sa是我的两倍me routeAnd这就是为什么我想使用visited标志,但它提供的输出与previous@MishaOstapchuk你做了什么?(请停止滥发数字序列)好的,很抱歉你给我发了那个答案,我更改了,得到了在你回答后第一次发布的输出。我这里的问题是,它两次复制了相同的路线,不仅是这个点,还有all@MishaOstapchuk你改变了什么?我只是说我不理解你代码的逻辑,但我不能告诉你如何修复它。Alr如果您认为仅通过查找最小距离就可以创建路线,那么您的假设是错误的(请参见稍后的编辑)。
int currentNode = startNode; // as mentioned before, if you dont know
// this its a bit more involved
std::vector<int> route;
route.push_back(currentNode);
while (currentNode != endNode) { // also knowing the last node of the route helps...
double minDistance = std::numeric_limits<double>::max();
int nextNode = -1;
for (int i=0;i<nodes.size();i++) {
if (std::find(route.begin(), route.end(), i) == route.end()){
double distance = getDistance(currentNode,i);
if (distance < minDistance) {
minDistance = distance;
nextNode = i;
}
}
}
route.push_back(nextNode);
currentNode = nextNode;
}
for (int i = 0; i < values.size();i++)
{
int result = 0;
double Min2 = DBL_MAX;
int x = 0;
for (int j =0; j < values.size(); j++)
{
/*if (visited[j] == false)*/
{
distance = sqrt(pow((values[i].x2 - values[j].x2), 2) + pow((values[i].y2 - values[j].y2), 2));
if (distance < Min2 && distance != 0)
{
Min2 = distance;
x = j;
}
}
}
/*visited[i] = true;*/