Como se solicitó en los comentarios, aquí hay un ejemplo trabajado. El cuerpo principal se ocupa de minimizar para un problema específico. En la parte inferior sigue una breve discusión de las restricciones y luego una breve discusión sobre el caso general.f(x)
Vamos a resolver el problema de corte máximo ponderado ya que esto
- Es un ejemplo relativamente sencillo
- Es duro clásicamente
- Es un ejemplo relativamente común en la literatura (por ejemplo, https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.90.067903 )
- Tiene una conexión clara con un hamiltoniano físico (Ising spin-glasses)
Para comprender el problema, comenzamos con un gráfico no dirigido de vértices , donde cada vértice tiene un peso y cada borde que conecta y tiene un peso . Luego cortamos el gráfico en dos partes. No es necesario que el corte sea recto, pero no debe auto-intersectarse y no puede cortar ningún borde dos veces. Luego calculamos un " pago " para nuestro corte. El pago es la suma de los pesos de los bordes que cortamos, más la suma de los pesos de los vértices en un lado del corte. n{V}vi∈Vwi≥0vivjwij≥0P 1P1
Fuente
En esta imagen, el pago sería, para los bordes más para los vértices (suponiendo que el número dentro de cada vértice sea su peso) . El problema de optimización es maximizar para un gráfico dado . 1+4+3+3+2=135+6+1=12→P=25P2
Para escribir esto matemáticamente, podemos pensar en términos de cadenas de bits. Definimos un corte por una cadena donde no se cuenta en la suma y se cuenta en la suma. Para hacer las matemáticas un poco más limpias, si el gráfico no está completamente conectado, haga que el gráfico esté completamente conectado y establezca para cualquier par no conectado .s∈{0,1}nsi=0→vi si=1→vi wij=0vi,vj
Por ejemplo, mirando de nuevo la imagen de arriba, interpretemos los números dentro de los vértices como el índice de vértice en lugar del peso como supusimos anteriormente. Entonces el corte dibujado corresponde a . están en el lado "bueno" del corte y se cuentan, mientras que están en el lado "malo" del corte y no se cuentan .s=100011s1=s5=s6=1→v1,v5,v6s2=s3=s4=0
Esto nos permite escribirP(s)=∑isiwi+∑i,jsi(1−sj)wij
El primer término solo cuenta los pesos de todos los vértices en el lado "bueno" del corte. El segundo término cuenta el peso de un borde si los vértices que conecta están en lados opuestos del corte. Tenga en cuenta que esto no cuenta dos veces, ya que solo cuenta el borde cuando y no cuando .si=1,sj=0si=0,sj=1
Entonces, nuestro problema de optimización es encontrar la cadena que maximiza . La idea aquí es pensar en como una medida de energía de un sistema como el estado del sistema. Esto significa que podemos relacionar con nuestro hamiltoniano. Aquí hay una ligera sutilidad de que estamos tratando de maximizar pero generalmente hablamos de encontrar el estado fundamental de un hamiltoniano. Esto no es un problema, pero quería señalarlo: en su lugar, podemos ver el estado excitado con la energía más alta (estado anti-tierra si lo desea) o usar como nuestra función de energía y luego trabajar con el estado fundamental como normal El trabajo de Let con el más alto estado excitado y maximizar .sP(s)P(s)sP(s)P(s)−P(s)P
Nos gustaría crear un hamiltoniano de modo que su estado de energía más alto sea modo que sea máximo. Esencialmente queremos convertir , una función de energía, en , un operador de energía. Hacemos esto al notar que para tenemos|s0⟩P(s0)P(s)H^|s⟩∈{|0⟩,|1⟩}I−Z2|s⟩=s|s⟩→ define s^i=I−Zi2
Donde es el Pauli actuando en qubit . Ahora obtenemos nuestro Hamiltoniano reemplazando con (y 1 con ) enZiZiss^IP
H=∑is^iwi+∑i,js^i(I−s^j)wi,j=∑iI−Zi2wi+∑i,jI−Zi2(I−I−Zj2)wi,j
Esto se puede limpiar expandiendo y viendo∑i,j(Zi−Zj)=0→
H=∑iwi2(I−Zi)+∑i,jwij4(I−ZiZj)=∑iwi2(I−Zi)+∑i<jwij2(I−ZiZj)
Podemos limpiar esto aún más multiplicando por 2 y eliminando un cambio de energía constante (elimine los términos ). Nuevo hamiltoniano con los mismos estados propios con valores propios escalados y desplazados (claramente la energía máxima no se ve afectada por estas transformaciones)I
H=−∑iwiZi−∑i<jwijZiZj
Si eres un físico de materia condensada, probablemente reconocerás a este hamiltoniano como un vidrio giratorio Ising. No es realmente relevante para el problema, pero creo que es genial.
Entonces ahora tenemos un hamiltoniano cuyo estado (anti-) fundamental codifica la cadena de bits que maximiza y resuelve el problema.s0P(s)
Lo último que necesitamos es un Hamiltoniano inicial , que lentamente (adiabáticamente) transformamos en nuestro Hamiltoniano final para que podamos definir el Hamiltoniano completoH0HHT(t)=(1−f(t))H0+f(t)H:f(0)=0,f(tf)=1
Como punto de partida, se usa a menudo por simplicidad. El mínimo determinado por la precisión deseada y la brecha espectral . La brecha espectral es la diferencia de energía mínima, sobre todo , entre el estado (anti-) fundamental y el siguiente estado de energía. El análisis de la brecha es altamente no trivial (consulte https://arxiv.org/abs/quant-ph/0509162 ) y determina la complejidad / eficiencia del algoritmo. No se garantiza que un algoritmo con 0 gap funcione en absoluto.f(t)∝ttf3t
Entonces queremos un tal queH0
- Podemos encontrar y preparar fácilmente su (anti) estado fundamental
- La brecha espectral de no es exponencialmente pequeña en el tamaño del problemaH
Para este problema, un buen Hamiltoniano inicial es porque su estado de energía más alto es fácil de encontrar, es . Es fácil de preparar, simplemente aplique a . No tengo tiempo para entrar en el análisis de la brecha espectral, pero es poco probable que este hamiltoniano sea ideal en ese sentido (ver https://arxiv.org/abs/1701.05584 ).H0=∑iXi|+⟩⊗nH⊗n|0⟩⊗n
Con esta elección de y tomando hemos terminado. Nuestro hamiltoniano esH0f(t)=t/tf
H(t)=(1−f(t))∑iXi−f(t)[∑iwiZi+∑i<jwijZiZj]
Comenzando en el estado , evolucionando según el Hamiltoniano anterior para el tiempo (elegir un adecuado es, nuevamente, generalmente altamente no trivial ) luego, medir en la base computacional debería devolver (con alta probabilidad) la cadena que maximiza .|ψ0⟩=H⊗n|0⟩⊗ntftfs=s0P(s)
1 Esto es ambiguo ya que por simetría cualquier lado lo hará. Podemos hacer esto riguroso, por ejemplo, haciendo el corte dirigido y luego tomando los vértices a la izquierda del corte al caminar a lo largo de la dirección del corte.
2 Había dicho en el comentario que minimizamos una función de costo, si te gusta más, solo toma cost pago y minimiza el costo.=−
3 Estoy barriendo algunos detalles sobre lo que significa "lento" debajo de la alfombra pero puede estar relacionado con la escala de energía del problema (es decir, multiplicar por una constante cambiará la velocidad).H
Restricciones
Digamos que queremos modificar el problema anterior para requerir que exactamente vértices estén en el lado "bueno" de nuestro corte. Matemáticamente esto es . Para hacer cumplir esto, agregamos un término de penalización en nuestro Hamiltoniano para soluciones que rompan esta restricción. Entonces, agregamos un término como eligiendo suficientemente grande como para garantizar que un estado que viola esta restricción no puede ser el estado de mayor energía.5∑isi−5=0Hc=−α(∑is^i−5I)2α
Digamos que queremos exigir que no haya más de vértices en el lado "bueno" de nuestro corte. Esto, al parecer, es bastante difícil de hacer. En https://arxiv.org/abs/1702.06248 afirman que la aproximación de una restricción de desigualdad al orden requiere -spin acoplamientos que requerirían aún más sobrecarga para divídalos en acoplamientos de 2 qubits, que a menudo es necesario en una arquitectura dada. Esencialmente, la estrategia es aproximar una función de paso usando un5kO(N2k) kkthorden polinomial. Esto parece una forma terrible de hacerlo, pero no puedo pensar en una mejor manera. Esto viene de Troyer en 2017, por lo que es relativamente poco probable, aunque ciertamente posible, que actualmente se conozca una mejor manera.
El caso general
La pregunta se refiere a un método general para codificar un problema de optimización en un hamiltoniano. Específicamente, queremos minimizar sujeto a un conjunto de restricciones. En la sección anterior discutí agregar las restricciones al hamiltoniano. Entonces, para una completamente general , ¿hay alguna forma de codificarla en un hamiltoniano? El método general para esto en la literatura es asumir que tenemos acceso a un oráculo cuántico eficiente que implementa . Podemos pensar que esto tiene una operación de caja negra (es decir, oráculo cuántico) tal que . Entonces podemos construir nuestro Hamiltoniano como
f(x)f(x)f ( x ) f ( x ) f ( x ) | x ⟩ = f ( x ) | x ⟩ H = Σ x f ( x ) | x ⟩ ⟨ x | F ( x ) f ( x )f(x)f^(x)f^(x)|x⟩=f(x)|x⟩H=∑xf^(x)|x⟩⟨x|
Por supuesto, esto simplemente empuja la parte difícil a encontrar / construir . De hecho, los argumentos de conteo simples muestran que casi todos (en el sentido matemático) los oráculos cuánticos son exponencialmente ineficientes para implementar (ver http://www.ar-tiste.com/imp-oracles/imps2.pdf ). Entonces, si bien esta es una codificación general de un problema de optimización en un Hamiltoniano, no es realmente práctico. Parecería ser el caso de que si desea codificar su problema de optimización en un Hamiltoniano de una manera útil , deberá aprovechar alguna estructura de . Tengo entendido que los detalles específicos de cómo hacer esto y cómo hacerlo de la mejor maneraf^(x)f(x) no se entiende completamente y es objeto de una investigación activa.