2025年第十五届亚太地区大学生数学建模竞赛之五岳杯量子计算数学建模挑战赛

复制代码
import numpy as np
import kaiwu.optimizer as optimizer
import kaiwu.solver as solver
import matplotlib.pyplot as plt
# ====================== 步骤1:构建Qubo模型的Q矩阵(自动驾驶场景) ======================
# 变量数:200(100个路径节点+50个传感器+50个算力任务)
n_vars = 200
# 初始化Q矩阵(对称矩阵,Qubo模型核心)
Q = np.zeros((n_vars, n_vars))
# 1. 填充对角元(对应单个变量的基础贡献:时间+能耗+风险)
# 模拟路径节点时间贡献(a_i)、传感器能耗(c_j)、算力任务风险(e_l)
np.random.seed(42)  # 固定随机种子保证可复现
a_i = np.random.uniform(1, 10, size=100)  # 路径节点基础时间
c_j = np.random.uniform(0.5, 5, size=50)  # 传感器基础能耗
e_l = np.random.uniform(2, 8, size=50)   # 算力任务基础风险
# 权重(时间w1=0.4,能耗w2=0.3,风险w3=0.3)
w1, w2, w3 = 0.4, 0.3, 0.3
# 填充对角元:前100个为路径节点,100-150为传感器,150-200为算力任务
Q[:100, :100] = np.diag(w1 * a_i)
Q[100:150, 100:150] = np.diag(w2 * c_j)
Q[150:200, 150:200] = np.diag(w3 * e_l)
# 2. 填充非对角元(变量间协同贡献:节点转移时间、传感器协同能耗、任务风险叠加)
# 模拟节点转移时间b_ij(仅填充前100×100区域,随机生成对称矩阵)
b_ij = np.random.uniform(0.1, 2, size=(100, 100))
b_ij = (b_ij + b_ij.T) / 2  # 保证对称
Q[:100, :100] += w1 * b_ij / 2  # 非对角元需除以2避免重复计算
# 3. 添加约束惩罚项(算力上限约束)
lambda1 = 30  # 惩罚系数(实验验证的平衡值)
C_max = 50    # 算力上限
g_l = np.random.uniform(0.5, 2, size=50)  # 算力任务占用量
# 惩罚项展开:λ*(Σg_l x_l - C_max)² = λ*(Σg_l²x_l² + 2Σg_l g_p x_l x_p - 2C_maxΣg_l x_l + C_max²)
# 因x_l是0-1变量,x_l²=x_l,故惩罚项融入Q矩阵:
penalty_diag = lambda1 * (g_l **2 - 2 * C_max * g_l)  # 对角元惩罚
penalty_offdiag = lambda1 * 2 * np.outer(g_l, g_l)    # 非对角元惩罚
Q[150:200, 150:200] += np.diag(penalty_diag)
Q[150:200, 150:200] += penalty_offdiag / 2  # 非对角元除以2
# ====================== 步骤2:初始化Qubo优化器 ======================
# 加载Q矩阵到优化器
qubo_opt = optimizer.QuboOptimizer()
qubo_opt.set_qubo_matrix(Q)  # 传入200×200的Q矩阵
# ====================== 步骤3:配置模拟退火求解器 ======================
# 初始化求解器
sa_solver = solver.SimulatedAnnealingSolver()
# 设置核心参数(匹配竞赛要求)
sa_solver.set_params(
    temperature_decay=0.95,  # 退火温度衰减系数
    max_iter=10000,          # 迭代次数
    init_solution_method="random"  # 初始解生成方法:随机
)
# ====================== 步骤4:执行求解 ======================
# 传入优化器求解
result = sa_solver.solve(qubo_opt)
# ====================== 步骤5:结果解析与可视化 ======================
# 提取核心结果
optimal_solution = result["optimal_solution"]  # 最优解(200维0-1数组)
optimal_value = result["optimal_value"]        # 最优目标函数值
iteration_curve = result["iteration_curve"]    # 迭代过程目标函数值曲线
# 输出关键信息
print("===== 求解结果 =====")
print(f"最优目标函数值:{optimal_value:.4f}")
print("最优解(前10个变量):", optimal_solution[:10])
# 解析最优解对应的实际决策(示例)
selected_nodes = np.where(optimal_solution[:100]==1)[0]  # 选中的路径节点
selected_sensors = np.where(optimal_solution[100:150]==1)[0] + 100  # 开启的传感器
print(f"选中的路径节点数量:{len(selected_nodes)},节点索引:{selected_nodes[:5]}")
print(f"开启的传感器数量:{len(selected_sensors)},传感器索引:{selected_sensors[:5]}")
# 绘制迭代曲线
plt.figure(figsize=(10, 6))
plt.plot(iteration_curve, label="目标函数值")
plt.xlabel("迭代次数")
plt.ylabel("目标函数值")
plt.title("模拟退火求解迭代过程")
plt.legend()
plt.grid(True)
plt.savefig("iteration_curve.png")
plt.show()
相关推荐
数模竞赛Paid answer3 小时前
2025年五一杯数学建模A题支路车流量推测问题求解全过程论文及程序
数学建模·数据分析·五一杯
Tasiorh5 小时前
数学建模预测模型汇总
数学建模
数模竞赛Paid answer1 天前
2025年深圳杯数学建模B题LED显示屏颜色转换设计与校正解题全过程文档及程序
数学建模·数据分析·深圳杯
Tasiorh1 天前
《SVM支持向量机》在数学建模中实际运用
算法·机器学习·支持向量机·数学建模·svm
算法黑哥1 天前
2026数学建模Latex快速全局精讲
数学建模
维度攻城狮3 天前
基于状态空间方程的倒立摆控制方法详解——从数学建模到Python仿真实现
python·数学建模·倒立摆·状态空间
Tasiorh3 天前
《熵权法》在数学建模中实际运用
数学建模·topsis·熵权法·美赛·评价类
NoteStream9 天前
从数学建模到电子信息:我的编程学习路线规划与成长记录
c语言·数据结构·c++·学习·数学建模
逻辑君9 天前
The Null Epoch 游戏研究报告(4)
人工智能·深度学习·游戏·机器学习·数学建模
2301_7644413311 天前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模