【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 本文提供了2023年MathorCup大数据竞赛B题的电商零售商家需求预测及库存优化问题的Python代码解析,涉及数据预处理、特征工程、时间序列预测、聚类分析以及模型预测性能评价等步骤。

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析

1 题目

2023 年MathorCup 高校数学建模挑战赛——大数据竞赛赛道B:电商零售商家需求预测及库存优化问题电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库,电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策,大数据智能驱动的供应链可以显著降低库存成本,同时保证商品的按时履约。一般来说,以上供应链优化问题会包含以下方面:

(1)需求预测

预测往往是智能供应链的决策基础,它可以让管理者提前预知各地的需求,从而将库存提前放在靠近需求的仓库中,此时的预测任务为:根据历史一段时间的需求量,预测各仓库中各商品未来需求,“预测维度”即为不同商家在各仓库中存放的各种商品每天的数量。一般来说,企业会首先根据数据的历史情况,分析出需求量序列的数理特征,对相似的需求量序列进行归类,并根据分类结果做到更加精准的预测。预测准确率有很多评价指标,较常用的指标为 1-wmape,定义如下:
$$1-wmape = 1-\frac{\sum {|y_i-\hat{y_i}|}}{\sum{y_i}} $$

其中yi​为第个序列(商家在各仓库中存放的各种商品每天的数量)的真实需求量,$ \hat{y_i} $​为第个序列的预测需求量。

然而,在实际的电商供应链预测任务中,常常会出现多种不同的问题。例如,部分商品的销售时间过短、仓库存在新增或切换等情况,导致该预测维度下历史数据过少;另外,部分大型促销期间货量的陡增并由此带来的不规律性,也给需求量的精准预测带来了不小的难度。此时便需要通过算法得到历史一般规律,找出相似的历史情况(如相似的仓或商品),从而实现精准预测。

(2)库存优化

为了有效管理库存水平,企业通常会制定各种库存策略来控制商品的补货频次和补货量。定期盘点库存策略(s,S)是一种常见的库存策略,其中

s 表示该种策略下的库存下限,S 为库存上限。在这种策略中,企业会每隔一段固定时间查看库存水平,盘点之间的间隔设为盘点周期(NRT)。如果在盘点时库存水平T 低于最小库存水平s,则会将库存补充至S,此时的补货量 Q = S − T,如果在盘点时库存水平高于 s,则不进行补充,直到下一次库存盘点。同时需要考虑到,在每次发起补货后,补充的货物会经过一定时间后才能到达当前仓库,这个时间间隔为提前期(LT)。

使用以上的库存策略,管理者需要对两个方面进行权衡取舍。一方面,为了及时满足用户订单,公司需要保有大量库存以防止缺货;另一方面,库存水位升高带来了过高的库存成本。库存优化的目标主要为:

1) 降低库存总持有成本,可由单位持有成本h 得到(一件商品存储一天产生的成本);

2) 满足服务水平:确保有足够的产品可以及时满足客户需求,降低总缺货成本,可由缺货成本得到(每天每缺一件商品产生的成本);

3) 降低库存周转天数:库存周转天数越小,表示库存的流动性越好,企业的库存管理效率越高。

服务水平及库存周转天数计算公式为:
$$ 服务水平=\\frac{被满足的商品件数}{实际需求总件数} × 100 % \\ 库存周转天数 =\\frac{期初库存书刘昂+期末库存数量}{2}× \\frac{计算时间段内天数}{计算时间段内总销量} $$

现有一张电商零售商家的历史出货量表(附件 1),给出了历史 6 个月各商家存放在电商不同仓库的商品每天的出货量。假设该出货量即为历史各商品在各仓库的需求量。同时,还可以取到各商品、商家、仓库的信息(附件 2-4),例如分类、品牌、生效日期等,这些信息的选择和引入会帮助更好的预测并管理供应链中的库存。

1.1 初赛问题

