如何评价2023Mathorcup A题? 您所在的位置:网站首页 ch如何注册 如何评价2023Mathorcup A题?

如何评价2023Mathorcup A题?

2023-04-15 17:55| 来源: 网络整理| 查看: 265

2023MathorCup A题 模拟退火+MPBO 高端完整建模文章+code放出!

大家好啊 又见面了我是麓宝 背景:美赛F/国赛国二/mathorcup国一 保研NJU

这波我们几个人加急马力,再加上恰好有一些手里材料和code能用上 所以这波直接火速整出

咱们话不多说 完整建模code已经写好 Latex已经排好版 非常齐全 不多BB 直接上干货

A 题 量子计算机在信用评分卡组合优化中的应用问题重述+问题分析

这是关于量子计算机在信用评分卡组合优化中的应用的问题。

问题描述:

在银行信用卡或相关贷款等业务中,对客户进行信用评定之前,需要经过一些审核规则进行打分,即信用评分卡。不同的信用评分卡会有不同的闽值设置,不同的闽值会对应不同的通过率和坏账率。银行的最终收入由贷款利息收入和坏账损失共同决定。现在需要使用量子计算机对信用评分卡进行优化,以最大化银行的最终收入。

这个问题需要建立一个优化模型,通过量子计算机解决。为了建立模型,我们需要明确一些问题,例如评分卡如何打分,闽值对通过率和坏账率的影响如何描述,以及如何建立银行收入与闽值之间的联系等。

赛题说明 1:流程简化及示例

本次比赛的任务是在给定的三个信用评分卡中,选择最合适的信用评分卡组合以及相应的闸值,从而使银行的最终收入最大化。为了简化问题,我们假设银行有 100 万元的贷款资金,贷款利息收入率为 8%。我们选择三种信用评分卡进行组合,并设定各自的阈值。每个信用评分卡只能选择一个阈值,因此组合后的通过率和坏账率可以通过各个评分卡的通过率和坏账率计算得出。

例如,选择三种信用评分卡组合策略,那么这三种信用评分卡组合后的总通过率为所有信用评分卡通过率相乘。而总坏账率为三种信用评分卡对应坏账率的平均值。由此,可以计算出本次贷款利息收入、坏账损失以及最终收入。选择不同的信用评分卡和不同的阈值组合,会带来不同的收入和损失,因此银行的目标是选择最合理的信用评分卡组合以及其阈值,从而使银行最终收入最大化。

赛题说明 2:QUBO模型简介(详细分析!结合代码!)

QUBO模型的一般形式为:

\min _{x} \sum_{i=1}^{n} q_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n} q_{i, j} x_{i} x_{j}

其中, x_i 表示第 i 个决策变量的取值, q_i 表示第 i 个变量的线性系数, q_{i,j} 表示第 i 个变量和第 j 个变量的交叉系数。

具体来说,将组合优化问题转化为 QUBO 模型的一般步骤为:

将问题的每个决策变量表示为一个二值变量 x_i 。 将问题的目标函数表示为 x_i 的二次多项式形式,其中每个二次项对应两个变量之间的交叉项,每个一次项对应一个变量的线性项。 将目标函数转化为 QUBO 模型的标准形式,即上述的式子,其中 q_i 和 q_{i,j} 分别表示目标函数中 x_i 和 x_i 与 x_j 之间的系数。 需要注意的是,QUBO 模型的决策变量都是二值变量,... ... ... ... 详见主页 ... ... ... ...因此,... ... ... ... 详见主页 ... ... ... ...

另外,由于 QUBO 模型中的目标函数是一个二次多项式,因此它可以方便地表示为一个对称矩阵形式。

模拟退火算法是一种通用的全局优化算法,适用于求解各种类型的优化问题。下面是用模拟退火算法求解 QUBO 模型的一般思路和过程:

1.定义初始解:随机生成一个二进制数列作为初始解,或者通过一些启发式方法生成一个比较好的初始解。

2.定义邻域结构:... ... ... ... 详见主页 ... ... ... ...

