旅行推销员分而治之C ++

我正在尝试实施分而治之算法来解决旅行商问题。 我将问题分为几个小部分,但我不知道下一步该怎么做。

这是我的代码:

struct coordinate
{
    float x;
    float y;
};

vector<coordinate> coordinates; //Please assume it is filled with random coordinates

void DivideAndConquer(int divide)
{
    vector<vector<coordinate>> routes;
    vector<coordinate> empty;
    int check = 0;


    for (int i = 0; i < coordinates.size(); i++)
    {   
        if (i == divide * check)
        {
            check++;
            routes.push_back(empty);
        }
        routes[check - 1].push_back(coordinates[i]);
    }

    //What now?
}

我还实现了计算距离的方法:

float Distance(coordinate first,coordinate second)
{
    return sqrt(pow(second.x - first.x,2) + pow(second.y - first.y,2) * 1.0);
}

float RouteDistance(vector<coordinate> route,bool returnBack)
{
    float totalDistance = 0;
    for (int i = 1; i < route.size(); i++)
    {
        totalDistance += Distance(route[i-1],route[i]);
    }
    if (returnBack) totalDistance += Distance(route[0],route[route.size() - 1]);

    return totalDistance;
}

我也写了蛮力算法,我相信它可以用于分而治之。 它只是返回给定坐标矢量的最佳路径。

vector<coordinate> BruteForce(vector<coordinate> route)
{

    vector<int> turn;
    for (int i = 0; i < route.size(); i++) turn.push_back(i);

    int currentBestDistance = RouteDistance(route,true);
    vector<coordinate> currentBestRoute = route;

    do
    {
        vector<coordinate> newRoute;
        int newRouteDistance;

        for (int e : turn)
        {
            newRoute.push_back(route[e]);
        }
        newRouteDistance = RouteDistance(newRoute,false);

        if (newRouteDistance < currentBestDistance)
        {
            currentBestRoute = newRoute;
            currentBestDistance = newRouteDistance;
        }

    } while (next_permutation(turn.begin(),turn.end()));

    return currentBestRoute;
}

在DivideAndConquer中,当前将坐标矢量划分为子矢量的大小,该子矢量的大小称为“ divide”参数,我们称之为“

”。 例如,假设这是我们的坐标:

10 20
23 54
98123
55 72
16 82

我们称之为“ DivideAndConquer(2)”
结果:

10 20
23 54

98 123
55 72

16 82

iCMS 回答:旅行推销员分而治之C ++

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2230671.html

大家都在问