问题一: 使用附件 1-4 中的数据, 预测出各商家在各仓库的商品2023-05-16 至 2023-05-30 的需求量,请将预测结果填写在结果表 1 并上传至竞赛平台,并对你们模型的预测性能进行评价。另外请讨论:根据数据分析及建模过程,这些由商家、仓库、商品形成的时间序列如何分类,使同一类别在需求上的特征最为相似?

**问题二:**现有一些新出现的商家+仓库+商品维度(附件 5),导致这种情况出现的原因可能是新上市的商品,或是改变了某些商品所存放的仓库。请讨论这些新出现的预测维度如何通过历史附件 1 中的数据进行参考,找到相似序列并完成这些维度在 2023-05-16 至 2023-05-30 的预测值。请把预测结果填写在结果表 2,并上传至竞赛平台。

**问题三:**每年 6 月会出现规律性的大型促销,为需求量的精准预测以及履约带来了很大的挑战。附件 6 给出了附件 1 对应的商家+仓库+商品维度在去年双十一期间的需求量数据,请参考这些数据,给出 2023-06-01 至2023-06-20 的预测值。请把预测结果填写在结果表 3,并上传至竞赛平台。

注:结果表 1-3 打包一个压缩包,“结果表.zip”,提交 zip 文件到竞赛系统中。

附件1-4的字段说明:

附件 1:商家历史出货量表

字段名 字段类型 描述
seller_no String 商家编码
product_no String 商品编码
warehouse_no String 仓库编码
date String 日期
qty Float 出货量(可看做需求量)

附件 2:商品信息表

字段名 字段类型 描述
product_no String 商品编码
category1 String 商品一级分类
category2 String 商品二级分类
category3 String 商品三级分类

附件 3:商家信息表

字段名 字段类型 描述
seller_no String 商家编码
seller_category String 商家分类
inventory_category String 库存分类
seller_level String 商家规模

附件 4:仓库信息表

字段名 字段类型 描述
warehouse_no String 仓库编码
warehouse_category String 仓库类别
warehouse_region String 仓库区域

2 问题分析

2.1 问题一

(1)数据预处理:读取附件1-4的数据文件,进行数据清洗和转换,可考虑进行以下操作:

  • 将“日期”字段转换为datetime格式,并提取出年、月、日等信息;
  • 将附件2、3、4中的分类信息进行Label Encoding,将分类信息转换为数字标签;
  • 可以通过统计分析、可视化等手段对数据进行初步探索和分析,例如:
    • 商家、仓库、商品的数量分布情况;
    • 商家、仓库、商品之间的相关性分析等。

(2)特征工程:对表格进行透视或分组操作,生成对应时间序列的统计特征,例如:

  • 统计每个商家在每个仓库中每天/周/月的平均销量、总销量、销售额等信息;
  • 构建时间窗口特征,例如每个商家在每个仓库中最近1周、1个月、3个月、6个月等时间段内的销售量、均值以及波动情况等。

(3)时间序列预测:针对每个商家、仓库、商品的时间序列统计特征,使用ARIMA、Prophet、LSTM等时间序列预测模型进行预测,并得出下一个时间段内的需求量预测值。代码实现以ARIMA为例。

(4)结果输出:按照表5的格式输出预测结果

(5)分类方法:可以考虑聚类算法,将同一类别的商家、仓库、商品按照需求量相似性进行分组,然后对每一个簇进一步分析,例如:

  • K-means算法:基于样本的相似性对样本进行分群;
  • 层次聚类算法:将潜在的类别从候选集合中逐层聚合。
    (6)相似性评测:通过度量分类以上聚类结果的质量,计算同一类别内的商家、仓库、商品之间的相似程度,以便为商家提供更加精准的预测及建议。常用的质量评价标准有轮廓系数、Calinski-Harabasz指数、Davies-Bouldin指数等。
    (7)反馈优化:根据预测结果和分类分析的结果,进一步分析结论,给商家几个建议和优化方案。