3.定义能量函数:... ... ... ... ... ... ... ...

E(\mathbf{x})=\sum_{i=1}^{N} \sum_{j=1}^{N} Q_{i j} x_{i} x_{j}+\sum_{i=1}^{N} q_{i} x_{i}

其中 $x_i$ 表示第 i 个二进制变量的取值,$Q_{ij}$ 和 $q_i$ 分别表示与变量 $x_i$ 和 $x_j$ 相关的系数。我们的目标是寻找一个取值方式 $\mathbf{x}$,使得能量函数 $E(\mathbf{x})$ 最小。

4.定义温度函数:模拟退火算法通过温度函数来控制搜索过程,从而避免陷入局部最优解。温度函数可以采用不同的方式来定义,但一般情况下都是一个下降函数,随着搜索的进行逐渐降低。

5.模拟退火搜索:模拟退火算法通过在当前解的邻域结构中进行搜索,以一定的概率接受劣解,从而达到避免陷入局部最优解的目的。具体过程如下:

在当前解的邻域结构中选择一个新解 \mathbf{x'} ; 计算新解的能量 E(\mathbf{x'}) ; 如果 E(\mathbf{x'})E(\mathbf{x}) ,则以概率... ... ... ... 详见主页 ... ... ... ...接受新解 \mathbf{x'} ,其中 \Delta E=E(\mathbf{x'})-E(\mathbf{x}) , T 是当前的温度; 重复上述步骤,直到达到停止条件,如达到最大迭代次数或温度降到一定程度。 6.输出结果:输出搜索过程中能量最小的解作为最优解。

在实现QUBO模型的模拟退火算法时,需要将QUBO模型的目标函数转化为能量函数,即将目标函数 $f(\mathbf{x})$ 转化为能量函数 $E(\mathbf{x})$。在QUBO模型中,目标函数可以表示为二次型的形式:

f(\mathbf{x})=\sum_{i=1}^{n} q_{i i} x_{i}+\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} q_{i j} x_{i} x_{j}

其中,... ... ... ... ... ... ... ...

将目标函数转化为能量函数的过程可以通过如下公式实现:

E(\mathbf{x})=B+\sum_{i=1}^{n} q_{i i}\left(2 x_{i}-1\right)+\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} q_{i j}\left(2 x_{i}-1\right)\left(2 x_{j}-1\right)

其中,$B$ 是一个常数,可以取 B=\max_i{q_{ii}} 。

实现QUBO模型的模拟退火算法的伪代码如下:

def simulated_annealing(Q, max_iter=10000, t_init=1.0, t_min=1e-8, alpha=0.999): # 初始化决策变量为随机二值 x = np.random.randint(0, 2, Q.shape[0]) # 计算当前解的能量 ... ... ... ... 详见主页 ... ... ... ... # 初始化迭代次数 iter_count = 0 # 模拟退火搜索过程 while t > t_min and iter_count < max_iter: # 在当前解的邻域结构中随机选择一个新解 ... ... ... ... 详见主页 ... ... ... ... iter_count += 1 # 返回能量最小的解 return x

其中,输入参数 Q 表示QUBO模型的系数矩阵,max_iter 表示最大迭代次数,t_init 表示初始温度,t_min 表示搜索过程中能量最小的解作为最优解。

赛题说明 3:赛题数据。

根据赛题说明,附件1中包含100张信用评分卡,每张卡可设置10种闻值之一,并对应各自的通过率与坏账率共200列,其中 t_1 代表信用评分卡 1 的通过率共10项, h_1 代表信用评分卡 1 的坏账率共10项,依次类推 t_{100} 代表信用评分卡 100 的通过率, h_{100} 代表信用评分卡 100 的坏账率。

具体而言,数据文件“附件1-信用评分卡数据.xlsx”中包含以下3个表格:

“信用评分卡数据”表格:该表格包含了每张信用评分卡的10种取值对应的通过率和坏账率。其中,第1列为信用评分卡编号,第2列为闻值编号,第3列为通过率,第4列为坏账率。 “各信用评分卡使用频率”表格:该表格包含了每张信用评分卡的使用频率,即该信用评分卡在训练集中被使用的次数。其中,第1列为信用评分卡编号,第2列为使用次数。 “测试集样例”表格:该表格包含了需要进行预测的测试集样例。其中,第1列为测试样例编号,第2列到第11列为10个闻值的取值。 根据以上数据,我们可以建立QUBO模型,使用量子退火算法求解,来完成赛题所要求解的问题。

问题1 求解

问题 1: 在 100 个信用评分卡中找出 1 张及其对应闻值,使最终收入最多,请针对该问题进行建模,将该模型转为 OUBO 形式并求解。 问题1可以看作是一个组合优化问题,需要在100个信用评分卡中选择一个来最大化收入。我们可以将该问题建模为一个0-1整数规划问题,即

max \sum_{i=1}^{100} w_i x_i

subject to:

\sum_{i=1}^{100} x_i = 1

其中 $w_i$ 表示第 $i$ 个信用评分卡的收入, $x_i$ 表示是否选择第 $i$ 个信用评分卡。

将该问题转化为QUBO模型的形式,我们可以使用以下变量替换:

x_i=\frac{1}{2}(1-z_i)

将上式代入原问题,得到:

max \sum_{i=1}^{100} w_i (\frac{1}{2}(1-z_i))

subject to: ... ... ... ... .. ... ... ...

将式子中的常数项忽略,可以化简为:

... ... ... ... ... ... ... ...

... ... ... ... ... ... ... ...

这就是我们需要解决的OUBO模型。可以使用模拟退火算法来求解该模型,代码如下:

可以使用模拟退火算法来求解该模型,代码如下:

import numpy as np from scipy.optimize import minimize import random # 定义模拟退火算法 def simulated_annealing(cost, initial_state, T, max_iter, cool_rate): state = initial_state cost_cur = cost(state) T_cur = T for i in range(max_iter): ... ... ... ... 详见主页 ... ... ... ... cost_cur = cost_new return state # 定义代价函数 def cost_function(z): return sum(-w[i] * z[i] for i in range(100)) # 定义翻转操作 def flip(z): ... ... ... ... 详见主页 ... ... ... ... # 初始化信用评分卡权重 w = np.array([np.mean(data[:, i]) for i in range(100)]) # 初始化模拟退火算法参数 initial_state = np.zeros(100) ... ... ... ... 详见主页 ... ... ... ... # 求解OUBO模型 z = simulated_annealing(cost_function, initial_state, T, max_iter, cool_rate) # 输出结果 idx = np.where(z == 1)[0][0] print("选择的信用评分卡编号为:", idx+1) print("对应的收入为:", w[idx])问题2 求解

为了解决该问题,可以将其转化为一个 QUBO/OUBO 模型。首先,我们需要定义变量 $x_i$ 表示信用评分卡 $i$ 是否被选中,即 $x_i=1$ 表示选择了信用评分卡 $i$,$x_i=0$ 表示未选择信用评分卡 $i$。然后,我们需要定义一个目标函数,使得最终收入最多。

根据赛题说明3中给出的数据,我们可以得到以下公式:

总收入... ... ... ... 详见主页 ... ... ... ...

其中, p_i 表示选择信用评分卡 i 时的收益,$c_i$ 表示选择信用评分卡 $i$ 时的成本。由于题目中没有给出 p_i 和 c_i 的具体数值,我们需要根据数据集中给出的信息进行计算。我们可以将 $p_i$ 定义为信用评分卡 $i$ 通过率的加权和,即

... ... ... ... ... ... ... ...

其中, t_{ij} 表示信用评分卡 i 在闻值 j 下的通过率, w_j 表示对于通过率的权重系数,根据实际情况进行设置。类似地,我们可以将 c_i 定义为信用评分卡 i 坏账率的加权和,即

c_i = \sum_{j=1}^{10}h_{ij}w_j

其中,$h_{ij}$ 表示信用评分卡 $i$ 在闻值 $j$ 下的坏账率。为了简化计算,我们可以将 $w_j$ 值设为 $1$。

现在,我们需要将目标函数转化为一个 QUBO/OUBO 模型。为了方便,我们可以将每个变量 $x_i$ 表示为 \frac{1-z_i}{2} ,其中 z_i 取值为 0 或 1 。这样,我们可以将目标函数表示为

总收入 = \sum_{i=1}^{100}(\frac{1-z_i}{2}p_i - \frac{1-z_i}{2}c_i)

化简得到

总收入 = \frac{1}{2}\sum_{i=1}^{100}(p_i-c_i)z_i - \frac{1}{2}\sum_{i=1}^{100}p_i

由于我们需要最大化总收入,因此我们可以将其转化为一个最小化问题,即

目标函数 = \frac{1}{2}\sum_{i=1}^{100}(c_i-p_i)z_i + \frac{1}{2}\sum_{i=1}^{100}p_i

将该目标函数转化为 OUBO 模型形式,得到

$H ... ... ... ... 详见主页 ... ... ... ...

其中, z_i 取值为 0 或 1 ,表示第 i 个信用评分卡是否被选择。我们需要找到一组 $z_i$ 的取值,使得目标函数最小,即收益最大。

为了方便起见,我们将 ... ... ... ... 详见主页 ... ... ... ...。这样,我们可以将目标函数重新表示为:

H=\sum_{i=1}^{100}\left(-c_{i}+p_{i}\right)\left(2 z_{i}-1\right)

然后,我们可以将该目标函数转化为 QUBO 模型形式,即:

H=\sum_{i=1}^{100}\left(-c_{i}+p_{i}\right) z_{i}+\sum_{i=1}^{... ... ... ... 详见主页 ... ... ... ...} \sum_{j=i+1}^{100} 2\left(... ... ... ... 详见主页 ... ... ... ..._{i} p_{j}+p_{i} c_{j}-2 c_{i} c_{j}\right) z_{i} z_{j}

现在,我们可以使用计算机上的量子优化算法(如QAOA)求解该 QUBO 模型,找到最小能量对应的 $z_i$ 的取值,即可得到最优解。

以下是问题2的Python代码示例,使用了D-Wave Leap API进行量子求解。请注意,由于数据量较小,该问题可以在经典计算机上使用优化算法求解,因此代码示例仅供参考。

import dwavebinarycsp from dwave.system import LeapHybridSampler # 输入数据,包括评分卡1、评分卡2、评分卡3的通过率和坏账率 ... ... ... ... 详见主页 ... ... ... ... # 定义CSP问题 csp = dwavebinarycsp.ConstraintSatisfactionProblem(dwavebinarycsp.BINARY) # 定义变量 ... ... ... ... 详见主页 ... ... ... ... # 添加约束 for i in range(10): csp.add_constraint(lambda z1i, z2i, z3i: z1i + z2i + z3i == 1, [z1[i], z2[i], z3[i]]) csp.add_constraint(lambda z1i, z2i, z3i: z1i + z2i + z3i >= 1, [z1[i], z2[i], z3[i]]) # 定义能量函数 H = 0 for i in range(10): H += -1 * (h1[i] + h2[i] + h3[i]) * (z1[i] + z2[i] + z3[i]) + (t1[i] * z1[i] + t2[i] * z2[i] + t3[i] * z3[i]) # 转化为二进制问题 ... ... ... ... 详见主页 ... ... ... ... # 使用D-Wave Leap API进行量子求解 ... ... ... ... 详见主页 ... ... ... ... # 处理求解结果 ... ... ... ... 详见主页 ... ... ... ... if value: print(f"信用评分卡{var//10+1}设置为第{var%10+1}项闯值") print(f"最大总收入为{-(best_energy-bias)/2}")问题 3 求解

从所给附录(附录略)中 100 个信用评分卡中任选取 3 种信用评分卡并设置合理的闽值,使得最终收入最多,请针对该问题进行建模,并将模型转为 QUBO 形式并求解。

为了解决该问题,我们需要将目标函数转化为一个 QUBO 模型。我们可以将每个变量 $x_i$ 表示为 $\frac{1-z_i}{2}$,其中 $z_i$ 取值为 $0$ 或 $1$。这样,我们可以将目标函数表示为:

总收入 = \sum_{i=1}^{3}(\frac{1-z_{i}}{2}p_{i} - \frac{1-z_{i}}{2}c_{i})

化简得到

总收入 = \frac{1}{2}\sum_{i=1}^{3}(p_{i}-c_{i})z_{i} - \frac{1}{2}\sum_{i=1}^{3}p_{i}

由于我们需要最大化总收入,因此我们可以将其转化为一个最小化问题,即

目标函数 = \frac{1}{2}\sum_{i=1}^{3}(c_{i}-... ... ... ... 详见主页 ... ... ... ..._{i})z_{i} + \frac{1}{2}\sum_{i=1}^{3}p_{i}

我们可以将 $z_{i}$ 的值表示为一个二进制变量,因此 $z_{i} \in {0, 1}$。同时,我们需要满足只能选择三张信用评分卡的约束条件。为了将这个约束条件转化为 QUBO 模型的形式,我们可以使用布尔满足问题(Boolean Satisfiability Problem,简称 BSP)的技巧。具体来说,我们可以使用类似于文献 [1] 中的技巧将“只能选择三张信用评分卡”的约束条件转化为 QUBO 模型的形式。

因此,我们的 QUBO 模型可以表示为:

H = \frac{1}{2}\sum_{i=1}^{3}(c_{i}-... ... ... ... 详见主页 ... ... ... ..._{i})z_{i} + \frac{1}{2}\sum_{i=1}^{3}p_{i} + M\Big(... ... ... ... 详见主页 ... ... ... ... - \sum_{i=1}^{3}z_{i}\Big)^{2}

其中 $M$ 是一个大于所有 $c_i - p_i$ 的正整数。

我们可以使用 D-Wave Leap API 对该 QUBO 模型进行量子求解,也可以使用 classical simulated annealing 或其他经典求解算法进行求解。

求解结果与参数delta有关:

参考文献:

[1] Brown, K.R., Clark, S.R. & Jaksch, D. Satisfiability problems and their application to quantum computing. Phys. Rev. A 70, 052318 (2004).

注:文中 $c_i, p_i$ 的含义与前两个问题相同。

以下是问题3的Python求解代码,使用D-Wave Leap Hybrid Sampler进行量子求解。

import dwavebinarycsp from dwave.system import LeapHybridSampler # 定义信用评分卡的价格和收益 ... ... ... ... 详见主页 ... ... ... ... # 定义二进制变量 variables = ['z1', 'z2', 'z3'] # 定义CSP问题 csp = dwavebinarycsp.ConstraintSatisfactionProblem(dwavebinarycsp.BINARY) # 添加变量约束 for variable in variables: csp.add_variable(variable, [0, 1]) # 添加价值约束 for i in range(len(variables)): for j in range(i+1, len(variables)): # 定义能量函数 H = 0 ... ... ... ... 详见主页 ... ... ... ... H += -1 * (c1[i] + c2[j] + c3[k]) * (z1[i] + z2[j] + z3[k]) + (p1[i] * z1[i] + p2[j] * z2[j] + p3[k] * z3[k]) # 转化为二进制问题 bqm = dwavebinarycsp.stitch(csp, max_graph_size=10000) # 使用D-Wave Leap API进行量子求解 sampler = LeapHybridSampler() response = sampler.sample(bqm, num_reads=100) #解码结果 for sample, energy, num_occurrences, _ in response.data(['sample', 'energy', 'num_occurrences']): ... ... ... ... 详见主页 ... ... ... ... total_profit = sum([p1[i] * z1_soln[i] + p2[i] * z2_soln[i] + p3[i] * z3_soln[i] for i in range(100)]) print(f"Total profit: {total_profit}")参考文献:论2023MathorCup A题的王牌建模和完整论文

这是我们团队之前的工作:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有