量子计算程序生成





今天,我们将在FDG 2020会议上分析IBM Quantum的James Wootton的演讲,我们将讨论量子计算-一种潜在的有前途的技术,但是,在当前的开发阶段,它的应用很少。然而,其中一个是在程序生成中发现的。



让我们更详细地讨论如何在qubit上实现它,并给出程序代码。









让我们从什么是量子计算机开始,以及它们可能有多有用。让我们不深入技术细节。只需提一下,量子计算机是与数字计算机和模拟计算机完全不同的计算模型。他们不仅可以通过量子加速传统软件。相反,它们需要完全不同的方法来实现程序,并需要不同的硬件来运行它们。







量子计算将有一天比数字或模拟计算更有效地执行某些任务。这将使我们能够处理当前无法解决的问题。经过数十年的研究,已经确定了许多量子算法,这些算法相对于许多可能的应用(包括在程序生成领域中)最有效地展示了这些优势。这些包括优化,约束满足,图形分析等。



建造能够执行量子计算的计算机本身就是一项艰巨的任务,并且已经进行了多年。描述量子设备的重要参数之一是量子位的数量。实际上,这些是相同的位,但是以量子方式实现-因此具有比通常的0和1更多的状态。在量子物理学的上下文中,我们可以使用一对正交向量来写位值:|0⟩和|1⟩。对于量子比特,状态描述将补充满足以下条件的复振幅c 0c 1c 0 | 2 + | c 1 | 2= 1,因此可以实现更多数量的量子位c 0 |0⟩+ c 1 |1⟩状态。







要运行旗舰算法,我们需要成千上万个量子比特,而这在未来几年中将不再存在。



当前,我们没有成千上万的量子比特,甚至没有一千个量子比特可供我们使用。老实说,我们甚至没有一百个量子位。目前我们可以使用的最大设备为65量子位。尽管这不足以运行我们所知的最有趣和最有效的算法,但即使是如此数量的qubit,也可以提供常规计算机无法预期的结果。模拟此类设备的复杂性证明了这一点,您将需要租用世界上最大的超级计算机。



因此,量子硬件可以为我们提供独特的答案,但是几十年来,我们还没有学会如何提出正确的问题。因此,我们当前研究的主要目标是试图尽快弄清楚如何使用这些机器做一些有用的事情。







还有一些功率更适中的设备,由大约20量子比特组成。 IBM甚至免费提供了涉及多达15个量子位的量子程序。此外,他们还创建了仿真软件,以帮助设计和测试量子程序。虽然要模拟50个以上的量子比特是一项艰巨的计算任务,但即使您的笔记本电脑也可以处理约20个量子比特而没有任何问题。



所有因素共同使20量子比特成为一个里程碑。无论我们使用的是真正的量子硬件还是其仿真,运行这种级别的量子软件都不太困难。







那么这对程序生成意味着什么呢?取决于您要定位的三个时代中的哪个时代:今天的时代,准备仅提供几十个量子位;在不久的将来,设备将具有数百个量子比特;或遥远的未来,届时我们将拥有超过一千个量子比特。



如果今天我们谈论的是量子软件,仅关注20量子比特的能力,它仍然无法做任何独特的事情。我们可以在仿真器上运行它的事实意味着,您甚至不需要量子硬件。但是量子程序还能做任何有用的事情吗?我们可以编写一个20量子位的量子程序来产生对真正的最终用户有用的结果吗?



如果我们可以用20量子比特获得真正有用​​的结果,那么这种影响只会随着时间的推移而倍增,并且计算能力也会更高。中间时代将是研究越来越复杂的量子计算方法(包括对程序生成有效的方法)的时代。如果没有考虑量子,我们将继续创建我们可能不会想到的工具。



但是,让我们不要超越自己。迈向扩展实用程序时代的第一步是证明即使20量子位的量子软件也可以使用。这就是我们要做的。







现在是时候澄清一些细节了。



程序生成意味着我们需要生成一些东西。但是呢



地形生成是最明显的,所以让我们开始吧。



佩林噪声是生成过程地形的一种普遍使用的工具。但是还有另一种简单得多的创建方法-使用一组随机点及其随后的模糊效果。在我们看来,这样的实现第一步似乎是一个可以实现的目标,因此我们将其作为基础。



让我们从开发一种以量子电路形式编码高度图的方法开始,量子电路是量子软件的基本元素。它们与用于数字计算的布尔电路模型有些相似。量子位本质上是与执行计算时发生不同变化的相同位。







