- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在 Java 中找到旅行商问题的解决方案。我已经应用模拟退火通过以下方式解决这个问题。这是我实现模拟退火的代码段:
public class SimulatedAnnealing {
// Calculate the acceptance probability
public static double acceptanceProbability(int energy, int newEnergy, double temperature) {
// If the new solution is better, accept it
if (newEnergy < energy) {
return 1.0;
}
// If the new solution is worse, calculate an acceptance probability
return Math.exp((energy - newEnergy) / temperature);
}
public static void main(String[] args) {
// Create and add our cities
City city = new City(60, 200);
TourManager.addCity(city);
City city2 = new City(180, 200);
TourManager.addCity(city2);
City city3 = new City(80, 180);
TourManager.addCity(city3);
City city4 = new City(140, 180);
TourManager.addCity(city4);
City city5 = new City(20, 160);
// Set initial temp
double temp = 10000;
// Cooling rate
double coolingRate = 0.003;
// Initialize intial solution
Tour currentSolution = new Tour();
currentSolution.generateIndividual();
System.out.println("Initial solution distance: " + currentSolution.getDistance());
// Set as current best
Tour best = new Tour(currentSolution.getTour());
// Loop until system has cooled
while (temp > 1) {
// Create new neighbour tour
Tour newSolution = new Tour(currentSolution.getTour());
// Get a random positions in the tour
int tourPos1 = (int) (newSolution.tourSize() * Math.random());
int tourPos2 = (int) (newSolution.tourSize() * Math.random());
// Get the cities at selected positions in the tour
City citySwap1 = newSolution.getCity(tourPos1);
City citySwap2 = newSolution.getCity(tourPos2);
// Swap them
newSolution.setCity(tourPos2, citySwap1);
newSolution.setCity(tourPos1, citySwap2);
// Get energy of solutions
int currentEnergy = currentSolution.getDistance();
int neighbourEnergy = newSolution.getDistance();
// Decide if we should accept the neighbour
if (acceptanceProbability(currentEnergy, neighbourEnergy, temp) > Math.random()) {
currentSolution = new Tour(newSolution.getTour());
}
// Keep track of the best solution found
if (currentSolution.getDistance() < best.getDistance()) {
best = new Tour(currentSolution.getTour());
}
// Cool system
temp *= 1-coolingRate;
}
System.out.println("Final solution distance: " + best.getDistance());
System.out.println("Tour: " + best);
}
}
当我用上面的方法做完TSP问题后,发现图中有很多叉,听说2-Opt Arithmetic可以解决这个问题。基本上,我想创建两个顶点的 Tours,或者基本上是一组独特的边。现在对于每对唯一的边 (x,y) 和 (u,v),如果成本 (x,y) + 成本 (u,v) < 成本 (x,u) + 成本 (y,v),则我将在 (x,u) 和 (y,v) 上使用边 (x,y) 和 (u,v)。我将对每对独特的边重复这个过程,直到成本不降低。
但是我如何找到唯一的一对边来应用 2-opt 技术呢?我的意思是,如果我之前生成一个解决方案(如上面的代码),我将如何在解决方案中找到交叉边缘(我需要检查应用 2 opt 的边缘)?
最佳答案
2-Opt 可以实现为子巡回反转。
int[] tour= new int[]{1,2,3,6,5,4,7,8,9};
List<int[]> neighboors = new ArrayList<int[]>();
for (int i = 0; i<tour.length; ++i) {
for (int j = i+1; j<tour.length; ++j) {
neighboors.add(opt2(tour,i,j));
}
}
function int[] opt2(tour, i,j) {
int n = tour.length;
int d = Math.abs(j-i);
if (j<i) return null;//or fix it
d = (d+1)/2;//d+1==element count... /2 === number of pairs to swap
for (int k = 0; k <d; k++) {
//swap tour[i+k] and tour[j-k]
}
}
opt2(tour,3,5)={1,2,3,4,5,6,7,8,9}
这交换边 (3,6)
和 (4,7)
与 (3,4)
和 (6,7)
。 opt2(tour,2,6)={1,2,7,4,5,6,3,8,9}
交换边 (2,3)
和 (7,8)
与 (2,7)
和 (3,8)
请注意,您无需考虑围绕数组的开头或结尾进行反转。 {"reverse beginning", "keep the same", "reverse ending"}
因为它和 reverseTheWholeArray({"keep the same", "reverse the middle", "keep相同的"})
。即{1,2,3,4}
的游览与{4,3,2,1}
相同。
现在有趣的部分是意识到 3-Opt 可以通过游览“轮换”和反转来实现 >:) 或最多 3 次反转。
关于java - 2 最优求解TSP的opt算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36753923/
遗传算法解决旅行商问题 作者:Cukor丘克 环境:MatlabR2020a + vscode 问题描述 旅行商问题(TSP). 一个商人欲从自己所在的城市出发,到
完全有向图上的旅行商问题是否存在多项式时间算法? 最佳答案 不太可能。如果有的话,您可以采用任何图形并添加所有具有非常高权重的缺失边。这将允许解决问题的标准版本,已知该问题是 NP 难的。 关于gra
我正在使用 R 中的 TSP 包解决旅行推销员问题,但试图实现预定的起点和终点。 该软件包显然允许设置旅程的起点,如下所述: How to specify a starting city using
我是 Java 新手,正在尝试获取多个城市之间的最短路径。 从某个点(城市)开始,经过所有其他城市,结束在同一城市 从 JSON 文件解析日期: { "city": "City1", "latitud
我需要编写诸如旅行推销员问题之类的程序,但带有节点。我需要获得较少错位的金额。 我不知道如何使用玻尔兹曼常数实现模拟退火算法。 我已经编写了第一部分的代码: `导入java.util.ArrayLis
为学校做一个项目,我们实现最近邻启发式算法(我已经完成了),以及旅行推销员问题,我们进行详尽的搜索(然后我们分析算法、它们的时间复杂度等)。我们的老师说要四处寻找用于穷举搜索部分的代码(或修改),而不
我正在使用 C 语言中的蚁群优化来解决 TSP 问题。我认为我的实现是正确的,但我的程序不起作用。我知道我的代码中存在内存问题,因为当我运行程序时,控制台会写“核心已转储”。我使用 gdb 来查找错误
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
在其他帖子中,Networkx 被建议为“我的 friend ”。但是对于 TSP 问题的特定解决方案,似乎没有现成的可用函数。即 Creating undirected graphs in Pyth
我正在使用一段代码来使用动态编程实现 TSP。我找到了这段代码,但无法弄清楚 compute() 函数及其工作原理。我不知道变量是什么,也不知道它是如何计算路径的。非常感谢任何帮助。 #include
我正在努力实现一个基于模拟退火的程序来解决旅行商问题。我得到的所有解决方案都不令人满意,我不知道如何改进我的实现。显然我不是在关注基准测试,而只是在寻找视觉上可接受的最短路径。如果有人可以启发我,我将
我正在尝试用机票解决旅行商问题,所以主要思想是从一个机场开始,只访问所有机场一次,然后返回原点。 举个例子:从洛杉矶国际机场出发访问 LV、CA、NY结束 LAX。 这是一个经典的图形问题,我们可以将
我想问一下如何在自组织映射 (SOM) 中实现 TSP。 SOM 算法/工作如何获取 TSP 路径的结果? 最佳答案 旅行商问题 (TSP) 是一个优化问题。有许多算法试图解决 TSP,包括像遗传算法
TSP 的成本函数如何运作?假设我有一个距离为 100 的游览,我稍微更改了游览,对原始游览进行了 4 次更改,现在它的距离为 50。 成本函数会给我 4,因为那是变化的数量;还是 50,因为距离的变
我正在尝试解决一个包含大约 10,000 个城市的非常大的 TSP。为了并行化我的任务,我想将这些城市划分为集群并为每个集群解决 TSP。 我想要一种可以将我的城市分成集群的方法(基于城市密度/该集群
我一直在尝试弄清楚如何使用回溯来解决 TSP。如何计算“成本”? 矩阵: ∞ 20 30 10 11 15 ∞ 16 4 2 3 5 ∞ 2 4 19 6
解决 TSP 问题的最常见启发式方法(特别是 Kernighan–Lin 启发式方法)需要处理随机生成的路线并从中改进解决方案。然而,我想出的唯一方法是生成顶点的随机排列并检查它是否是一个解决方案。
我正在尝试使用分支定界算法解决 TSP。 我必须建立一个包含成本的矩阵,但我遇到了这个问题:我有坐标为 x 和 y 的城市。 旅行的费用是 ceil(ceil(sqrt((x1-x2)^2+(y1-y
我希望在 Java 中实现模拟退火算法,以找到 Travelling Salesman Problem 的最佳路径。 ,到目前为止,我已经实现了蛮力,并希望修改该代码以使用模拟退火。显然,蛮力和模拟退
我无法理解为什么该算法不返回 TSP 的最短路径。 vector tsp(int n, vector >& cost) { long nsub = 1 > opt(nsub, vector(n)
我是一名优秀的程序员,十分优秀!