2.2 问题二

(1)对附件1中所有商家、仓库、商品组合,按时间顺序生成其历史出货量时间序列,对于新增的商家+仓库+商品维度在附件5中可以视为只有一条历史记录。

(2)对于新增的商家+仓库+商品维度,在附件1中搜索与其最为相似的历史时间序列,可以使用聚类分析或其他相似度度量方法进行相似性计算。代码中采用欧式距离的方式。使用cdist()函数计算子集(seller_no和warehouse_no相同)的qty列和附件5的qty列之间计算欧氏距离。最后使用np.argmin()函数找到距离数组distances中具有最小值的索引值。这表示找到了在附件5中最相似的历史序列。

(3)将找到的最为相似的历史时间序列作为该新增维度的需求量时间序列,使用与问题一相同的方法进行预测并填写结果表2。

2.3 问题三

(1)使用附件1中给出的商家+仓库+商品的历史需求量数据,加上附件6中相应的需求量数据,按照时间顺序生成历史需求量时间序列。

(2)对历史时间序列进行特征工程,提取时间维度,周几、月份、节假日等特征,并进行预处理操作(如平滑、滑动平均等)。

(3)使用时间序列预测模型进行训练,并对2023-06-01 至2023-06-20 的需求量进行预测。

3 代码实现

3.1 问题一

import pandas as pd
import numpy as np
from datetime import datetime
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt

import  warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['STSong']

(1)数据预处理

对类别特征编码

# 数据预处理
# 读取商家历史出货量表
df_sales = pd.read_excel('附件表/附件1-商家历史出货量表.xlsx')

# 将日期字段转换为datetime格式
df_sales['date'] = pd.to_datetime(df_sales['date'])
df_sales['year'] = df_sales['date'].dt.year
df_sales['month'] = df_sales['date'].dt.month
df_sales['day'] = df_sales['date'].dt.day

# 读取商品信息表
df_product = pd.read_excel('附件表/附件2-商品信息表.xlsx')
# 使用Label Encoder对商品分类信息进行编码
le = LabelEncoder()
df_product['category1'] = le.fit_transform(df_product['category1'])
df_product['category2'] = le.fit_transform(df_product['category2'])
df_product['category3'] = le.fit_transform(df_product['category3'])

# 读取商家信息表
df_seller = pd.read_excel('附件表/附件3-商家信息表.xlsx')
# 使用Label Encoder对商家分类信息进行编码
df_seller['seller_category'] = le.fit_transform(df_seller['seller_category'])
df_seller['inventory_category'] = le.fit_transform(df_seller['inventory_category'])
df_seller['seller_level'] = le.fit_transform(df_seller['seller_level'])

# 读取仓库信息表
df_warehouse = pd.read_excel('附件表/附件4-仓库信息表.xlsx')

# 使用Label Encoder对仓库分类信息进行编码
df_warehouse['warehouse_category'] = le.fit_transform(df_warehouse['warehouse_category'])
df_warehouse['warehouse_region'] = le.fit_transform(df_warehouse['warehouse_region'])

(2)统计商家、仓库、商品的数量分布情况

# 统计商家、仓库、商品的数量分布情况
seller_count = df_sales['seller_no'].nunique()
warehouse_count = df_sales['warehouse_no'].nunique()
product_count = df_sales['product_no'].nunique()
print("商家数量:", seller_count)
print("仓库数量:", warehouse_count)
print("商品数量:", product_count)

# 商家、仓库、商品之间的相关性分析
sales_groupby_seller = df_sales.groupby('seller_no')['qty'].sum().reset_index()
sales_groupby_warehouse = df_sales.groupby('warehouse_no')['qty'].sum().reset_index()
sales_groupby_product = df_sales.groupby('product_no')['qty'].sum().reset_index()

plt.figure(figsize=(10, 4))
plt.subplot(131)
plt.bar(sales_groupby_seller['seller_no'], sales_groupby_seller['qty'])
plt.xlabel('商家编码')
plt.ylabel('销售量')
plt.title('商家销售量分布')

