2011-06-17 4 views
-1

を最小値を決定する必要があります。は、私は簡単に見えたが、かなり速い頭痛になった何かにこだわっているリストに

public class LocumJobDistanceDifferenceObject { 

    public LocumJobDistanceDifferenceObject(Int64 ALocumID, Int64 AJobID, Decimal ADistanceMiles, Int32 ARateDifference, Boolean AIsDistanceUnderMax) { 
     LocumID = ALocumID; 
     JobID = AJobID; 
     DistanceMiles = ADistanceMiles; 
     RateDifference = ARateDifference; 
     IsDistanceUnderMax = AIsDistanceUnderMax; 
    } 

    public Int64 LocumID { 
     get; 
     set; 
    } 

    public Int64 JobID { 
     get; 
     set; 
    } 

    public Decimal DistanceMiles { 
     get; 
     set; 
    } 

    public Int32 RateDifference { 
     get; 
     set; 
    } 

    public Boolean IsDistanceUnderMax { 
     get; 
     set; 
    } 
} 
を:ここで

は、私が使用している構造を表すクラスです。

私はリストを作成して情報の行列を格納します。ロカムは労働者であり、彼はジョブに配置する必要があります。私は50のJobsと75のLocumsを持っていると言います。私はLocums + JobID + JobID + LocumとJob + Detromineの間にDistanceMilesを格納するLocums x Jobs algoを実行して行列を構築します。Jobが支払う/時間を求め、Locumは時間を求めます+ JobへのdostanceはLocumの最大距離を超えます旅行

したがって、基本的には、それはマトリックスのLocums(75)x Jobs(50)の数です。私は自分自身を説明願ってい

foreach (LocumJobDistanceDifferenceObject LocumJobDistanceDifferenceItem in MindMapTier01.OrderBy(order=>order.JobID)) { 
    /** 
    * Build a list (KeyValuePair<JobID, LocumID>) such that for each unique JobID, 
    * I can assign the Locum closest to that Job. I need to keep in mind that 
    * once a job is assigned, I dont want that JobID or LocumID for the next iteration 
    **/ 
} 

は今、私は私のマトリックス上のループ(foreachの)を(私はMindMapTier01それを呼び出す)、次のように実行する必要があります。私は1時間か2時間以内にこれを乗り越える必要があります。助けてください。

よろしくお願いいたします。

答えて

0

私は、私は完全にあなたの問題を理解していることを知りませんが、あなたは仕事が最も近い総主教代行に割り当てられていることを確実にしたいならば、あなたのコードは次のようになります。

Dictionary<Int64, Int64> dicJobLocum = New Dictionary<Int64, Int64>(); // This is the key value pair list 
Dictionary<Int64, Int64> dicJobDistance = New Dictionary<Int64, Decimal>(); // This is to track the distance of the currently assigned locum 

foreach (LocumJobDistanceDifferenceObject locum in MindMapTier01) { 
    if (dicJobDistance.ContainsKey(locum.JobID) { 
     Decimal distance = dicJobDistance(locum.JobID); 
     // If the job has been assigned, check if the current locum is closer 
     if (locum.DistanceMiles < distance) { 
      dicJobDistance(locum.JobID) = locum.Distance; 
      dicJobLocum(locum.JobID) = locum.LocumID; 
     } 
    } 
    else { 
     // If the job has not been assigned yet 
     dicJobDistance.Add(locum.JobID, locum.DistanceMiles); 
     dicJobLocum.Add(locum.JobID, locum.LocumID); 
    } 
} 

任意のマイナーを許しなさい構文エラー、私は最近C#を使用していません。

+0

私はあなたの提案を行った後に結果を得ることができました。ありがとう。 – DoomerDGR8