QUBO 与 Ising 求解
unitarylab.library.qubocore 提供八种 CPU 启发式求解器。它们统一最小化 Ising 能量
QUBO 问题应先转换为这一 约定;不同工具对交叉项和常数项的定义可能不同,转换后应手动核验一个小规模能量值。
最小示例
import numpy as np
from unitarylab.library import qubocore
J = np.array([
[0.0, 1.0, -0.5],
[1.0, 0.0, 0.25],
[-0.5, 0.25, 0.0],
])
h = np.array([0.1, 0.0, -0.2])
result = qubocore.bsb_minimize(
J,
h,
n_steps=100,
n_agents=4,
seed=7,
)
print(result)所有求解器接受 NumPy 兼容的实数输入并返回字典。公共字段如下:
| 字段 | 形状 | 说明 |
|---|---|---|
spins | (N,) | 能量最低的自旋配置 |
energy | 标量 | spins 对应的 Ising 能量 |
all_spins | (n_agents, N) | 每个代理保留的候选配置 |
all_energies | (n_agents,) | 每个候选配置的能量 |
n_steps | 标量 | 本次求解使用的迭代步数 |
方法特有的诊断字段不属于公共结果契约;调用方应按上表读取通用结果。
求解器与参数
| 入口 | 方法 | 主要专属参数 |
|---|---|---|
bsb_minimize | ballistic Simulated Bifurcation | n_steps=1000、dt=1.0、c0=None、a0=1.0 |
dsb_minimize | discrete Simulated Bifurcation | n_steps=1000、dt=1.0、c0=None、a0=1.0 |
asb_minimize | adiabatic Simulated Bifurcation | n_steps=1000、dt=0.5、xi0=None、a0=1.0 |
simcim_minimize | SimCIM | dt=0.01、momentum=0.9、epsilon=0.05、sigma=0.03、v_start=0、v_end=2、x_sat=1 |
cim_minimize | coherent Ising machine | p=2、A_s=1、epsilon=0.1、n_steps=3000、dt=0.01 |
oim_minimize | oscillator Ising machine | K_c=None、K_s_final=5、K_s_schedule="linear"、integrator="rk4"、sigma=0 |
phia_minimize | parallel heat-bath inspired annealing | n_steps=200、L=30、eps=0.01、gamma=5、beta_init=0.1、beta_final=15 |
gahmc_minimize | generalized-acceptance HMC | total_trajectory_length=100、beta=10、n_samples=500 |
除表中参数外,所有方法都有 J、可选 h、n_agents 和 seed;各方法的默认 n_agents 不完全相同。seed=None 使用系统随机源,设置整数种子可以复现实验。asb_minimize() 不支持局部场 h。
输入约束
J必须是实数方阵,h必须是一维实数向量且长度匹配;复数输入会触发TypeError。- 数值参数必须有限;步数、代理数和采样数应为整数。
c0、xi0、K_c等设为None时由求解器自动标定;显式值必须为正。K_s_schedule和integrator只接受各自支持的字符串选项。- 启发式方法不保证得到全局最优解。实际使用时应增加
n_agents、尝试多个种子,并用统一能量公式重新计算候选解。
方法选择
先以默认参数比较多种求解器,再针对问题规模调节步数和代理数。normalize_j=True 的方法会对耦合矩阵进行内部归一化;跨方法比较时,应始终使用原始 重新计算最终能量。
相关页面
最后更新于