plt.subplot(132)
plt.bar(sales_groupby_warehouse['warehouse_no'], sales_groupby_warehouse['qty'])
plt.xlabel('仓库编码')
plt.ylabel('销售量')
plt.title('仓库销售量分布')

plt.subplot(133)
plt.bar(sales_groupby_product['product_no'], sales_groupby_product['qty'])
plt.xlabel('商品编码')
plt.ylabel('销售量')
plt.title('商品销售量分布')

plt.tight_layout()
plt.savefig('img/1.png',dpi=200)
plt.show()

商家数量: 35
仓库数量: 54
商品数量: 1212

在这里插入图片描述

(2)特征工程

# 统计每个商家在每个仓库每个商品中每天的平均销量、总销量等信息
sales_agg = df_sales.groupby(['seller_no','product_no', 'warehouse_no', 'date']).agg({
    'qty': ['mean', 'sum']
}).reset_index()
sales_agg.columns = ['seller_no','product_no','warehouse_no', 'date', 'avg_qty', 'total_qty']
# # 构建时间窗口特征
sales_agg['rolling_mean_7d'] = sales_agg.groupby(['seller_no','product_no','warehouse_no'])['total_qty'].rolling(7).mean().reset_index(2, drop=True).reset_index()['total_qty']
sales_agg['rolling_mean_30d'] = sales_agg.groupby(['seller_no','product_no', 'warehouse_no'])['total_qty'].rolling(30).mean().reset_index(2, drop=True).reset_index()['total_qty']
sales_agg['rolling_std_30d'] = sales_agg.groupby(['seller_no','product_no', 'warehouse_no'])['total_qty'].rolling(7).std().reset_index(2, drop=True).reset_index()['total_qty']
sales_agg

在这里插入图片描述

(3)时间序列预测

店铺、商品、仓库对应的每一个时间序列,都要建立一个模型

from statsmodels.tsa.arima.model import ARIMA

df = sales_agg
# 选取一个seller、产品、仓库,每个都要计算一遍
seller_list = sales_agg['seller_no'].unique()
warehouse_list = sales_agg['warehouse_no'].unique()
product_list = sales_agg['product_no'].unique()
result_table1 = []

df1_grouped = sales_agg.groupby(['seller_no','product_no','warehouse_no'])
for (seller_no,product_no,warehouse_no), df1_group in df1_grouped:


    # # 训练模型
    model = ARIMA(ts_data, order=(1, 1, 1)).fit()
    # # 预测
    predict = model.predict(start=len(ts_data)+1, end=len(ts_data)+15, dynamic=True)

    # # 将预测值转化成DataFrame并返回
    result = pd.DataFrame(columns=['seller_no','product_no','warehouse_no','date','forecast_qty'])
    result['seller_no'] = [seller_no]*15
    result['product_no'] = [product_no]*15
    result['warehouse_no'] = [warehouse_no]*15
    result['date']= pd.date_range(start='2023-05-16', periods=15, freq='D')
    result['forecast_qty'] = list(predict)
    result_table1.append(result)
merged_df = pd.concat(result_table1, axis=0, ignore_index=True)
merged_df.to_excel('结果表/结果表1-预测结果表.xlsx',index=False)

(4)聚类分析

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import LabelEncoder

# 读取商家历史出货量表
df_sales = pd.read_excel('附件表/附件1-商家历史出货量表.xlsx')
# 读取商品信息表
df_product = pd.read_excel('附件表/附件2-商品信息表.xlsx')
# 读取商家信息表
df_seller = pd.read_excel('附件表/附件3-商家信息表.xlsx')
# 读取仓库信息表
df_warehouse = pd.read_excel('附件表/附件4-仓库信息表.xlsx')

