-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtsp_server.py
79 lines (60 loc) · 1.96 KB
/
tsp_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from fastapi import FastAPI, Form
from typing import Annotated
from fastapi.middleware.cors import CORSMiddleware
from qiskit.circuit.library import TwoLocal
from qiskit_optimization.applications import Tsp
from qiskit_algorithms import SamplingVQE
from qiskit_algorithms.optimizers import SPSA
# from qiskit_algorithms.utils import algorithm_globals
from qiskit.primitives import Sampler as Sampler
from qiskit_optimization.converters import QuadraticProgramToQubo
import networkx as nx
"""
Installations:
pip install fastapi uvicorn python-multipart
Run:
uvicorn tsp_server:app --reload
"""
def tsp_quantum_solver(adj_matrix):
graph = nx.from_numpy_array(adj_matrix)
tsp = Tsp(graph)
qp = tsp.to_quadratic_program()
qp2qubo = QuadraticProgramToQubo()
qubo = qp2qubo.convert(qp)
qubitOp, offset = qubo.to_ising()
optimizer = SPSA(maxiter=300)
ry = TwoLocal(qubitOp.num_qubits, "ry", "cz", reps=5, entanglement="linear")
vqe = SamplingVQE(sampler=Sampler(), ansatz=ry, optimizer=optimizer)
result = vqe.compute_minimum_eigenvalue(qubitOp)
x = tsp.sample_most_likely(result.eigenstate)
z = tsp.interpret(x)
return z
distances_matrix = [
[0, 1, 2, 3],
[1, 0, 4, 5],
[2, 4, 0, 6],
[3, 5, 6, 0]
]
def get_adj_matrix(list_of_cities):
adj_matrix = []
for i in range(len(list_of_cities)):
adj_matrix.append([])
for j in range(len(list_of_cities)):
adj_matrix[i].append(distances_matrix[list_of_cities[i]][list_of_cities[j]])
return adj_matrix
app = FastAPI()
# Allow cors
app.add_middleware(
CORSMiddleware,
allow_origins=["*", "null"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.post("/solve")
def solve_tsp(nodes: Annotated[str, Form(...)]):
nodes = list(map(int, nodes.split(',')))
print(nodes, type(nodes))
adj_matrix = get_adj_matrix(nodes)
print(adj_matrix)
return tsp_quantum_solver(adj_matrix)