変数 qi は0または1の値しかとらないので,qi**2 == qi が成立します.これを先程得た式に反映させます.0はその変数を採用しない,1はその変数を採用することを意味します.
for q in re.findall(r'q[0-9]{3}\*\*2', str(E)): q = q.replace('**2', '') E = E.subs(Symbol(q)**2, Symbol(q))
その5.py
量子アニーリングで先程の式を最小化するため QUBO 行列を作成します.
qubo = pd.DataFrame(index=df['q'].tolist(), columns=df['q'].tolist()) coeff_di = E.as_coefficients_dict() for var, coeff in coeff_di.items(): if var == 1: continue var = str(var).split('*') if len(var)==1: qubo.loc[var[0], var[0]] = int(coeff) if len(var)==2: qubo.loc[var[0], var[1]] = int(coeff) qubo.to_csv('qubo.csv') qubo = qubo.fillna(0)
その6.py
MDR の Wildqat と呼ばれる量子アニーリング型のシミュレーション計算を行うライブラリを使用して,先程得た式を最小化していきます.最小値が0になるまで何度も計算を繰り返します.
E_lowest = 100000 i = 0 while True: i += 1 a = wildqat.opt() a.qubo = qubo.values pred = a.run() print('{}/{}: {}'.format(i+1, 100, a.E[-1] + coeff_di[1])) if a.E[-1] + coeff_di[1] == 0: pred_best = pred break
その7.py
得た解が正しいかを検証したところ,正しい解が得られていました.
output_qubo = df.loc[np.array(pred_best)==1, 'q'] for q in output_qubo: row = int(q[1]) col = int(q[2]) candidate = int(q[3]) quiz[row, col] = candidate np.array_equal(quiz, sol)
その8.py