# 将日期转换为时间序列
df_sales['date'] = pd.to_datetime(df_sales['date'])
# 合并商家历史出货量表和商品信息表
df_merge = df_sales.merge(df_product, on='product_no')
# 合并商家历史出货量表、商品信息表和商家信息表
df_merge = df_merge.merge(df_seller, on='seller_no')
# 合并商家历史出货量表、商品信息表、商家信息表和仓库信息表
df_merge = df_merge.merge(df_warehouse, on='warehouse_no')
# 选择需要的特征列
df_feature = df_merge[['seller_no', 'product_no', 'warehouse_no', 'category1', 'category2', 'category3', 'seller_category','inventory_category', 'seller_level', 'warehouse_category', 'warehouse_region', 'qty']]

# 对分类特征进行编码
# 创建LabelEncoder对象
label_encoder = LabelEncoder()

# 需要进行数值编码的列名
cat_cols = ['category1', 'category2', 'category3', 'seller_category','inventory_category', 'seller_level', 'warehouse_category', 'warehouse_region']

# 循环对每个类别特征进行数值编码
for col in cat_cols:
    df_feature[col] = label_encoder.fit_transform(df_feature[col])

df_feature

在这里插入图片描述

# 对数值特征进行归一化
from sklearn.preprocessing import MinMaxScaler

# 创建MinMaxScaler对象
scaler = MinMaxScaler()
df_feature_2 = df_feature.drop(columns=['seller_no','product_no','warehouse_no'])
# 对df_feature进行归一化
df_feature_normalized = pd.DataFrame(scaler.fit_transform(df_feature_2), columns=df_feature_2.columns)
df_feature_normalized

在这里插入图片描述

选择最佳的聚类K值和随机种子

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 创建一个空列表存储不同K值下的SSE得分
sse_scores = []

# 定义待测试的K值范围
k_values = range(2, 10)

# 定义最佳的K值和随机种子变量
best_k = 0
best_random_state = 0
best_sse = float('inf')  # 初始值设为正无穷大

# 循环测试不同的K值和随机种子
for k in k_values:
    for random_state in range(10):
        # 初始化KMeans模型
        kmeans = KMeans(n_clusters=k, random_state=random_state)
        # 训练模型
        kmeans.fit(df_feature_normalized)

        # 计算SSE得分并存储到列表中
        sse = kmeans.inertia_
        sse_scores.append((k, random_state, sse))

        # 比较得分,更新最佳的K值和随机种子
        if sse < best_sse:
            best_k = k
            best_random_state = random_state
            best_sse = sse

# 打印最佳的K值和随机种子
print("最佳的K值:", best_k)
print("最佳的随机种子:", best_random_state)

最佳的K值: 3
最佳的随机种子: 7

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
best_k = 3
best_random_state = 7
# 可视化最佳K值和随机种子下的聚类结果
kmeans_best = KMeans(n_clusters=best_k, random_state=best_random_state)
kmeans_best.fit(df_feature_normalized)
labels = kmeans_best.labels_

# 使用PCA将数据降至3维
pca = PCA(n_components=3)
df_feature_3d = pca.fit_transform(df_feature_normalized)

# 可视化最佳K值和随机种子下的聚类结果
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(df_feature_3d[:, 0], df_feature_3d[:, 1], df_feature_3d[:, 2], c=labels, cmap='viridis')
ax.set_title('Clustering Result (K={}, Random State={})'.format(best_k, best_random_state))
plt.savefig('img/2.png',dpi=300)
plt.show()

在这里插入图片描述

根据以上的聚类效果,建议再进一步数据分析每个簇的数据,具有哪些共同特征,然后反馈得到结论。

3.2 问题二

遍历附件5的序列数据,在附件1中查找相似的序列数据,这里采用的欧式距离,建议其他相似度计算方式。

实现原理是,通过groupby方法,将附件5和附件1 的数据分组,得到时间序列数据,只要在附件1中找到最相似的时间序列,就用此序列来训练模型,以此来预测未来的数据,作为附件5的预测结果。因为附件5中只有33个样本,是不足以拿来直接训练模型的,而附件1中又166个样本,训练的模型更可靠。算是一种模糊预测。

