3

私はいつかこれを解決しようとしていますが、インターネットを検索していくつかの本を参照しようとしましたが、解決策を見つけることができませんでした.

ここで提案されている解決策は 1 つありますが、他にもっと簡単な方法があるかどうかはわかりません。参照:浮動小数点値が含まれている Python 辞書の比較

いくつかの指針を教えていただければ幸いです。

背景: {key:{key:{key:[value]}}} 関係を持つ dict_A があります。この dict_A は、反復プロセスを経て、いくつかの制約と最適化目標に基づいてその値を最適化します。最終的に最適化された辞書、つまり dict_B2 が、1 サイクル前に最適化された辞書、つまり dict_B1 と等しい場合にのみ、最適化プロセスを停止します。これは、dict をこれ以上最適化できないという印象を与え、反復サイクルを中断するために使用されます。

質問: 辞書の値に浮動小数点数が含まれているため、格納されている値の一部が変更されます。これは、おそらく辞書が値をバイナリ形式で格納しているためです。以下の例を参照してください。ディクショナリの最初の float 値のバリエーションです。

dict_B1 = {0: {36: {3: [-1], 12: [0.074506333542951425]}}, 1: {36: {2: [-1], 16: [0.048116666666666676], 17: [-1]}}, 2: {}, 3: {36: {5: [-1], 6: [-1], 15: [0.061150932060349471]}}}
dict_B2 = {0: {36: {3: [-1], 12: [0.074506333542951439]}}, 1: {36: {2: [-1], 16: [0.048116666666666676], 17: [-1]}}, 2: {}, 3: {36: {5: [-1], 6: [-1], 15: [0.061150932060349471]}}}

以下を使用すると、インタラクティブなプロセスが無限ループになり、壊れません。

if (dict_B1==dict_B2):
   Exit

また、

if (cmp(dict_B1,dict_B2)):
   Exit

18 の浮動小数点精度値から 15 の浮動小数点精度と比較して、辞書を比較する他の方法はありますか?

精度の低い値のフロートを辞書に保存してみました。問題はまだ解決していません。

私を正しい方向に向けるのを手伝ってくれることを願っています。

更新 1: Jakub の提案

Jakubの提案は良いです。フロートを格納する List_B1 と List_B2 という 2 つの中間リストを作成できます。これらは比較に使用され、反復プロセスを中断するタイミングを決定するフラグとして使用されます。

以下は、ケースをテストするために使用されるコードです。List_B2 の 2 番目の項目は意図的に変更されているため、値は精度のしきい値をはるかに超えています。

def is_equal(floats_a, floats_b, precision=1e-15):
    return all((abs(a-b) < precision) for a, b in izip(floats_a, floats_b))

List_B1=[0.074506333542951425,0.048116666666666676,0.061150932060349471]
List_B2=[0.074506333542951439,9.048116666666666676,0.061150932060349471]

print "is_equal(List_B1,List_B2):",is_equal(List_B1,List_B2)

for a, b in izip(List_B1, List_B2):
    print a,b, (abs(a-b) < 1e-15)

結果:

is_equal(List_B1,List_B2): True

0.074506333543 0.074506333543 True
0.0481166666667 9.04811666667 False
0.0611509320603 0.0611509320603 True

奇妙なことis_equalに、関数は常にTRUE正しくないものを返しますが、コードを分析すると正しく動作します。おそらくreturn allORではなくを実行していANDます。まだこれをトラブルシューティングしています。

何かヒントがあれば共有してください。これを解決するために引き続き作業します。これまでのすべてのガイダンスについて、Jakub と Julien に感謝します。

rgds サラバナン K

4

3 に答える 3

1

説明したように、コードは、計算された解が前のステップの結果と等しいことを確認します。問題は、アルゴリズムが、互いに非常に近い 2 つ (またはそれ以上) のソリューションの間で振動することです。

だから私はあなたができると思います:

  • ループに入ったかどうかを確認するために、いくつかの以前の結果を保存します。問題は、保存する必要がある以前のソリューションの数を知ることです。
  • または、Jakub と指摘した投稿で示唆されているように、dict_B1 が dict_B2 の特定の範囲内にあるかどうかを確認できます。

構造が複雑すぎるため、2番目の解決策はあなたの場合は苦痛です。すべてのコードを壊したくない場合は、演算子を再定義して特定の範囲内での等価性をチェックするカスタムのリストオブフロート クラスに[value]置き換えることができます。{key:{key:{key:[value]}}}__eq__()

于 2013-04-28T18:32:54.740 に答える