2023 mahorcup question クレジットスコアカードの組み合わせ最適化における量子コンピューターのアプリケーションアイデア

2023mathorcup Question A 「gzh Digital Model Incubation Park」がプロデュースするクレジットカードの組み合わせ最適化における量子コンピュータの応用例

まずこの問題の難しさを話させてください、主に計算、計算、または計算、そして最適化アルゴリズムの計算です. 3つの問題はすべてこれであり、QUBO形式に変換されて解決されます.

質問 1 では、最終収入が最大になるように、100 枚のクレジット スコア カードから 1 枚のクレジット カードとそれに対応するしきい値を見つける必要があります。この問題を解決するには、トラバーサル メソッドを使用できます。まず、量子コンピューティングやその他の最適化アルゴリズムを使用して解決できるように、問題を QUBO (2 次制約なしバイナリ最適化) 形式に変換する必要があります。

タイトルは形を与え、その形で多くの情報を読み取ることができます! デジタルモデリングを行う場合、フォームによって明らかにされた情報があなたの行動の方向であることに注意する必要があります. この種の与えられたものは、そのようなオープンなものよりも簡単で、理解できる人は誰でも理解できます。

まず、表を分析してみましょう。表では、さまざまなしきい値の下で、各クレジット スコア カードによってもたらされたローン金利収入と不良債権損失を分析できます。銀行にとって重要なのは、合格率と不良債権率のバランスをとる適切なしきい値を見つけて、最終的な収入を最大化することです。これで、各クレジット スコアカードの収入を各しきい値で計算し、最適なソリューションを見つけることができます。

各ローンの平均額を A、ローン金利を r とすると、各しきい値でのローン金利収入と貸倒損失を計算し、最終的な収入を得ることができます。

最終収入 = ローン金利収入 - 貸倒損失

= A ×合格率 × r - A × 合格率 × 不良債権率

計算を単純化するために、A をキャンセルして単純化された収入式を得ることができます。

簡易所得 = 合格率 × r - 合格率 × 不良債権率

各しきい値で各スコアカードの単純化された収入を計算することにより、最適なしきい値とスコアカードを見つけることができます。

フォームから読み取った情報です。

開始テキスト:

この問題を QUBO (2 次無制約二項最適化) 問題としてモデル化するには、まずそれを 2 次無制約最適化問題に変換する必要があります。この問題については、次の戦略を採用できます。

It must be convert into a binary variable here, and it must be. 以下の質問はすべてこの質問に基づいています。

バイナリ変数を使用して、クレジット スコアカードの選択肢を表します。各クレジット スコアカード i (1 <= i <= 100) に対して、10 個のバイナリ変数 x_i1、x_i2、...、x_i10 を導入します。x_ij は、クレジット スコアカード i のしきい値 j が選択されているかどうかを表します。しきい値 j が選択された場合は x_ij = 1、それ以外の場合は x_ij = 0 です。

1 つのクレジット スコアカードとそれに対応するしきい値を選択する必要があるため、各クレジット スコアカードに対して 1 つのしきい値のみが選択されるように制約を追加する必要があります。つまり、すべての i に対して x_ij = 1 が 1 つだけ存在します。この制約を QUBO 形式に変換するために、二次ペナルティ項として表現できます。各 i に対して、ペナルティ項 λ * (Σ_j x_ij - 1)^2 を追加できます。ここで、λ は、制約が満たされるのに十分な大きさのペナルティ係数です。

次に、最終収入を最大化する目的関数を定義する必要があります。問題の説明によると、最終的な収入 = ローンの利子収入 - 不良債権の損失。計算を簡単にするために、まず各しきい値 (合格率 × 金利収入率 - 合格率 × 不良債権率) で各クレジット スコアカードの単純化された収入を計算し、次に単純化された収入を最大化するクレジット スコアカードとしきい値を見つけることができます。

私たちの目標は単純化された収入を最大化することなので、目的関数は次のように表すことができます。

目的関数 = Σ_i Σ_j (合格率_ij × 利子所得率 - 合格率_ij × 不良債権率_ij) × x_ij

目的関数に制約を追加すると、次のようになります。

QUBO目的関数 = Σ_i Σ_j (合格率_ij × 利子所得率 - 合格率_ij × 不良債権率_ij) × x_ij + Σ_i λ * (Σ_j x_ij - 1)^2

これで、問題を QUBO 問題に変換し、その後に計算用の最適化アルゴリズムを適用しました。

ここでは、より古典的なものの 1 つがさりげなく使用されており、変更することができます。実際には多くの最適化アルゴリズムがあります。

ところで、一般的な最適化アルゴリズムとシナリオをみんなに普及させてください. 結局のところ、誰もが何かを学びたいのであって、水の競争のためではありませんよね? (手動の犬の頭)