注意在计算欧式距离时,需要两个序列长度是一样的,那就取附件1中的倒数的数据和附件5中的数据对齐,意思是都是选择最新的数据对其来计算相似度。

import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from statsmodels.tsa.arima.model import ARIMA
from scipy.spatial.distance import euclidean
import  warnings
warnings.filterwarnings('ignore')
# 读取附件1和附件5的数据
df1 = pd.read_excel('附件表/附件1-商家历史出货量表.xlsx')
df5 = pd.read_excel('附件表/附件5-新品历史出货量表.xlsx')

# 整理成合适的数据格式,使用Pandas的DataFrame
df1['date'] = pd.to_datetime(df1['date'])
df1 = df1.sort_values('date')
df5['date'] = pd.to_datetime(df5['date'])
df5 = df5.sort_values('date')
# 根据附件5中的新维度,在附件1的数据中找到相似的历史序列
# 对df1按照seller_no、warehouse_no、product_no分组,得到每个组内的数据。
# 类似pivot table,但是pivot table之后需要reset_index,但是groupby不用,因此groupby更方便
df1_grouped = df1.groupby(['seller_no', 'warehouse_no', 'product_no'])

# 对df5按照seller_no、warehouse_no、product_no进行groupby
df5_grouped = df5.groupby(['seller_no', 'warehouse_no', 'product_no'])

# 计算每一个df5的序列与df1的每一个序列的距离,选择最小距离的序列作为匹配的序列
result = []
i = 0
for (seller_no, warehouse_no, product_no), df5_group in df5_grouped:
    min_distance = float('inf') # 初始化最小距离为无穷大
    matched_sequence = None # 初始化匹配的序列为None
    for (s1, w1, p1), df1_group in df1_grouped:
        seq1 = list(df5_group['qty'])
        seq2 = list(df1_group['qty'])

        # 向前补充0使得seq1和seq2的长度相同
        if len(seq1) < len(seq2):
            seq2 = seq2[-len(seq1):]
        elif len(seq1) > len(seq2):
            seq1  = seq1[-len(seq2):]
        distance = euclidean(seq1,seq2)# 计算距离
        if distance < min_distance:
            min_distance = distance
            matched_sequence = (s1, w1, p1,seller_no, warehouse_no, product_no)
            result.append(matched_sequence)
# 将结果输出到DataFrame中
result_df = pd.DataFrame(result, columns=['seller_no_df1', 'warehouse_no_df1', 'product_no_df1', 'seller_no_df5', 'warehouse_no_df5', 'product_no_df5'])
result_df.to_excel('结果表/问题2-相似序列表.xlsx',index=False)
print(result_df.head())

在这里插入图片描述

根据相似的序列来建模并预测,作为附件5的预测结果


# 进行预测
from statsmodels.tsa.arima.model import ARIMA

df1 = pd.read_excel('附件表/附件1-商家历史出货量表.xlsx')
df5 = pd.read_excel('附件表/附件5-新品历史出货量表.xlsx')
result_df = result_df.drop_duplicates(subset=['seller_no_df5', 'warehouse_no_df5', 'product_no_df5'])

result_table2 = []
for index, row in result_df.iterrows():
    seller_no, warehouse_no,product_no, seller_no_df5, product_no_df5, warehouse_no_df5 = row
    # 类别销售数据按照日期排序
    ts_data = df1[(df1['seller_no'] == seller_no)& (df1['product_no'] == product_no) & (df1['warehouse_no'] == warehouse_no)][['date', 'qty']]
    if len(ts_data)>0:
        ts_data = ts_data.sort_values('date')
        ts_data = ts_data.set_index('date')
        # # 训练模型
        model = ARIMA(ts_data, order=(1, 1, 1)).fit()
        # # 预测
        predict = model.predict(start=len(ts_data)+1, end=len(ts_data)+15, dynamic=True)

        # # # 将预测值转化成DataFrame并返回
        result = pd.DataFrame(columns=['seller_no','product_no','warehouse_no','date','forecast_qty'])
        result['seller_no'] = [seller_no_df5]*15
        result['product_no'] = [product_no_df5]*15
        result['warehouse_no'] = [warehouse_no_df5]*15
        result['date']= pd.date_range(start='2023-05-16', periods=15, freq='D')
        result['forecast_qty'] = list(predict)

        result_table2.append(result)

