def maxcut_qaoa(n_step, edges, minimizer=None, sampler=None, verbose=True): """Setup QAOA. :param n_step: The number of step of QAOA :param n_sample: The number of sampling time of each measurement in VQE. If None, use calculated ideal value. :param edges: The edges list of the graph. :returns Vqe object """ sampler = sampler or vqe.non_sampling_sampler minimizer = minimizer or vqe.get_scipy_minimizer( method="Powell", options={"ftol": 5.0e-2, "xtol": 5.0e-2, "maxiter": 1000, "disp": True} ) hamiltonian = pauli.I() * 0 for i, j in edges: hamiltonian += pauli.Z(i) * pauli.Z(j) return vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, n_step), minimizer, sampler)
def numpartition_qaoa(n_step, nums, minimizer=None, sampler=None): """Do the Number partition QAOA. :param n_step: The number of step of QAOA :param nums: The edges list of the graph. :returns Vqe object """ hamiltonian = pauli.Expr.zero() for i, x in enumerate(nums): hamiltonian += pauli.Z[i] * x hamiltonian = (hamiltonian**2).simplify() return vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, n_step), minimizer, sampler) if __name__ == "__main__": minimizer = vqe.get_scipy_minimizer(method="Powell", options={"disp": True}) nums = [3, 2, 6, 9, 2, 5, 7, 3, 3, 6, 7, 3] runner = numpartition_qaoa(2, nums, minimizer=minimizer) vqeresult = runner.run(verbose=True) print("Num partition:", nums) best = vqeresult.most_common()[0] print("Probability:", best[1]) result = "".join(map(str, best[0])) group0 = [a for a, b in zip(nums, result) if b == '0'] group1 = [a for a, b in zip(nums, result) if b == '1'] print("Group 0:", sum(group0), group0) print("Group 1:", sum(group1), group1)