勾配降下アルゴリズム:主に、連続的に導出可能な目的関数の最小値を解決するために使用されます。目的関数の勾配 (導関数) を計算することにより、局所的な最小値が見つかるまで、勾配の負の方向に沿って変数値が更新されます。

ニュートン法:ニュートン法は、二次導関数 (ヘッセ行列) に基づく最適化アルゴリズムです. 目的関数の勾配とヘッセ行列を計算することにより、二次テイラー展開を使用して目的関数を近似し、ローカル最小。

確率的勾配降下 (SGD): SGD は勾配降下法の変形であり、大規模なデータ セットに適しています。各反復中に、SGD はデータセットからサンプルまたはサンプルの小さなバッチをランダムに選択して勾配を計算し、計算の複雑さを軽減します。

粒子群最適化 (PSO): PSOは群知能に基づく最適化アルゴリズムで、鳥の採餌行動をシミュレートします。粒子群内の各粒子は潜在的な解を表し、粒子の位置と速度を継続的に更新することにより、グローバルな最適解が見つかります。

遺伝的アルゴリズム (GA):遺伝的アルゴリズムは、生物学的進化のプロセスをシミュレートする最適化アルゴリズムであり、コード化、交差、突然変異、解の選択などの操作を通じて、優れた解の保持と再現を実現し、グローバル最適解です。

シミュレーテッド アニーリング アルゴリズム (Simulated Annealing、SA):シミュレーテッド アニーリング アルゴリズムは、高温での物質のアニーリング プロセスをシミュレートするヒューリスティック検索アルゴリズムです。近傍解をランダムに探索し、一定の確率で劣った解を受け入れることで、局所最適解に陥ることを回避します。

import numpy as np

# 假设我们有以下模拟数据

num_cards = 100

num_thresholds = 10

loan_amount = 1000000

interest_rate = 0.08

penalty_lambda = 1000



# 随机生成通过率和坏账率数据

np.random.seed(42)

pass_rates = np.random.rand(num_cards, num_thresholds)

bad_debt_rates = np.random.rand(num_cards, num_thresholds) * 0.1



# 计算每个信用评分卡在每个阈值下的简化收入

simplified_incomes = pass_rates * interest_rate - pass_rates * bad_debt_rates



# 暴力搜索最优解

best_income = -np.inf

best_card = -1

best_threshold = -1



for i in range(num_cards):

    for j in range(num_thresholds):

        # 计算当前信用评分卡和阈值下的最终收入

        income = loan_amount * simplified_incomes[i, j]



        # 如果当前收入大于已找到的最佳收入,更新最佳收入、信用评分卡和阈值

        if income > best_income:

            best_income = income

            best_card = i

            best_threshold = j



print(f"最佳信用评分卡: {best_card + 1}")

print(f"最佳阈值: {best_threshold + 1}")

print(f"最大最终收入: {best_income:.2f} 元")

質問 2 :データ セットで指定されたクレジット スコアカード1 、クレジット スコアカード2 、クレジット スコアカード3 の 3つのルールが、コンテストの説明3で選択されていると仮定して、最終的な収入を最大化するための対応するしきい値を設定する方法を教えてください。この問題をモデル化し、そのモデルをQUBO形式に変換して解いてください。

まず、問題を QUBO (2 次制約なしバイナリ最適化) 形式に変換する必要があります。3 つのクレジット スコアカードのしきい値をバイナリ変数として表し、これらの変数に対して 2 次目的関数を作成します。次に、最適化アルゴリズムを使用して、この目的関数の最小値を見つけます。

まず、問題を単純化するために、各しきい値を 10 ビットに分割します。クレジット スコアカード i (i = 1, 2, 3) について、10 ビットの 2 進数 x_i = x_{i1}...x_{i10} を定義します。ここで、しきい値 j選択です。したがって、次の制約があります。

Σ(x_{ij}) = 1、i = 1、2、3 の場合

次に、最終収入を計算します。競争のトピックの説明によると、最終的な収入は次のように表すことができます。

最終収入 = ローン金利収入 - 貸倒損失 = ローン資金 x 金利収入率 x 合計合格率 x (1 - 合計不良債権率) - ローン資金 x 合計合格率 x 合計不良債権率

私たちの目標は、最終的な収益を最大化することです。QUBO は最小化問題なので、負の最終所得を最小化できます。

バイナリ変数 x_{ij} で 2 次目的関数を作成する必要があります。この目的のために、合計合格率と合計不良債権率をバイナリ変数の二次関数として表すことができます。たとえば、全体の合格率は次のように表すことができます。