保存为提交结果

pd.concat(result_table2, axis=0, ignore_index=True).to_excel('结果表/结果表2-预测结果表.xlsx', index=False)

在这里插入图片描述

3.3 问题三

请下载完整代码

4 下载方式

目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 TensorFlow
深入骨髓的解析:Python中神经网络如何学会‘思考’,解锁AI新纪元
【9月更文挑战第11天】随着科技的发展,人工智能(AI)成为推动社会进步的关键力量,而神经网络作为AI的核心,正以其强大的学习和模式识别能力开启AI新纪元。本文将探讨Python中神经网络的工作原理,并通过示例代码展示其“思考”过程。神经网络模仿生物神经系统,通过加权连接传递信息并优化输出。Python凭借其丰富的科学计算库如TensorFlow和PyTorch,成为神经网络研究的首选语言。
8 1
|
13天前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
29 1
|
5天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
25 0
|
13天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
34 0
|
13天前
|
开发者 图形学 C#
揭秘游戏沉浸感的秘密武器:深度解析Unity中的音频设计技巧,从背景音乐到动态音效,全面提升你的游戏氛围艺术——附实战代码示例与应用场景指导
【8月更文挑战第31天】音频设计在游戏开发中至关重要,不仅能增强沉浸感,还能传递信息,构建氛围。Unity作为跨平台游戏引擎,提供了丰富的音频处理功能,助力开发者轻松实现复杂音效。本文将探讨如何利用Unity的音频设计提升游戏氛围,并通过具体示例代码展示实现过程。例如,在恐怖游戏中,阴森的背景音乐和突然的脚步声能增加紧张感;在休闲游戏中,轻快的旋律则让玩家感到愉悦。
27 0
|
13天前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
34 0
|
13天前
|
图形学 开发者
【Unity光照艺术手册】掌握这些技巧,让你的游戏场景瞬间提升档次:从基础光源到全局光照,打造24小时不间断的视觉盛宴——如何运用代码与烘焙创造逼真光影效果全解析
【8月更文挑战第31天】在Unity中,合理的光照与阴影设置对于打造逼真环境至关重要。本文介绍Unity支持的多种光源类型,如定向光、点光源、聚光灯等,并通过具体示例展示如何使用着色器和脚本控制光照强度,模拟不同时间段的光照变化。此外,还介绍了动态和静态阴影、全局光照及光照探针等高级功能,帮助开发者创造丰富多样的光影效果,提升游戏沉浸感。
31 0
|
13天前
|
开发者 图形学 UED
深度解析Unity游戏开发中的性能瓶颈与优化方案:从资源管理到代码执行,全方位提升你的游戏流畅度,让玩家体验飞跃性的顺滑——不止是技巧,更是艺术的追求
【8月更文挑战第31天】《Unity性能优化实战:让你的游戏流畅如飞》详细介绍了Unity游戏性能优化的关键技巧,涵盖资源管理、代码优化、场景管理和内存管理等方面。通过具体示例,如纹理打包、异步加载、协程使用及LOD技术,帮助开发者打造高效流畅的游戏体验。文中提供了实用代码片段,助力减少内存消耗、提升渲染效率,确保游戏运行丝滑顺畅。性能优化是一个持续过程,需不断测试调整以达最佳效果。
30 0
|
13天前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
38 0
|
13天前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
17 0

热门文章

最新文章

推荐镜像

更多