我们将处理黑白图像,其中像素亮度的值可以从0到1。以同样的方式,它们可能会被误认为是高度图。一旦我们学习了如何将这些高度图编码为示意图,就可以对其进行管理。所使用的编码旨在将尽可能多的点压缩为尽可能少的qubit。该方法没有太多的灵活性来提供方便和灵活的控制。同时,电路中几乎任何变化都会引起干扰效应。



我们主要使用可以被视为NOT门的部分形式的操作。当应用于普通位时,请勿将值从0更改为1,反之亦然。借助量子门,我们可以参数化此元素以执行可以执行NOT的一半,四分之一或可以由n量子比特的2 n个幅度表示的任何其他小数部分的运算



下面的函数将原始图像转换为量子电路:



def height2circuit(height):
#   
L = max(max(height))+1
#  
grid = make_grid(L)
#    
n = 2*int(np.ceil(np.log(L)/np.log(2)))
#   
state = [0]*(2**n)
#    
H = 0
for bit string in grid:
(x,y) = grid[bit string]
if (x,y) in height:
h = height[x,y]
state[ int(bit string,2) ] = np.sqrt( h )
H += h
#  
for j,amp in enumerate(state):
state[ j ] = amp/np.sqrt(H)
#   
qc = QuantumCircuit(n,n)
qc.initialize(state,range(n))
#   Qiskit 
# qc.initialize( state, qc.qregs[0])
return qc


然后,我们需要执行相反的过程-将量子电路转换为图像:



def circuit2height(qc):
#     
n = qc.num_qubits
grid = make_grid(int(2**(n/2)))
#     
ket = qi.Statevector(qc.data[0][0].params)
qc.data.pop(0)
#        
ket = ket.evolve(qc)
#   
p = ket.probabilities_dict()
#       
max_h = max( p.values() )
#      
height = {}
for bit string in p:
if bit string in grid:
height[grid[bit string]] = p[bit string]/max_h
return height


如果将此操作应用于所有量子位,我们可以看到高度图随分数增加而变化。您将获得类似模糊效果的效果。然后将发生干涉效果,从而产生无法通过简单模糊实现的图案。



在上面(a)中的示例中,我们从一对看似随意的点开始。逐渐地,它们经历了模糊,之后干扰效应被叠加在它们上面。这导致图案的出现-在我们的例子中,就像(f)上的棋盘一样。这个特殊的结果与我们开始时使用的两个像素有着明确的联系。如果以其他数据为起点,结果也将完全不同。



Quantum Blur已经在多种游戏卡纸上进行了开发和测试。它主要用于生成纹理和级别贴图。







生成这些图之后,我们将它们用于Perlin高频噪声的量子模拟。



因此,现在我们以其他方式创建主配置文件-例如,岛屿-如本例中的©。然后,我们需要像(a)中一样的一组初始像素。我们对其进行量子模糊以生成类似(b)的图案。之后,我们将其应用于主轮廓以创建最终景观。



您可以在此处看到2D示例,以及IBM QiskitBlocks教程游戏中使用的3D渲染。还已经使用量子运算开发了诸如草类型和树木在3D渲染中的位置等信息的详细信息。









由于RGB图像通常是排列在一起的三个高度图,因此我们也可以操纵这些图像。这样,使用叠加即可轻松创建一些奇怪的图片。更困难,但更有效-对一对图像进行编码并在它们之间创建隐形传送效果。



量子隐形传态在量子位之间传输信息。因此,我们采用两个大小相同的qubit寄存器,只是更改它们的状态。让我们使用此操作来创建过渡动画。







类似的编码思想也可以用于其他形式的数据。Wootton试图在音乐中使用它:





和马里奥级别:





这是另外两个对我们很重要的例子。其中之一是使用此方法在将来的游戏中生成程序的游戏工作室。该项目具有科幻背景,量子方法为其带来了真实的科学气息。



此外,艺术家利比·海尼(Libby Heaney)将其中一些想法用作创作的起点。





在这两种情况下,都强调了计算的量子性质:对于用户而言,重要的是结果来自算法空间的量子域,而不仅仅是辉煌的线性代数。







与真实的量子硬件相比,此处描述的方法更适合于仿真,但是这种方法很快就会改变。实际上,IBM最大的量子设备之一也已用于过程生成,尽管完全不同。



同时,您可以自己尝试量子模糊效果。它是用Python编写的,但是Unity也有一个插件也许它们对您有用。



链接到全文:这里



All Articles