国内量子计算机完美求解D-wave应用案例(内含万能转化代码)

量子麻小
2024-09-27 14:25:44

D-Wave是全球首个商业量子计算机供应商,也堪称量子计算领域的龙头。截至 年,已经开发了数百个用户构建的早期应用程序,拥有34,000 名开发者。

应用类型包括肽设计、员工调度、最后一英里车辆路线规划、作业车间调度、金融投资组合回报优化、农场到市场的食品配送、数字营销、有机发光二极管(OLED)材料开发、金融风险降低、营销活动优化、集装箱物流、核糖核酸折叠和临床试验优化。包括制造业、物流、金融服务、生命科学、能源和电信在内的垂直领域将受益于量子计算的处理能力。

但是这家公司因为一些原因,对我国不进行开放。所以就萌生了使用国内的量子计算机,去解其应用案例。

D-wave案例总计55个,今天展开来讲N皇后案例

N皇后介绍

n-皇后问题是指把n个皇后放在n*n个棋盘上,这样没有两个皇后能够互相攻击的问题。

下面是一个6皇后问题的答案示例:

虽然 n-皇后问题更常用于理论研究,但它已被证明有其应用。例如,在需要防止死锁的系统中,解决 n-皇后问题相当于找到一组无死锁路径[41.其他利用 n-皇后问题的实际应用包括并行存储器存储方案、VLSI测试和交通控制.

这个例子演示了如何将n-queens问题定义为二次无约束二元优化(QUBO)问题,然后我们用Leap的混合求解器来解决这个问题。

使用

 

python n_queens.py

 

程序提示用户输入要放置的皇后的数目(n),需要注意的是,较大的n将需要更长的运行时间,我们不建议在n>200时运行此示例。

解决方案映像文件('n-queens-solution.png’)将保存在根目录中。

代码概述

将n-queens问题定义为带有四类约束的问题:

1.每一栏都只有一位女王。

2.每一排都只有一位女王。

3.从左上到右下,每个对角线最多有一个女王。

4.从左下到右上,每个对角线最多有一个女王。

下面是代码的简要概述:

● 用唯一的数字(ID)表示每个约束。

● 用约束ID子集表示棋盘上的每个位置。

● 使用这些约束子集,形成二元二次模型(BOM)。

● 运行问题(解决BQM)。

● 验证解决方案。

● 在棋盘上绘制解决方案,并保存解决方案图像文件。

相关部分代码展示(具体代码可以留言邮箱发送)

subsets = []
    for x in range(n):
        for y in range(n):
            col = x
            row = y + n

            subset = {col, row}

            diag = x + y + (2*n - 1)
            min_diag = 2*n
            max_diag = 4*n - 4

            if diag >= min_diag and diag <= max_diag:
                subset.add(diag)

            anti_diag = (n - 1 - x + y) + (4*n - 4)
            min_anti_diag = 4*n - 3
            max_anti_diag = 6*n - 7

            if anti_diag >= min_anti_diag and anti_diag <= max_anti_diag:
                subset.add(anti_diag)

            subsets.append(subset)

    return subsets

def handle_diag_constraints(bqm, subsets, diag_constraints):
    print(diag_constraints)
    """Update bqm with diagonal (and anti-diagonal) constraints.
    Duplicates are penalized.
    """
    for constraint in diag_constraints:
        for i in range(len(subsets)):
            if constraint in subsets[i]:
                for j in range(i):
                    if constraint in subsets[j]:
                        bqm.add_interaction(i, j, 2)
    return bqm

代码转换

import kaiwu as kw

    B = kw.qubo.ndarray(n,"B",kw.qubo.Binary)

    def dwave_bqm_to_qboson_qubo(bqm):
        
        qubo = bqm.to_qubo()

        N = 0
        for key in qubo[0]:
            for i in key:
                if i >= N:
                    N = i
        N += 1
        print(N)

        B = kw.qubo.ndarray(N, "B", kw.qubo.binary)
        Q = qubo[1]

        for key in qubo[0]:
            Q += qubo[0][key]*B[key[0]]*B[key[1]]

        return Q
    
    Q = dwave_bqm_to_qboson_qubo(bqm)
    print(kw.qubo.details(Q))



    # Parse QUBO
    obj = kw.qubo.make(Q)
    # Convert to Ising model
    obj_ising = kw.qubo.cim_ising_model(obj)


    matrix = obj_ising["qubo_matrix"]["qubo_matrix"]


    np.savetxt("n.csv", matrix, delimiter=", ")
 

可以生成‘n,csv’,上传至国内量子云平台(相干光量子计算云平台-玻色量子),进行新建任务,最终可以获得结果,作相应对应关系即可获得可行解。

可行解

1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0

以上的解,可以不用代码就可以验证,1对应着落子,0对应空置。

相关的excel文件可以留言发送,大家可以直接用附件进行量子计算机的真机求解。

1059
0
1
0

评论1

咔次薯霸

讲的太好了!

关于作者
相关文章
  • 离散优化问题之三国招兵
    东汉末年分三国,烽火连天不休。刘关张桃园结义,招兵志平暴乱。 兵源 冯家村刘家村赵 ...
    了解详情 
  • 【讲座笔记】李宏博副教授:约束满足问题建模与求解 CCF-Talk ...
    讲座时间:2024年7月24日讲座组织:中国计算机学会主讲人:李宏博 副教授 问题实例经典问题 ...
    了解详情 
在本版发帖返回顶部
快速回复 返回顶部 返回列表