C# 用递归法寻找最便宜的道路
我需要使用递归找到最便宜的道路。C# 用递归法寻找最便宜的道路,c#,algorithm,recursion,C#,Algorithm,Recursion,我需要使用递归找到最便宜的道路。道路从点1开始,需要穿过所有其他点(2,3,4,5),然后返回点1。每个点之间的行程成本在二维数组(map)中 这意味着,例如,从第1点到第5点,有2个“金钱”成本,从第5点到第4点,成本是7。每次你在地图上切换“方向”。我认为尝试次数应该等于25(4!+1) void FindingRoad(int[][]地图,int[]指针排序器,ref int tripCost,ref int尝试次数) { 如果(尝试次数==0) { 返回; } int-tempCost=
道路从点1开始,需要穿过所有其他点(2,3,4,5),然后返回点1。每个点之间的行程成本在二维数组(map)中 这意味着,例如,从第1点到第5点,有2个“金钱”成本,从第5点到第4点,成本是7。每次你在地图上切换“方向”。我认为尝试次数应该等于25(4!+1)
void FindingRoad(int[][]地图,int[]指针排序器,ref int tripCost,ref int尝试次数)
{
如果(尝试次数==0)
{
返回;
}
int-tempCost=0;
int[]tempPointsOrder=新int[5];
对于(int i=0;i<5;i++)
{
对于(int j=0;j<5;j++)
{
}
}
如果(tempCost是一个已知的优化问题,这意味着它不太可能接受一个有效的优化算法。也就是说,可以使用在指数运行时间范围内解决它。可以找到这样的算法,或者(在最近的出版物中).有3个主要功能。第一和第二个功能用于创建所有可能的道路,第三个功能用于计算其成本。希望对您有所帮助
static void AllRoads(int[] a, int size, int n, RoadContainer VisiKeliai, int[][]map)
{
// if size becomes 1 then prints the obtained
// permutation
if (size == 1)
printArr(a, n, VisiKeliai,map);
for (int i = 0; i < size; i++)
{
AllRoads(a, size - 1, n, VisiKeliai,map);
// if size is odd, swap first and last
// element
if (size % 2 == 1)
{
int temp = a[0];
a[0] = a[size - 1];
a[size - 1] = temp;
}
// If size is even, swap ith and last
// element
else
{
int temp = a[i];
a[i] = a[size - 1];
a[size - 1] = temp;
}
}
}
static void printArr(int[] a, int n, RoadContainer VisiKeliai, int[][]map)
{
string s = "0";
// Console.WriteLine("dassaddsasdaasdas" + a.Length);
for (int i = 0; i < n; i++)
{
// Console.Write(a[i] + " ");
s += Convert.ToString(a[i]);
}
s = s.Insert(s.Length, "0");
Road r = new Road(s);
CalculatingPrice(r, map);
VisiKeliai.AddRoad(r);
//Console.WriteLine(s);
}
public static void CalculatingPrice(Road Kelias, int[][] map)
{
// 021430 Road im checking
Console.WriteLine("Kelias: " + Kelias.Path);
for (int i = 0; i < Kelias.Path.Length - 1; i++)
{
int nextI = i + 1;
for (int j = 0; j < 5; j++)
{
for (int m = 0; m < 5; m++)
{
string a = Convert.ToString(m);
string aaa = Convert.ToString(Kelias.Path[i]);
string b = Convert.ToString(j);
string bbb = Convert.ToString(Kelias.Path[nextI]);
if (a == aaa && b == bbb)
{
Console.WriteLine(a + "--" + aaa + "---" + b + "----" + bbb + "-------------" + map[j][m]);
Kelias.Cost += map[j][m];
}
}
}
}
}
static void AllRoads(int[]a,int size,int n,RoadContainer VisiKeliai,int[]map)
{
//如果大小变为1,则打印获得的
//排列
如果(大小==1)
printArr(a、n、VisiKeliai、map);
对于(int i=0;i
这是我理解TSP的第一步,但所有这些公式对我来说都太难理解函数应该是什么样子:/
void FindingRoad(int[][] map, int[] pointsOrder, ref int tripCost, ref int attempts)
{
if (attempts == 0)
{
return;
}
int tempCost = 0;
int[] tempPointsOrder = new int[5];
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
}
}
if (tempCost<tripCost)
{
tripCost = tempCost;
pointsOrder = tempPointsOrder;
}
attempts--;
FindingRoad(map,pointsOrder,ref tripCost,attempts);
}
static void AllRoads(int[] a, int size, int n, RoadContainer VisiKeliai, int[][]map)
{
// if size becomes 1 then prints the obtained
// permutation
if (size == 1)
printArr(a, n, VisiKeliai,map);
for (int i = 0; i < size; i++)
{
AllRoads(a, size - 1, n, VisiKeliai,map);
// if size is odd, swap first and last
// element
if (size % 2 == 1)
{
int temp = a[0];
a[0] = a[size - 1];
a[size - 1] = temp;
}
// If size is even, swap ith and last
// element
else
{
int temp = a[i];
a[i] = a[size - 1];
a[size - 1] = temp;
}
}
}
static void printArr(int[] a, int n, RoadContainer VisiKeliai, int[][]map)
{
string s = "0";
// Console.WriteLine("dassaddsasdaasdas" + a.Length);
for (int i = 0; i < n; i++)
{
// Console.Write(a[i] + " ");
s += Convert.ToString(a[i]);
}
s = s.Insert(s.Length, "0");
Road r = new Road(s);
CalculatingPrice(r, map);
VisiKeliai.AddRoad(r);
//Console.WriteLine(s);
}
public static void CalculatingPrice(Road Kelias, int[][] map)
{
// 021430 Road im checking
Console.WriteLine("Kelias: " + Kelias.Path);
for (int i = 0; i < Kelias.Path.Length - 1; i++)
{
int nextI = i + 1;
for (int j = 0; j < 5; j++)
{
for (int m = 0; m < 5; m++)
{
string a = Convert.ToString(m);
string aaa = Convert.ToString(Kelias.Path[i]);
string b = Convert.ToString(j);
string bbb = Convert.ToString(Kelias.Path[nextI]);
if (a == aaa && b == bbb)
{
Console.WriteLine(a + "--" + aaa + "---" + b + "----" + bbb + "-------------" + map[j][m]);
Kelias.Cost += map[j][m];
}
}
}
}
}