2023年mathorcup杯A题代码小技巧总结

news2025/1/19 14:35:48

写篇杂文,不属于我的任何一个栏目,没啥案例含义,主要是记录一下mathorcup杯期间写的代码技巧。


mathorcup杯大部分都是组合优化问题,这让我擅长的机器学习都深度学习毫无作用.......

还好这个A题是可以遍历求所有解的,下面就是我怎么做的一些代码。


手写第一问

第一问就是找100张卡10种阈值,1000种情况哪种最好,遍历算一遍就行了。

导入包:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns

plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False               #显示负号

读取数据,转为列格式

df=pd.read_csv('../附件/附件1:data_100.csv')
df1=df.filter(regex='t', axis=1).melt().assign(num=[i+1 for i in range(10)]*100)
#df1                                             #.set_index('variable')  #.unstack().reset_index()
df1['index']=df1['variable'].str.cat(df1['num'].astype(str), sep='_')
df2=df.filter(regex='h', axis=1).melt().assign(num=[i+1 for i in range(10)]*100)
df2['index']=df2['variable'].str.cat(df2['num'].astype(str), sep='_')
data=pd.DataFrame()
data['index']=df1['index']
data['t']=df1['value']
data['h']=df2['value']
data=data.set_index('index')
data

t是通过率,h是坏账率 。前面表示的是卡号和阈值。

定义目标函数

def deal_xht(x,t,h,L=0.08):
     return x*t*(L-L*h-h)

遍历结果,然后储存

sum_result=[]
for i in range(len(data)):
    x=np.zeros((1000,))
    x[i]=1
    sum_result.append(sum([deal_xht(x,t=th[0],h=th[1]) for x ,th in zip(x,data.to_numpy())]))

找到最大的

index=np.array(sum_result).argmax()
index

结果是49张卡的一号阈值最好。

查看对应的坏账率和通过率

data.iloc[index,:]

 

转为结果为数据框

data1=pd.DataFrame(sum_result,index=data.index,columns=['利润']).reset_index().assign(标签=lambda d:d['index'].str.split('_'))\
.assign(阈值=lambda d:d['标签'].apply(lambda x:x[2])).assign(卡号=lambda d:d['标签'].apply(lambda x:x[1])).drop(columns=['index','标签'])

data1['阈值']=data1['阈值'].astype('int')
data1['卡号']=data1['卡号'].astype('int')
data1=data1.pivot(index='阈值', columns='卡号', values='利润').sort_index(sort_remaining=False)

 查看其中10列

data1.iloc[:,45:55]*1000

画个热力图吧

import matplotlib.colors as mcolors

# 定义黄蓝渐变色
colors = ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0']
my_cmap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors)

plt.figure(figsize=(7,5),dpi=256)
sns.heatmap((data1.iloc[:,45:55]*1000).round(3), cmap=my_cmap, annot=True, annot_kws={"size": 8})
plt.savefig('第一问.png')

还别说,这个chatgpt给的颜色还很好看。

画个三维图:

data1=data1*1000
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8,8),dpi=256)
ax = fig.add_subplot(111, projection='3d')

colors=['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']*2

# 绘制3D柱状图
for i in range(data1.shape[0]):
    xs = [j for j in range(data1.shape[1])]
    ys = [i] * data1.shape[1]
    zs = data1.iloc[i, :].tolist()
    ax.bar(xs, zs, zs=ys, zdir='y', alpha=0.5,color=colors[i],width=0.5)

# 设置坐标轴标签
ax.set_xlabel('卡号')
ax.set_ylabel('阈值')
ax.set_zlabel('银行最终收入')
plt.savefig('第一问三维图.png')
# 显示图像
plt.show()

 

 

 可以看到阈值较小的时候银行倾向于有一个更多的收入。


QUBO求第一问

上面是枚举,遍历了所有可能性,暴力搜索。下面是题目要求的QUBO模型求解。

重新读取数据

df=pd.read_csv('../附件/附件1:data_100.csv')
df

 这个是一个小技巧,可以筛选列名称里面含有h或者t的列的方法

df1=df.filter(regex='t', axis=1)
df2=df.filter(regex='h', axis=1)
df2

使用pyqubo库变换为QUBO问题,使用neal库里面的量子退火求解

import pyqubo
from pyqubo import Binary,Array
import neal
#x = Array.create('x', shape=(100,), vartype='BINARY')
x= Array.create('x', shape=(10,100), vartype='BINARY')

上面x是决策变量,下面定义目标函数

def deal_xht(x=x,t=df1.to_numpy(),h=df2.to_numpy(),L=0.08):
     return x*t*(L-L*h-h)

加入罚项

H =-sum(sum(deal_xht())) + 100*(sum(sum(x))-1)**2

编译模型

model = H.compile()
bqm =model.to_bqm()

求解

