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()
相关推荐
by————组态12 小时前
Ricon组态适用领域全景解析:工业制造、能源、市政民生与智慧城市四大场景落地实践
后端·物联网·数学建模·智慧城市·能源·制造·组态
2601_960356382 天前
2027届数学与应用数学本科生转行业研究助理:岗位、数据能力与项目准备
数学建模
2501_933670793 天前
2027届数学与应用数学转经营分析:SQL、财务指标与业务指标补齐路线
数据库·sql·数学建模
Martina_03213 天前
山谷地形下雨后湿痕总往坡上爬?用6步检查高度场、流向遮罩与分区加载
人工智能·游戏·数学建模·3d·自然语言处理·aigc·关卡设计
Martina_03213 天前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
考研保研资料分享4 天前
电子信息保研经验合辑:复旦直博与北邮集成电路,夏令营、预推免和专业面试
数学建模·面试·职场和发展·信息与通信
蒲公英eric5 天前
人口增长问题:从 Malthus 到 Logistic 的建模之旅
人工智能·python·数学建模·人口增长问题
Martina_03216 天前
同一片森林换个镜头就忽冷忽暖?用6步统一曝光、LUT与相机后处理
人工智能·游戏·数学建模·3d·自然语言处理·aigc·游戏策划
蒲公英eric7 天前
Python工具链与LaTeX排版:把兵器配齐
人工智能·python·算法·数学建模·数学建模工具
当时皓月7 天前
Spur Generation and Modulation(杂散的产生与调制)
数学建模·芯片