ডি-ওয়েভ ওয়ার্ল্ডের 'হ্যালো ওয়ার্ল্ড' সমতুল্য 2D চেকবোর্ডের উদাহরণ। এই উদাহরণে, আপনাকে 4 টি নোড সহ নিম্নলিখিত বর্গ গ্রাফ দেওয়া হবে:
আসুন আমরা নির্ধারণ করি যে আমরা color কালো যদি এবং সাদা যদি রঙ । লক্ষ্যটি হ'ল গ্রাফের চারটি শীর্ষে একটি চেকবোর্ড প্যাটার্ন তৈরি করা। এই ফলাফলটি অর্জনের জন্য এবং সংজ্ঞায়নের বিভিন্ন উপায় রয়েছে
। প্রথমত, এই সমস্যার দুটি সম্ভাব্য সমাধান রয়েছে:σiσi=−1σi=+1hJ
ডি ওয়েভ কোয়ান্টাম এ্যানিলার ইসিং হ্যামিল্টোনিয়ানকে আমরা সংজ্ঞায়িত করেছি এবং এটির বিভিন্ন সংযোজক সেটিংসের প্রভাব বোঝা গুরুত্বপূর্ণ। উদাহরণস্বরূপ বিবেচনা করুন :J0,1
যদি আমরা এটিকে সেট করে রাখি , তবে উভয় কুইবিট একই মান গ্রহণ করলে হ্যামিলটোনীয় হ্রাস করা হবে। আমরা বলি নেতিবাচক দম্পতি সম্পর্কিত । আমরা যদি এটি সেট করে তবে দুটি কুইবিট যদি বিপরীত মান নেয় তবে হ্যামিলটোনিয়ান হ্রাস করা হয়। সুতরাং, ইতিবাচক দম্পতিরা বিরোধী-সংযুক্তি ।J0,1=−1J0,1=+1
চেকবোর্ডের উদাহরণে আমরা প্রতি জোড়া প্রতিবেশী বিরোধী-সম্পর্ক স্থাপন করতে চাই যা নিম্নলিখিত হ্যামিলটনিয়ানকে জন্ম দেয়:
H=σ0σ1+σ0σ2+σ1σ3+σ2σ3
বিক্ষোভের স্বার্থে, আমরা তম কুইবিটে একটি পক্ষপাতিত্ব শব্দটি যুক্ত করি যাতে আমরা কেবল সমাধান # 1 পাই। এই সমাধানটির জন্য এবং তাই আমরা এর পক্ষপাত সেট করি । চূড়ান্ত হ্যামিলটনিয়ান এখন:0σ0=−1h0=1
H=σ0+σ0σ1+σ0σ2+σ1σ3+σ2σ3
সুতরাং এটি কোড আপ করা যাক!
দ্রষ্টব্য: যে কোনও কাজের জন্য আপনি ডি-ওয়েভের ক্লাউড পরিষেবাটিতে অ্যাক্সেসের প্রয়োজন।
প্রথমত, আপনার dwave_sapi2
( https://cloud.dwavesys.com/qubist/downloads/ ) পাইথন প্যাকেজ ইনস্টল করা আছে তা নিশ্চিত করুন । সব কিছু পাইথন ২. Py হতে চলেছে কারণ বর্তমানে ডি-ওয়েভ কোনও উচ্চতর পাইথন সংস্করণ সমর্থন করে না। বলা হচ্ছে, আসুন প্রয়োজনীয় আমদানি করুন:
from dwave_sapi2.core import solve_ising
from dwave_sapi2.embedding import find_embedding, embed_problem, unembed_answer
from dwave_sapi2.util import get_hardware_adjacency
from dwave_sapi2.remote import RemoteConnection
ডি-ওয়েভ সলভার এপিআইতে সংযোগের জন্য আপনাকে তাদের এসপিআই সলভার, এসপিআই ইউআরএল এবং আপনার কোন কোয়ান্টাম প্রসেসরটি ব্যবহার করতে চান তা নির্ধারণ করতে হবে:
DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'
আমি ডি-ওয়েভ 2000Q ভার্চুয়াল ফুল ইয়িল্ড চিমেরা (ভিএফওয়াইসি) ব্যবহার করার পরামর্শ দিচ্ছি যা কোনও মৃত কোয়েট ছাড়াই সম্পূর্ণ কার্যক্ষম চিপ! এখানে চিমেরা চিপ লেআউটটি রয়েছে:
এই মুহুর্তে আমি টিউটোরিয়ালটি দুটি স্বতন্ত্র টুকরোতে বিভক্ত করছি। প্রথম বিভাগে, আমরা ম্যানুয়ালি চিমেরা হার্ডওয়্যার গ্রাফটিতে সমস্যাটি এম্বেড করছি এবং দ্বিতীয় বিভাগে আমরা একটি হার্ডওয়্যার এম্বেডিং সন্ধান করতে ডি-ওয়েভের এমবেডিং হিউরিস্টিক ব্যবহার করছি।
ম্যানুয়াল এম্বেডিং
উপরের ডি-ওয়েভ 2000 কিউ চিপ লেআউটে উপরের বাম কোণে ইউনিট ঘরটি দেখতে এইরকম দেখাচ্ছে:
দ্রষ্টব্য, সমস্ত দম্পতিরা এই চিত্রটিতে দৃশ্যমান নয়। আপনি দেখতে পাচ্ছেন, কুইট এবং কুইবিট মধ্যে কোনও সংযোগকারী নেই যা আমাদের উপরে আমাদের বর্গ গ্রাফটি সরাসরি প্রয়োগ করতে হবে। সে কারণেই আমরা এখন , , এবং । আমরা তখন উপর যান এবং সংজ্ঞায়িত একটি তালিকা এবং একটি অভিধান হিসাবে:010→01→42→73→3hJ
J = {(0,4): 1, (4,3): 1, (3,7): 1, (7,0): 1}
h = [-1,0,0,0,0,0,0,0,0]
h যেহেতু আমরা qubits ব্যবহার 0 7. আমরা এখন সমাধানকারী API- এ সংযোগ স্থাপন করা এবং ডি-ওয়েভ 2000Q VFYC সমাধানকারী অনুরোধ 8 এন্ট্রি আছে:
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
এখন, আমরা পাঠ্য সংখ্যার সংজ্ঞা দিতে পারি এবং answer_mode
"হিস্টোগ্রাম" হতে বেছে নিতে পারি যা ইতিমধ্যে আমাদের উপস্থিতি সংখ্যার দ্বারা ফলাফলগুলি সাজিয়ে তোলে। আমরা এখন ডি-ওয়েভ কোয়ান্টাম এ্যানিলারের সাথে ইসিংয়ের উদাহরণটি সমাধান করতে প্রস্তুত:
params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results
আপনার নিম্নলিখিত ফলাফল পাওয়া উচিত:
{
'timing': {
'total_real_time': 1655206,
'anneal_time_per_run': 20,
'post_processing_overhead_time': 13588,
'qpu_sampling_time': 1640000,
'readout_time_per_run': 123,
'qpu_delay_time_per_sample': 21,
'qpu_anneal_time_per_sample': 20,
'total_post_processing_time': 97081,
'qpu_programming_time': 8748,
'run_time_chip': 1640000,
'qpu_access_time': 1655206,
'qpu_readout_time_per_sample': 123
},
'energies': [-5.0],
'num_occurrences': [10000],
'solutions': [
[1, 3, 3, 1, -1, 3, 3, -1, {
lots of 3 's that I am omitting}]]}
আপনি দেখতে পাচ্ছেন আমরাenergies
এর সঠিক স্থল রাষ্ট্র শক্তি ( ) । সমাধানের স্ট্রিং পূর্ণ যা অব্যবহৃত / অপরিশোধিত কোয়েটগুলির জন্য ডিফল্ট ফলাফল এবং যদি আমরা বিপরীত রূপান্তরগুলি প্রয়োগ করি - , , এবং - আমরা সঠিক সমাধানের স্ট্রিং পাই । সম্পন্ন!3 0 → 0 4 → 1 7 → 2 3 → 3 [ 1 , - 1 , - 1 , 1 ]−5.030→04→17→23→3[1,−1,−1,1]
হিউরিস্টিক এম্বেডিং
আপনি যদি বৃহত্তর এবং বৃহত্তর আইসিং উদাহরণগুলি তৈরি করা শুরু করেন আপনি ম্যানুয়াল এম্বেডিং করতে সক্ষম হবেন না। সুতরাং ধরা যাক আমরা আমাদের 2 ডি চেকারবোর্ড উদাহরণটি ম্যানুয়ালি এম্বেড করতে পারি না। এবং তখন আমাদের প্রাথমিক সংজ্ঞা থেকে অপরিবর্তিত থাকে:এইচJh
J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]
আমরা আবার রিমোট সংযোগ স্থাপন করি এবং ডি-ওয়েভ 2000Q ভিএফওয়াইসি সলভার দৃষ্টান্তটি পাই:
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
আমাদের সমস্যার এম্বেডিং সন্ধানের জন্য, আমাদের প্রথমে বর্তমান হার্ডওয়্যার গ্রাফের সংলগ্ন ম্যাট্রিক্সটি পাওয়া দরকার:
adjacency = get_hardware_adjacency(solver)
এখন আসুন আমাদের সমস্যার এম্বেডিং সন্ধান করার চেষ্টা করুন:
embedding = find_embedding(J.keys(), adjacency)
আপনি যদি বড় আইজিং উদাহরণগুলির সাথে কাজ করে থাকেন তবে আপনি একাধিক থ্রেডে (একাধিক সিপিইউতে সমান্তরাল) এম্বেডিংগুলি অনুসন্ধান করতে চাইতে পারেন এবং তারপরে ক্ষুদ্রতম চেইনের দৈর্ঘ্যের সাথে এম্বেডিং নির্বাচন করুন! একটি চেইন তখন হয় যখন সংযোগের ডিগ্রি বাড়ানোর জন্য একাধিক কুইটগুলি একক কুইট হিসাবে কাজ করতে বাধ্য হয়। যাইহোক, চেইনটি যত বেশি দীর্ঘায়িত হওয়ার সম্ভাবনা তত বেশি। এবং ভাঙ্গা শৃঙ্খলা খারাপ ফলাফল দেয়!
আমরা এখন গ্রাফটিতে আমাদের সমস্যা এম্বেড করতে প্রস্তুত:
[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)
j0
মূল সংযোগগুলি রয়েছে যা আমরা সংজ্ঞায়িত করেছি এবং jc
সংযুক্ত কাপলগুলি রয়েছে যা শৃঙ্খলার অখণ্ডতা প্রয়োগ করে (তারা শৃঙ্খলের মধ্যে কোয়েটগুলি সংযুক্ত করে)। সুতরাং, আমাদের সেগুলি আবার একটি বড় অভিধানে মিশ্রিত করা দরকার :J
J = j0.copy()
J.update(jc)
এখন, আমরা এম্বেড থাকা সমস্যাটি সমাধান করতে প্রস্তুত:
params = {"answer_mode": 'histogram', "num_reads": 10000}
raw_results = solve_ising(solver, h, J, **params)
print 'Lowest energy found: {}'.format(raw_results['energies'])
print 'Number of occurences: {}'.format(raw_results['num_occurrences'])
raw_results
যদি না আমরা সমস্যা unembed আমাদের কাছে জানার জন্য করা হবে না। যদি কিছু শৃঙ্খলা ভেঙে যায় তবে আমরা aচ্ছিক যুক্তির দ্বারা নির্ধারিত হিসাবে সংখ্যাগরিষ্ঠ ভোটের মাধ্যমে তাদের ঠিক করছি broken_chains
:
unembedded_results = unembed_answer(raw_results['solutions'],
embedding, broken_chains='vote')
print 'Solution string: {}'.format(unembedded_results)
আপনি যদি এটি চালনা করেন তবে আপনার সমস্ত পাঠের মধ্যে সঠিক ফলাফল পাওয়া উচিত:
Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]
আমি এই আপনার প্রশ্নের উত্তর দিয়েছে এবং আমি অত্যন্ত সব অতিরিক্তি প্যারামিটার চেক আউট যাতে আপনি পাস করতে পারেন সুপারিশ আশা solve_ising
যেমন ফাংশন আপনার সমাধানগুলি মান উন্নত করার জন্য num_spin_reversal_transforms
বা postprocess
।