私は非常に特別な問題を抱えており、それを数行のコードと数文に分解するのは難しいですが、そうしようと思います。私は現在、プロセスプラントのアラームをリアルタイムで最適化するためのソフトウェアに取り組んでいます。ソフトウェアは、新しいアラームが表示されるたびにサーバーから新しいアラームを受信します。これらのアラームのいくつかは同じ根本原因を持っており、私のソフトウェアはこれらのアラームを分析し、それらが互いに関連している場合はそれらをグループ化します。私の問題は、新しいアラームを古いアラームと比較することです。古いアラームをグローバルリストに保存し、新しいアラームが表示されたらこのリストに追加します。新しいアラームは、それ自体および古いアラームとグループ化できるかどうかを分析する必要があります。古いアラームを再度グループ化する必要はありません。例として、3つの古い(o)アラームと3つの新しいアラーム(n)があります。リストはo1o2o3 n1n2n3のようになります。ここで、n1をo1、o2、o3、n2、およびn3と比較する必要があります。n2は、o1、o2、o3、n3などと比較する必要があります。
これを行うために次のコードを使用しました。
List<ALARM_ITEM> puffer = new List<ALARM_ITEM>();
puffer.AddRange(localOldAlarmList);
puffer.AddRange(localNewAlarmList);
localMergedList = puffer;
int mainListCounter = localOldAlarmList.Count;
for (; mainListCounter < localMergedList.Count; mainListCounter++)
{
/*if there are new elements just these elemnts will be used as static items*/
ALARM_ITEM staticAlarmItem = localMergedList[mainListCounter];
for (int j = -1; j <= 1; j += 2)
{
if (j < 0)
counterRunner = localOldAlarmListLength - 1;
else
counterRunner = mainListCounter + 1;
//Check against any ALARM_ITEM in timeframe
bool inTimeframe = true;
while (inTimeframe)
{
if ((counterRunner >= localMergedList.Count) || (counterRunner) < 0)
break;
ALARM_ITEM groupCandidate = new ALARM_ITEM();
groupCandidate = localMergedList[counterRunner];
//... several if clauses
MergeTwoAlarmGroups(staticAlarmItem, groupCandidate);
if (j < 0)
counterRunner -= 1;
else
counterRunner += 1;
}
}
}
さて、私は何と言いましょうか...私はこのアプローチを約36営業時間で変更しましたが、それでもソフトウェアは新しいアラームを相互に比較するだけで、古いアラームにリンクしません。グループ化アルゴリズムは数ページの長さであり、可能な限り分解しようとしました。私が間違っていることを誰かが私にアドバイスしてくれるなら、私はこの問題に腹を立てているので本当にうれしいです。私がこのプロジェクトで本当に立ち往生しているのは初めてで、このソフトウェアを3か月以上プログラミングしています。
よろしくラリモウ