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;i
for(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;*/