• Members 19 posts

In Qiskit, I want to use MinimumEigenOptimizer to find the minimum value and the corresponding vector for a quadratic problem. I am looking for a binary vector solution in this quadratic problem, namely $x \in { 0,1 }$. I thought the MinimumEigenOptimizer can automatically translate a quadratic program into an Ising Hamiltonian and back, but I got an error says 'Unsupported variable type VarType.BINARY'.

Below is the code:

import numpy as np

mu = np.array([2.5, 4.2, 1])
sigma = np.array([[1, 0, -1],
[0, 1, 0.7],
[-1, 0.7, 1]])
budget = 2 # select 2 out of 3 assets
risk_factor = 0.7 # risk factor "q"

from qiskit_finance.applications.optimization import PortfolioOptimization
popt = PortfolioOptimization(expected_returns = mu, covariances = sigma, risk_factor = risk_factor, budget = budget)

from qiskit import Aer
sim = Aer.get_backend('qasm_simulator')

from qiskit.circuit.library import RealAmplitudes
# Choose real amplitudes because the amplitude z (whether to choose the asset) is supposed to be real
ansatz = RealAmplitudes(3, reps = 2)

from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.optimization.algorithms import MinimumEigenOptimizer

vqe = VQE(ansatz, optimizer=SLSQP(), quantum_instance=sim)
vqe_optimizer = MinimumEigenOptimizer(vqe)

# The MinimumEigenOptimizer should internally maps the quadratic program to an Ising Hamiltonian and back
vqe_result = vqe_optimizer.solve(qp)


\ This file has been generated by DOcplex
\ ENCODING=ISO-8859-1
\Problem name: Portfolio optimization

Minimize
obj: - 2.500000000000 x_0 - 4.200000000000 x_1 - x_2 + [ 1.400000000000 x_0^2
- 2.800000000000 x_0*x_2 + 1.400000000000 x_1^2 + 1.960000000000 x_1*x_2
+ 1.400000000000 x_2^2 ]/2
Subject To
c0: x_0 + x_1 + x_2 = 2

Bounds
0 <= x_0 <= 1
0 <= x_1 <= 1
0 <= x_2 <= 1

Binaries
x_0 x_1 x_2
End


And the error message:

QiskitOptimizationError: 'Unsupported variable type VarType.BINARY'