# 使用模拟退火求解 QUBO 问题
sa = neal.SimulatedAnnealingSampler()
sampleset = sa.sample(bqm, num_reads=1000)

decoded_samples = model.decode_sampleset(sampleset)
best_sample = min(decoded_samples, key=lambda x: x.energy)
print(best_sample.sample)

结果很乱,要筛选一下查看:

for k,v in dict(best_sample.sample).items():
    if v==1:
        min_num=k
        print(k)

可以看到求解出来的还是49号卡第一个阈值。


手写第二问

 选定三张卡,然后找最优阈值组合

还是选读取数据

df=pd.read_csv('../附件/附件1:data_100.csv').iloc[:,:6]
df

 

又是一个筛选技巧,筛选包含"_1"或者"_2"结尾的列 

df1=df.filter(regex='\_1$', axis=1)
df2=df.filter(regex='\_2$', axis=1)
df3=df.filter(regex='\_3$', axis=1)

定义目标函数

def deal(th1,th2,th3,L=0.08):
    sum_t=th1[0]*th2[0]*th3[0]
    mean_h=(th1[1]+th2[1]+th3[1])/3
    return L*sum_t*(1-mean_h)-sum_t*mean_h

遍历找最优

s=time.time()

sum_result=[]
sum_max=[]
sum_yuzhi=[]
for i in range(10):
    for j in range(10):
        for z in range(10):
            a=np.zeros((10,3))
            a[i,0]=1
            a[j,1]=1
            a[z,2]=1
            #print(a)
            x1=a[:,0]   ;  x2=a[:,1]   ;  x3= a[:,2]
            th1=df1[x1!= 0].to_numpy()[0]  ;th2=df2[x2!= 0].to_numpy()[0]; th3=df3[x3!= 0].to_numpy()[0]
            #print(th1)
            re=deal(th1,th2,th3)
            sum_result.append(re)
            sum_max.append(a)
            sum_yuzhi.append([i,j,z,re])
#             break
#         break
#     break
e=time.time()
e-s

 

运行花了0.34秒

查看最大的情况

max_re=np.array([k for k in sum_result]).max()
index=np.array([k for k in sum_result]).argmax()
print(max_re,index)

sum_max[index]

 

阈值为8,1,2时候最大。

遍历的所有情况的最大收入转为数据框,方便后面画图 

from mpl_toolkits.mplot3d import Axes3D
# 创建3D坐标轴
fig = plt.figure(figsize=(8,8),dpi=256)
ax = fig.add_subplot(111, projection='3d')

# 绘制散点图
scatter=ax.scatter(data1['第一张卡阈值'], data1['第二张卡阈值'], data1['第三张卡阈值'], c=data1['利润'], cmap='coolwarm')

# 设置坐标轴标签
ax.set_xlabel('第一张卡阈值')
ax.set_ylabel('第二张卡阈值')
ax.set_zlabel('第三张卡阈值')

cbar = plt.colorbar(scatter,shrink=0.7)
cbar.set_label('利润大小', fontsize=10, rotation=-90, labelpad=10)

plt.tight_layout()
plt.savefig('第二问.png')
plt.show()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇

