2

(もっといいタイトルが思いついたら教えてください。)

私はルート最適化プログラムに取り組んでいます。ルートに含める必要があるポイントのリストから始めます。私の最初のステップは、すべての可能なルート (順列) のリストを作成することです。次に、可能なルートをすべて削除します (たとえば、ある停留所が別の停留所より前にある必要がある場合)。それが完了したら、考えられる各ルートで、各ポイント間の距離と時間を計算します。各ポイントはオブジェクト (TPoint) であり、すべての距離と時間の値は TData という別のクラスに格納され、TData は TPoint の各インスタンスに格納されます。私の問題は次のとおりです。たとえば、最初の停留所で TData を更新しようとすると、最初の可能なルートで TData が更新され、可能な各ルートで同じ TPoint が更新されます。これは、クラスが参照型であり、ヒープに格納されるためです。各 TPoint に TData を格納できるソリューションを探しています。

以下にサンプル コードを示します (次のコードは、1 つのオブジェクト (TPoint) を変更するときに、実際には参照を使用してヒープ上のオブジェクトを変更する方法を示しています)。

主要

// Let's create a list of points we need to hit.
List<TPoint> lstInitial = new List<TPoint>();
lstInitial.Add(new TPoint("A", new TData(-1, -1)));
lstInitial.Add(new TPoint("B", new TData(-1, -1)));
lstInitial.Add(new TPoint("C", new TData(-1, -1)));

// Now let's get all possible routes
IList<IList<TPoint>> lstPermutations = Permutations(lstInitial);

// Let's write these values to the first point, in the first possible route.
lstPermutations[0][0].oTData.distance = 10;
lstPermutations[0][0].oTData.minutes = 20;

foreach (IList<TPoint> perm in lstPermutations)
{
    foreach (TPoint p in perm)
    {
        Response.Write(p.id + "|" + p.oTData.distance + "|" + p.oTData.minutes);
        Response.Write(" ");
    }
    Response.Write("<br />");
}

順列関数

// Get permutations
private static IList<IList<T>> Permutations<T>(IList<T> list)
{
    List<IList<T>> perms = new List<IList<T>>();

    // If the list is empty, return an empty list.
    if (list.Count == 0)
    {
        return perms;
    }

    // This is a loop method to get the factorial of an integer
    int factorial = 1;
    for (int i = 2; i <= list.Count; i++)
    {
        // shortcut for: factorial = factorial * i;
        factorial *= i;
    }

    for (int v = 0; v < factorial; v++)
    {
        //List<T> s = new List<T>(list);
        List<T> s = new List<T>(list);

        int k = v;
        for (int j = 2; j <= list.Count; j++)
        {
            int other = (k % j);
            T temp = s[j - 1];
            s[j - 1] = s[other];
            s[other] = temp;

            k = k / j;
        }
        perms.Add(s);
    }

    return perms;
}

クラス

public class TPoint
{
    public TPoint(string _id, TData _oTData)
    {
        id = _id;
        oTData = _oTData;
    }

    public string id { get; set; }
    public int someInt { get; set; }
    public TData oTData { get; set; }
}

public class TData
{
    public TData(int _distance, int _minutes)
    {
        distance = _distance;
        minutes = _minutes;
    }

    public int distance { get; set; }
    public int minutes { get; set; }
}

まるで自分を隅に追いやったような気がします。いくつかの解決策を考えることができますが、それらは面倒に思えるので、これについて専門家に尋ねることにしました。

編集

なぜこれが良い考えではないのか、誰でも考えられますか?

これの代わりに、ヒープ上のオブジェクトを変更します (そして、可能な各ルートのすべてのポイントに影響します):

lstPermutations[0][0].oTData.distance = 10;
lstPermutations[0][0].oTData.minutes = 20;

これを使用すると、クラスの新しいインスタンスが作成されます。

TPoint oTPoint = new TPoint(lstPermutations[0][0].id, new TData(10, 20));
lstPermutations[0][0] = oTPoint;
4

2 に答える 2