合計合格率 = Π(Σ(t_{ij} × x_{ij}))、 i = 1、2、3、および j = 1,...,10 の場合

ここで、t_{ij} はクレジット スコアカード i のしきい値 j の合格率を表します。同様に、総不良債権比率は次のように表すことができます。

総不良債権比率 = Σ(Σ(h_{ij} × x_{ij}) / 3)、i = 1、2、3 および j = 1,...,10 の場合

ここで、h_{ij} はクレジット スコア カード i のしきい値 j の不良債権率を表します。

次に、最終収入をバイナリ変数の二次関数として表現し、QUBO問題を解きます.ここでの解決プロセスは、実際には最初の質問と同じであり、最適化アルゴリズムを使用できます. 例はすでに示されているので、ここでは繰り返しません。

問題 3:付録の100 枚のクレジット スコア カードから3 枚のクレジット スコア カードを選び、最終的な収入を最大化するための適切なしきい値を設定してください. この問題をモデル化し、そのモデルをQUBO形式に変換して解いてください.

クレジット スコアカードの選択肢としきい値をバイナリ変数として表し、これらの変数で 2 次目的関数を作成する必要があります。次に、最適化アルゴリズムを使用して、この目的関数の最小値を見つけます。

まず、クレジット スコアカードの選択を 100 個のビンに分割します。クレジット スコアカード i が選択された場合に限り、y_i = 1 です。次の制約があります。

Σ(y_i) = 3, 对于 i = 1,...,100

次に、簡単にするために、各しきい値を 10 ビットに分割します。クレジット スコアカード i (i = 1,...,100) に対して、10 ビットの 2 進数 x_i = x_{i1}...x_{i10} を定義します。ここで、x_{ij} = 1 は、しきい値 j が選択されます。したがって、次の制約があります。

Σ(x_{ij}) = 1, for i = 1,...,100

これらの制約を目的関数に組み込む必要があります。これは、ペナルティ関数法を使用して実現できます。まず、バイナリ変数 y_i にペナルティ関数を定義します。

P_y(y) = (Σ(y_i) - 3)^2

次に、バイナリ変数 x_{ij} にペナルティ関数を定義します。

P_x(x) = Σ((Σ(x_{ij}) - 1)^2), for i = 1,...,100

では、最終収入を計算してみましょう。競争のトピックの説明によると、最終的な収入は次のように表すことができます。

最終収入 = ローン金利収入 - 貸倒損失 = ローン資金 x 金利収入率 x 合計合格率 x (1 - 合計不良債権率) - ローン資金 x 合計合格率 x 合計不良債権率

私たちの目標は、最終的な収益を最大化することです。QUBO は最小化問題なので、負の最終所得を最小化できます。

バイナリ変数 x_{ij} と y_i で 2 次目的関数を作成する必要があります。この目的のために、合計合格率と合計不良債権率をバイナリ変数の二次関数として表すことができます。たとえば、全体の合格率は次のように表すことができます。

合計合格率 = Π(Σ(t_{ij} × x_{ij} × y_i))、 i = 1,...,100 および j = 1,...,10 の場合

ここで、t_{ij} はクレジット スコアカード i のしきい値 j の合格率を表します。同様に、総不良債権比率は次のように表すことができます。

総不良債権比率 = Σ(Σ(h_{ij} × x_{ij} × y_i) / 3)、 i = 1,...,100 および j = 1,...,10 の場合

ここで、h_{ij} はクレジット スコア カード i のしきい値 j の不良債権率を表します。

最終収入は、バイナリ変数の二次関数として表すことができます。総合格率と総不良債権率の式をマイナスの最終収益の式に代入すると、次のようになります。

マイナスの最終収入 = ローン資金 x 合計合格率 x 合計不良債権率 - ローン資金 x 利子所得率 x 合計合格率 x (1 - 合計不良債権率)

私たちの目標は、負の最終収益を最小限に抑え、制約を満たすことです。したがって、バイナリ変数 x_{ij} および y_i で重み付けされた二次目的関数を作成します。

Q(x, y) = 負の最終所得 + α × P_y(y) + β × P_x(x)

ここで、α と β は、制約ペナルティの重みを調整するハイパーパラメーターです。

次に、問題を QUBO 形式に変換します。解決するには、シミュレーテッド アニーリングや遺伝的アルゴリズムなどの最適化アルゴリズムを使用できます。

最適なソリューションを取得した後、最終的な収入を最大化するという目標を達成するために、選択したクレジット スコアカードと対応するしきい値を結果から抽出できます。

質問 C のアイデアhttps://mp.weixin.qq.com/s/ujcVcKiCsp12r_FjNpPTaA

おすすめ

転載: blog.csdn.net/shumofuhuayuan/article/details/130153547