文章目录 通过CSV文件创建物料主数据的一些建议在DIF中使用CSV文件文件转换器类型BAdIBAdI 示例代码测试 DIF全篇总结 通过CSV文件创建物料主数据的一些建议 在Staging Area中创建/修改小批量的物料主数据,推荐使用标准文件上载功能(USMD_FILE_UPLOAD&am…

计算机基础--Redis

参考文献 https://zhuanlan.zhihu.com/p/599663544 基础知识 1. Redis的数据类型及使用场景 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表)&#xff…

使用assembly插件对boot项目打zip和war部署包

目录 一、maven-assembly-plugin插件的简单使用 1、什么是assembly? 2. 常见的maven插件 3、如何使用? 二、如何通过assembly打不同的包 三、boot项目如何转成war包部署 背景:之前项目上已经使用了assembly对多个boot项目分别打zip包且…

MATLAB应用笔记

其他 1、NaN值 MATLAB判断数据是否为NaN可以直接使用函数:isnan() 三、数据分析 1、相关性 均值、方差、协方差、标准差、相关系数 mean() %均值 nanmean()%去除NAN值求均值 var() %方差 cov() %协方差 std() %标准差 corrcoef(B,b) %R 相关系数plot()…

[ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南

文章目录 一、前言二、SQL Server 主从同步的原理介绍三、具体的搭建过程3.1 准备工作3.1.1 卸载旧版本(如果有,可选,非必须)3.1.2 安装 Docker3.1.3 验证本地 Docker 是否安装成功 3.2 创建 Docker 网络3.3 创建主从节点的 SQL S…

部署环境从docker swarm迁移到k8s后kie-server的发布方式变化(二)

正如后来的考虑, 如果外接maven私库照理说是ok的, 这样去掉volume的设计整个流程更加的自动化标准化. 开搞 第一步先部署一个nexus yaml文件如下: apiVersion: v1 kind: Namespace metadata:name: nexus---apiVersion: v1 kind: Service metadata:labels:k8s-app: nexusname…

【数据结构与算法】八大排序

[数据结构与算法]八大排序 数据结构与算法-八大排序排序的概念及其应用排序的概念排序的应用 常见的排序算法实现常见的排序算法插入排序直接插入排序希尔排序(缩小增量排序)希尔排序的时间复杂度希尔排序对插入排序的优化效果 选择排序直接选择排序堆排序向上调整建堆&#xf…

【C语言】从n个字符串中匹配查找abc字符串个数

目录 前言知识点重温1、scanf和scanf_s区别2、指针3、char、char*使用查找字符串收尾前言 这是小5聊的《C语言知识点例子》系列的第四篇文章。 在软件行业已经有快十年,技术虽然一般般,但是足够应付和解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自…

数据库基础篇 《1. 概述》

目录 1. 为什么要使用数据库 2. 数据库与数据库管理系统 2.1 数据库的相关概念 2.2 数据库与数据库管理系统的关系 2.3 常见的数据库管理系统排名(DBMS) 2.4 常见的数据库介绍 3. MySQL介绍 3.1 概述 3.2 MySQL发展史重大事件 4. RDBMS 与 非RDBMS 4.1 关系型数据库…

Delphi Web Server 流程分析

通过向导 "Web Server Application" (选择 "Stand-alone GUI Application") 创建一个 WebServer Demo。 主单元代码: ...... private FServer: TIdHTTPWebBrokerBridge; procedure StartServer; ............. Delphi的网络组件是基于INDY的&a…

项目四:无极调光台灯

项目四:无极调光台灯 文章目录 项目四:无极调光台灯一、导入(5分钟)学习目的 二、新授(65分钟)1.预展示结果(5分钟)2.本节课所用的软硬件(5分钟)3.硬件介绍(5分钟)4.图形化块介绍(10分钟)5.单个模块的简单使用(10分钟)6.无极调光台灯编程逻辑…

SQLServer的内存管理架构

内存管理架构说明 一、Windows的虚拟内存管理器二、SQL Server 内存体系结构2.1、传统(虚拟)内存2.2、地址窗口扩展 (AWE) 内存 三、从 SQL Server 2012 (11.x) 开始发生的改变3.1、对内存管理的更改3.2、对…

【网络原理】TCP/IP协议

目录 1.应用层 2.传输层(核心问题) 2.1 UDP协议 2.1.2 UDP的特点 2.1.3 基于UDP的应用层协议 2.2 TCP协议(重点内容) 2.2.1 TCP/IP 协议含义 2.2.2 TCP协议端格式: 2.2.3 TCP的特点 2.3 TCP原理 2.4 确认应…

Fork/Join优化mybatis-plus批量插入性能

最近在项目开发中,遇到需要一次性保存100万数据到数据库中。想到以下几种实现方式: 第一种方案:在mapper文件中,实现批量插入动态SQL语句,采用insert into table_name values(?,?,?,),(?,?,?)拼接SQL方式。 &l…

HTTP中ETag语法及使用实战详解

1.1 ETag 是什么 ETag(Entity Tag)是万维网协议 HTTP 的一部分。它是 HTTP 协议提供的若干机制中的一种 Web 缓存验证机制,并且允许客户端进行缓存协商。这使得缓存变得更加高效,而且节省带宽。如果资源的内容没有发生改变&#x…

电脑网速慢怎么解决?4个方法有效提升电脑网速!

案例:电脑网速慢怎么解决 【谁懂啊!我的电脑网速太慢了!总是上不了网,打开浏览器也是一直在转圈圈!太折磨了!这是为什么呢?谁能帮帮我呀!】 随着互联网的发展和普及,电…

继续学c++

由于c里面有很多和c语言很像的东西,这里就来总结一点不像的或者要注意的,或者是我已经快忘记的; 先来一个浮点型也就是实型类型的总结; 知道浮点型有这两个类型:float和double型; 然后float型占四个字节…

To B第六年,腾讯过分温柔

腾讯做2B,方向是正确的,初心是果决的,行动是温柔的,事实是掉队的。 2018年,率先打出“互联网的下半场属于产业互联网”的大旗,宣布“拥抱产业互联网”,腾讯发力To B业务,绝对是有先发…

HTB-Jarvis

HTB-Jarvis 信息收集80端口 www-data(sqlmap)www-data(myPhpAdmin)www-data -> pepperpepper -> root 信息收集 80端口 目录扫描 我啥也没干咋就被ban了,可能是gobuster流量太大被逮住了。 老老实实等90秒,先从已有的目录收集信息。 phpMyAdmin 4…

X 态及基于 VCS 的 X-Propagation 检测

🔥点击查看精选 IC 技能树系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#…