java实现旅行商问题_Java中旅行商问题的强力算法

我正在学校开设一个数学课的项目,我选择在旅行商问题上做我的,我一直想调查一下.

但是,我的蛮力求解算法存在问题.

*请转到底部的更新以查看最新版本的代码

如果您知道旅行的销售人员问题是什么,请跳过此段落:

为了尽可能地总结,TSP是这样的:你是一个想要访问某个地区的每个城市的推销员(一个城市基本上是地图上的一个点).在有界x和y区域中有’n’个城市,每个城市与每个城市相连(通过直线道路).您需要在城市中找到允许您访问每个城市的最短路径.我想要使用的其中一种算法(我需要测试其他算法)是Brute Force,它检查每条可能的路线并返回最短的路线路线.这并不总是使用的原因是因为它需要我们检查(n-1)!可能的路线,随着’n’的增加,这个数字会变得很大 – 事实上,只有50个城市,那将是608281864034267560872252163321295376887552831379210240000000000路线要检查.

假设我们将在4个城市使用任意区域(尽管该算法可以处理n个城市.我们也不关心距离 – 我们希望以粗暴的方式击中每条可能的路线)力).

这是一个简单的图片演示我正在谈论的内容(4个城市是我开始检查过程是否正常工作)

这是Brute Force算法(假设所有其他被调用的方法都正常工作,因为它们可以):

(请在下方查看更多解释)

[码]

public void BruteForceFindBestRoute(Route r) //Must start r having 1 unflagged city to begin with

{

if(!r.allFlagged() && r.route.size() != m.cities.size())

{

/*STEP 1 Begin with last unflagged city*/

City pivot = r.lastCityAdded();

/*STEP 2: Flag city*/

pivot.visited = true;

/*STEP 3: Find cities "NOT IN ROUTE"*/

ArrayList citiesNotInRoute = new ArrayList();

for(int i = 0; i

{

if(!r.isCityInRoute(m.cities.get(i).name))

{

citiesNotInRoute.add(m.cities.get(i));

}

}

/*STEP 4: Recursively call BruteForceFindBestRoute() using these cities added to the end of our original route*/

for(int i = 0; i

{

Route newRoute = r;

newRoute.addToRoute(citiesNotInRoute.get(i));

BruteForceFindBestRoute(newRoute);

}

}

/*STEP 5: If the route is full but the last city isn't flagged, then flag it call BruteForceFindBestRoute() again, with the last city flagged*/

else if(!r.allFlagged() && r.route.size() == m.cities.size())

{

if(r.allFlaggedButLast())

{

Route x = r;

x.flagLastCity();

BruteForceFindBestRoute(x);

}

}

/*STEP 6: If all cities are flagged, the route is full. Check to see if it's the best route.*/

else if(r.allFlagged())

{

if(IsBestRoute(r))

bestRoute = r;

}

else

System.err.println("Error: somehow all cities got flagged, but the route isn't full");

}

这是我的逻辑:

(注意:一个城市对象有一个名为“visited”的“flag”布尔变量)

(如果所有路线都没有标记,并且路线不包含每个可能的城市)

>以1个未标记城市的路线开始.

>标记“最后一个没有标志”的城市(这个城市是“枢纽”)

>找到“NOT IN ROUTE R”的每个城市,并将其添加到新路线.

>以递归方式在每个路由上调用BruteForce方法.

(如果所有路线都没有标记,但路线包含每个城市)

>标记最后一个城市

(否则……这意味着该路线标记了每个城市并包含每个可能的城市)

>看看这是否是最短的路线 – 如果是,将其存储在全局变量中

这张图片将帮助我解释这个问题……

因此程序正确地向左侧移动.然而,在它到达底部之后,人们会期望递归跳回到步骤4,它会这样做.然而,不是R标记城市A而城市B未标记,然后在包含Aflag和B的“新路线”上递归调用自身,R现在包括所有4个城市,并且所有4个都被标记.它失败了,因为它再次将城市D添加到“newRoute”,递归地再次调用自身,并且在另一种方法中我们得到一个数组越界错误,因为我的区域中没有5个城市,但错误地是路线r中的5个城市(A,B,C,d,d).

该问题与在循环中调用递归或在递归调用中引用’r’的路由有关.

如果你知道我需要做什么,我会非常感激一些帮助.

感谢任何能帮助我的人.我会将整个项目发送给愿意提供帮助的任何人.

UPDATE

好吧,所以我试图缩短和简化我的原始方法,这就是我所拥有的:

public void BruteForceFindBestRoute(Route r, ArrayList citiesNotInRoute)

{

if(!citiesNotInRoute.isEmpty())

{

for(int i = 0; i

{

City justRemoved = (City) citiesNotInRoute.remove(0).clone();

Route newRoute = (Route) r.clone();

newRoute.addToRoute(justRemoved);

BruteForceFindBestRoute(newRoute, citiesNotInRoute);

citiesNotInRoute.add(justRemoved);

}

}

else //if(citiesNotInRoute.isEmpty())

{

if(IsBestRoute(r))

bestRoute = r;

}

}

问题是,当我们突破递归时,for循环中的变量i似乎失去了它的含义,并且循环不会继续.想法?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值