3

私は、州の基準に基づいてさまざまな種類の補償範囲を使用して保険の見積もりを生成するプログラムを開発しました。ここで、「ルール」を指定する機能を追加したいと考えています。たとえば、3 種類のカバレッジ (UM、BI、PD と呼びます) があるとします。一部の州では PD を BI よりも大きくすることを許可しておらず、他の州では BI なしで UM の存在を許可していません。そのため、ユーザーがこれらのルールを作成できる機能を追加して、見積もりが生成されたときにルールが守られるようにし、プログラムが見積もりを生成するときに州の規制に違反しないようにしました。

問題

ユーザーが競合するルールを選択できるようにしたくありません。ユーザーは、VB の数学演算子 (>、<、>=、<=、=、<>) のいずれかを選択して、いずれかの側にカバレッジを設定できます。これを複数回行うことができるため (ただし、一度に 1 回のみ)、次のようなルールのリストになる可能性があります。

  • A > B
  • B > C
  • C > A

ご覧のとおり、最後のルールは以前に設定されたルールと競合しています。これに対する私の解決策は、ユーザーが「ルールをリストに追加」をクリックするたびにリストを検証することでした。

3 番目のリスト アイテムはまだリストに含まれていないが、ユーザーが [ルールの追加] をクリックしてリストに追加したとします。検証プロセスでは、最初に両方の入力変数が同じ行で既に使用されているかどうかを確認します。そうでない場合は、作成済みのリストで左側の入力変数 (この場合は「C」) を検索します。見つかった場合は、tmp1 を一致の向かい側の変数 (tmp1 = 'B') に等しく設定します。次に、右側の入力変数 (この場合は「A」) に対して同じことを行います。次に、tmp2 が A の向かい側の変数と等しくなるように設定されます (tmp2 = 'B')。tmp1 と tmp2 が等しい場合、着信規則は競合しているか、使用されている演算子に関係なく無関係です。3 つの変数を考えると、これは確固たる論理であると確信しています。でも、追加の変数を追加すると、検証を簡単にバイパスできることがわかりました。任意の状態で 10 を超えるカバレッジ タイプが存在する可能性があるため、3 つ以上を検証できることが重要です。

任意の数の変数を指定して健全な検証を行う統一された方法はありますか? どんなアイデアや考えでも大歓迎です。私の説明が理にかなっていることを願っています。ありがとう

4

2 に答える 2

1

私の最善の策は、ある種のルールの階層ツリーです。ユーザーが最初のルール (A > B など) を追加すると、アプリケーションは次のようなデータ構造を作成できます (lowerValues は、キーが値のリストにつながるマップです)。

lowerValues['A'] = ['B']

ここで、ユーザーが次のルール (B > C) を追加すると、アプリケーションは、B がすでに lowerValues リスト (この場合は A) にあるかどうかを確認できます。その場合、C が lowerValues['A'] に追加され、lowerValues['B'] も作成されます。

lowerValues['A'] = ['B', 'C']
lowerValues['B'] = ['C']

最後に、最後のルールがユーザーによって提供されると (C > A)、アプリケーションは C が lowerValues リストにあるかどうかをチェックします。B と A にあるため、ルールは無効です。

それが役立つことを願っています。VB に何らかのマッピングがあるかどうかは覚えていません。Dictionary オブジェクトを試してみるべきだと思います。

このアイデアがうまくいくためには、すべての操作を内部的に単純な型に変換する必要があります。たとえば、次のようになります。

A > B

として翻訳することができます

B <= A

幸運を

于 2012-07-03T22:26:43.743 に答える
1

一般に、これはかなり難しい問題です。あなたが実際に知りたいのは、(明らかに)算術演算のセットに対する一連の命題方程式が真であるかどうかです。これを行うには、算術演算を「知っている」制約ソルバーに相当するものが必要です。VB6でそれを見つけることはほとんどありませんが、サブプロセスとして呼び出すことができるかもしれません.

ルールが不等式のみの命題方程式(AA") である場合は、それらを一方向にのみ記述します。次に、トートロジーの命題を解いてみてください ( VB6 でぎこちなく実装できる Wang のアルゴリズムについては、を参照してください)。

命題がトートロジーでない場合は、不等式の連鎖 (たとえば、A > B > C) をグラフとして構築し、サイクルを探します。これが失敗するのは、命題に選言がある場合です。たとえば、("A>B or B>Q"); 論理和の組み合わせごとに不等式チェーンを生成し、矛盾するものを破棄する必要があります。それらをすべて破棄すると、セットは矛盾します。「A and B」のような表現に注意してください。DeMorgans の定理により、これらは「not A or not B」と同等です。たとえば、「A>B and B>Q」は「A<=B or B<=Q」と同じです。驚かされるのを避けるために、条件を論理和正規形に減らしたいと思うかもしれません。

このような不等式には明らかに決定手順があります。それらはおそらく実装が難しいでしょう。

于 2012-07-04T11:09:26.320 に答える