所以我使用动态编程方法在C#中实现了一个旅行推销员算法,但在研究了众所周知的伪代码后,我什么都没学到。至少我是这么认为的。不过,这里是我的代码的一瞥,如果有人帮我解释C(S,k)函数,我会很高兴。我想我得到了它的功能,但我不太确定我的版本能做它需要做的事情。
Pseudocode (slides 25 and 26):
class TSP
{
public int cols;
public int[,] matrix;
public ArrayList solution;
(...)
}
public int C(ArrayList S, int k)
{
int min = int.MaxValue;
if (S.Count == 2)
min = matrix[0, k];
else
{
foreach (int m in S)
{
S.RemoveAt(k);
if (C(S, m) + matrix[m, k] < min)
min = C(S, m) + matrix[m, k];
}
}
return min;
}
是的,我认为它应该用解决方案填充一个arraylist而不是返回一个值......
我已修改它(感谢您的建议),它看起来像:
public int MinimumRouteCostThroughNode(ArrayList RestNodes, int Node)
{
int RouteCost = int.MaxValue;
if (RestNodes.Count == 2)
{
RouteCost = matrix[0, Node];
}
else
{
RestNodes.Remove(Node);
ArrayList CopyOfRestNodes = new ArrayList(RestNodes);
foreach (int AnotherNode in RestNodes)
{
int MinimumCostThroughNodeAndAnotherNode = MinimumRouteCostThroughNode(CopyOfRestNodes, AnotherNode) + matrix[AnotherNode, Node];
if (MinimumCostThroughNodeAndAnotherNode < RouteCost)
{
RouteCost = MinimumCostThroughNodeAndAnotherNode;
}
}
}
return RouteCost;
}
当我调试程序时,它看起来很好,但是RouteCost每次都被覆盖了,我不知道怎么能得到一个变量(在每次递归时都会保持不变?如果不是那么这是否意味着我需要创建一个全局变量或将其传递给函数的定义?还是有另一种方式?
答案 0 :(得分:0)
我认为它正在进行双递归。首先在if
声明 - if (C(S, m)
...然后再在它下面。 min = C(S, m)
...应该调用一次,测试为min,然后设置min。
如果你的foreach循环改变如下:
foreach (int m in S)
{
S.RemoveAt(k);
var recurse = C(S, m) + matrix[m, k];
if (recurse < min)
min = recurse;
}