1

私は非常に特別な問題を抱えており、それを数行のコードと数文に分解するのは難しいですが、そうしようと思います。私は現在、プロセスプラントのアラームをリアルタイムで最適化するためのソフトウェアに取り組んでいます。ソフトウェアは、新しいアラームが表示されるたびにサーバーから新しいアラームを受信します。これらのアラームのいくつかは同じ根本原因を持っており、私のソフトウェアはこれらのアラームを分析し、それらが互いに関連している場合はそれらをグループ化します。私の問題は、新しいアラームを古いアラームと比較することです。古いアラームをグローバルリストに保存し、新しいアラームが表示されたらこのリストに追加します。新しいアラームは、それ自体および古いアラームとグループ化できるかどうかを分析する必要があります。古いアラームを再度グループ化する必要はありません。例として、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か月以上プログラミングしています。

よろしくラリモウ

4

2 に答える 2

1

わかりました...試してみることができるかどうか見てみましょう。これのほとんどは擬似コードになるので、ここに行きます:

List listOfAllAlarms //a specific subset contianing a representative instance of EACH old alarm GROUP!!, and the new alarms
List listOfNewAlarms //Only the new alarms

foreach (alarm a in listOfNewAlarms)
{
    foreach (alarm b in listOfAllAlarms)
    {
        if (a.Equals(b))
            continue;

        Group = //compare a and b

        if (Group != null) //new group
            //Assign a to group b
    }
}       

重要なのは、2つのグループと、それらをループする方法です。外側のリストでは、最新のアラームのみを確認します。内側のリストでは、グローバルなアラームセットと比較します。実際には、新しいアラームをグループ化セットから除外したいと思いますが、すべてが1つのグループに属しているが、既存のグループではない新しいアラームのリストに複数のアラームが含まれる可能性があることは理解しています。あなたがそれらを別々に保つことができるならば、私はそれをもっとこのようにするでしょう:

List listOfAlarmGroups //a specific subset contianing a representative instance of only the already existing old alarm groups
List listOfNewAlarms //Only the new alarms

foreach (alarm a in listOfNewAlarms)
{
    Group G = null;//set -> ReSet G
    foreach (alarm b in listOfAlarmGroups)
    {
        G = //compare a and b

        if (G != null) 
            break;//found the group
    }

    if (G != null)
        //assign a to group G
    else
    {
        //create new group for a
        //add new group to listOfAlarmGroups
    }
}   

2つの違いは、内部ループはグループのみを調べ、他の新しいアイテムとアクティブに比較することはありませんが、既存のグループにグループ化されていないアイテムが見つかった場合は、新しいグループを取得し、NEXTを取得することです。アラームは、古いグループと一緒にその新しいグループと比較されます。同じ効果、わずかに異なるアルゴリズム。

于 2012-08-01T21:01:02.353 に答える
0

私はあなたのアルゴリズムを完全には理解していません。私は使用します

Dictionary<ALARM_ITEM, HashSet<ALARM_ITEM>>

データ構造として、値はイベントのグループであり、キーは各グループの代表です。新しいアラームaが到着すると、アルゴリズムは次のようになります。

  1. キーごとに、でグループ化されているkかどうかを確認しますak
    • もしそうなら、それをに保存されているハッシュセットに追加しk、ブレークします
  2. valuesそれ以外の場合は、だけを含む新しいハッシュセットを作成し、辞書aに追加します(a, values)

つまり、アラームのグループをdictに保存します。この辞書のキーは、グループの「代表的な」アラームです。新しいアラームを追加するには、それを代表的なアラームと比較するだけです。


aこれは、グループがで、グループがでbbグループcaであると想定していcます。そうでない場合、アラームをグループ化する一貫した方法は必ずしもありません。その場合、グループ化関係は同値関係であるため、アルゴリズムは機能します。

于 2012-08-01T17:04:27.997 に答える