åå®å šãªéåæé©åæè¡ãæ¢æ±ããŸããåé¡è§£æ±ºåå®è£ ãéåã¢ã«ãŽãªãºã ã®èšèšãæ€èšŒãå®è¡ãã©ã®ããã«åŒ·åããããä¿¡é Œæ§ãé«ãå¹ççãªéåã³ã³ãã¥ãŒãã£ã³ã°ãœãªã¥ãŒã·ã§ã³ãå°ããã解説ããŸãã
åå®å šãªéåæé©åïŒåé¡è§£æ±ºåå®è£
éåæé©åã¯ãéèãããžã¹ãã£ã¯ã¹ããæ°è¬éçºãææç§åŠã«è³ããŸã§ãæ§ã ãªç£æ¥ã«ãããè€éãªåé¡è§£æ±ºã«èšãç¥ããªãå¯èœæ§ãç§ããŠããŸããããããéåã¢ã«ãŽãªãºã ã«å åšããè€éããéåååŠã®ç¢ºççæ§è³ªã¯ãä¿¡é Œæ§ã®é«ãæ£ç¢ºãªéåãœãããŠã§ã¢ã®éçºãå°é£ã«ããŠããŸããåå®å šããã°ã©ãã³ã°ã¯ãåã·ã¹ãã ã®å³å¯ããæŽ»çšããŠéåã³ãŒãã®æ£ç¢ºæ§ãšå®å šæ§ãä¿èšŒããããšã«ããããããã®èª²é¡ã«å¯ŸåŠãã匷åãªã¢ãããŒããæäŸããŸãã
åå®å šãªéåããã°ã©ãã³ã°ã®ç޹ä»
åå®å šãªããã°ã©ãã³ã°ãšã¯ã匷åãªåã·ã¹ãã ãæã€ããã°ã©ãã³ã°èšèªãçšããŠãããã°ã©ã å ã®ããŒã¿ãæäœã«å¶çŽã匷å¶ããããšã§ããããã«ãããã³ãŒããå®è¡ãããåã®ã³ã³ãã€ã«æã«ãšã©ãŒã鲿¢ããã®ã«åœ¹ç«ã¡ãŸããéåã³ã³ãã¥ãŒãã£ã³ã°ã®æèã§ã¯ãåå®å šæ§ã¯éåããŒã¿ïŒéåãããïŒãéåæäœïŒéåã²ãŒãïŒã«å¶çŽã匷å¶ããããã«äœ¿çšã§ããã³ãŒããéåååŠã®åºæ¬åçã«æºæ ããŠããããšãä¿èšŒããŸãã
åå®å šãªéåããã°ã©ãã³ã°ã®å©ç¹
- ãšã©ãŒã®åæžïŒåã·ã¹ãã ã¯éçºããã»ã¹ã®æ©ã段éã§ãšã©ãŒãææããã©ã³ã¿ã€ã ãšã©ãŒã®å¯èœæ§ãæžãããéåã¢ã«ãŽãªãºã ã®ä¿¡é Œæ§ãåäžãããŸãã
- ã³ãŒãå質ã®åäžïŒåå®å šãªã³ãŒãã¯ãåã·ã¹ãã ãã³ãŒãã®æå³ãããåäœãæç¢ºã«ææžåãããããå€ãã®å Žåãèªã¿ãããä¿å®ãããããã®ã«ãªããŸãã
- æ€èšŒã®åŒ·åïŒåã·ã¹ãã ã¯éåã¢ã«ãŽãªãºã ã®æ£ããã圢åŒçã«æ€èšŒããããã«äœ¿çšã§ããã¢ã«ãŽãªãºã ãæåŸ éãã«åäœãããšããé«ãã¬ãã«ã®ä¿èšŒãæäŸããŸãã
- çç£æ§ã®åäžïŒãšã©ãŒãæ©æã«ææããã³ãŒãå質ãåäžãããããšã§ãåå®å šãªããã°ã©ãã³ã°ã¯éçºè ã®çç£æ§åäžã«ã€ãªãããŸãã
éåæé©åã«ãããåé¡è§£æ±ºåå®è£
åé¡è§£æ±ºåå®è£ ãšã¯ãåã·ã¹ãã ã䜿çšããŠãéåã¢ã«ãŽãªãºã ã«ãã£ãŠè§£æ±ºãããæé©ååé¡ã®æ§é ãšå¶çŽãæç€ºçã«è¡šçŸããããšã§ããããã«ãããåã·ã¹ãã ããããã®å¶çŽã匷å¶ããéåã¢ã«ãŽãªãºã ãæå¹ãªè§£ã®ã¿ãæ¢çŽ¢ããæçµçµæãåé¡å®çŸ©ãšäžèŽããããšãä¿èšŒããŸãã
äž»èŠãªæŠå¿µ
- åé¡ã®å¶çŽã®ãšã³ã³ãŒãïŒæåã®ã¹ãããã¯ãæé©ååé¡ã®å¶çŽãåãšããŠãšã³ã³ãŒãããããšã§ããããã«ã¯ãåé¡ã®å€æ°ããã©ã¡ãŒã¿ãããã³ãããã®éã®é¢ä¿ãè¡šãæ°ããããŒã¿åãå®çŸ©ããããšãå«ãŸããŸããäŸãã°ãå·¡åã»ãŒã«ã¹ãã³åé¡ïŒTSPïŒã«åãçµãå ŽåãCitiesãRoutesãCost颿°ã®åãå®çŸ©ã§ããŸãã
- åå®å šãªéåããŒã¿æ§é ïŒåã·ã¹ãã ã䜿çšããŠãåé¡ã®å€æ°ãšç¶æ ã衚ãéåããŒã¿æ§é ãäœæããŸããããã«ã¯ãéåæŽæ°ãéåé åãªã©ãå€å žçãªããŒã¿åã®éåã¢ããã°ãå®çŸ©ããããšãå«ãŸããŸããäŸãã°ãTSPã«ãããå¯èœãªçµè·¯ãéåç¶æ ã®éãåãããšããŠè¡šçŸããŸãã
- åãã§ãã¯ãããéåæäœïŒåã·ã¹ãã ã¯ãéåæäœãåé¡ã®å¶çŽãšäžèŽããŠæ£ããé©çšãããŠããããšãæ€èšŒããŸããããã«ãããéåã²ãŒãããšã³ã³ãŒããããåé¡ã®ç¶æ ã®æå¹æ§ãç¶æããæ¹æ³ã§é©çšãããããšãä¿èšŒãããŸãã
- éååè·¯ã®ããã®äŸååïŒäŸååã䜿çšããŠãæ§é ãšæäœãåé¡ã®åã«äŸåããéååè·¯ãäœæããŸããããã«ããã解決ãããç¹å®ã®èª²é¡ã«åããããé«åºŠã«ç¹æ®åããæé©åãããéåã¢ã«ãŽãªãºã ãäœæã§ããŸãã
åå®å šãªéåæé©åã®äŸ
1. çµåãæé©åã®ããã®åå®å šãªéåã¢ããŒãªã³ã°
éåã¢ããŒãªã³ã°ã¯ãå·¡åã»ãŒã«ã¹ãã³åé¡ïŒTSPïŒãMaxCutåé¡ãªã©ã®çµåãæé©ååé¡ã解決ããããã«äœ¿çšã§ããéåæé©åææ³ã§ããåã䜿çšããŠåé¡ã®å¶çŽããšã³ã³ãŒãããããšã«ãããéåã¢ããŒãªã³ã°ã¢ã«ãŽãªãºã ãæå¹ãªè§£ã®ã¿ãæ¢çŽ¢ããæçµçµæãåé¡ã®å®çŸå¯èœãªè§£ã§ããããšãä¿èšŒã§ããŸãã
äŸïŒå·¡åã»ãŒã«ã¹ãã³åé¡ïŒTSPïŒ
TSPãèããŸããç®æšã¯ãåéœåžãã¡ããã©äžåºŠãã€èšªããæççµè·¯ãèŠã€ããããšã§ãã以äžã®åãå®çŸ©ã§ããŸãã
City: åé¡ã«ãããéœåžã衚ããŸããRoute: éœåžã®ã·ãŒã±ã³ã¹ã衚ããŸããCost: çµè·¯ã®ã³ã¹ãã衚ããŸãã
次ã«ããããã®åã§åäœããéåã¢ããŒãªã³ã°ã¢ã«ãŽãªãºã ãå®çŸ©ã§ããŸããããã«ãããã¢ã«ãŽãªãºã ãæå¹ãªçµè·¯ïŒã€ãŸããåéœåžãã¡ããã©äžåºŠãã€èšªããçµè·¯ïŒã®ã¿ãæ¢çŽ¢ããæçµçµæãæå°ã³ã¹ãã®çµè·¯ã§ããããšãä¿èšŒããŸãã
äŸãã°ãåå®å šãªéåã¢ããŒãªã³ã°ã®å®è£ ã¯ïŒæ¬äŒŒã³ãŒãã§ïŒæ¬¡ã®ããã«ãªããŸãã
data City = City { name :: String, location :: (Float, Float) }
data Route = Route [City]
data Cost = Cost Float
validRoute :: Route -> Bool
validRoute (Route cities) = allUnique cities
quantumAnnealer :: (Route -> Cost) -> IO Route
quantumAnnealer costFunction = do
-- ... éåã¢ããŒãªã³ã°ããžã㯠...
let bestRoute = -- ... éåã¢ããŒãªã³ã°ã®çµæ ...
if validRoute bestRoute then
return bestRoute
else
error "ç¡å¹ãªçµè·¯ãèŠã€ãããŸããïŒ"
ãã®äŸã§ã¯ãåã䜿çšããŠçµè·¯ãæå¹ã§ãªããã°ãªããªããšããå¶çŽã匷å¶ããéçºããã»ã¹ã®æ©ã段éã§ãšã©ãŒãææããŠããŸãã
2. éåååŠã®ããã®åå®å šãªå€åéååºæå€ãœã«ããŒïŒVQEïŒ
VQEã¯ãååãªã©ã®éåç³»ã®åºåºç¶æ ãšãã«ã®ãŒãè¿äŒŒããããã«äœ¿çšã§ãããã€ããªããéåå€å žã¢ã«ãŽãªãºã ã§ããåå®å šæ§ã䜿çšããããšã§ãVQEã¢ã«ãŽãªãºã ãæå¹ãªéåç¶æ ã§åäœããæçµçµæãç©ççã«æå³ã®ãããšãã«ã®ãŒå€ã§ããããšãä¿èšŒã§ããŸãã
äŸïŒæ°ŽçŽ ååïŒH2ïŒ
éåååŠã§ã¯ãVQEã¯ååã®åºåºç¶æ ãšãã«ã®ãŒãèšç®ããããã«äœ¿çšãããŸãã以äžã衚ãåãå®çŸ©ã§ããŸãã
Electron: é»åã衚ããŸããSpin: é»åã®ã¹ãã³ïŒäžãŸãã¯äžïŒã衚ããŸããMolecularOrbital: ååè»éã衚ããŸããHamiltonian: ååã®ããã«ããã¢ã³æŒç®åã衚ããŸããEnergy: ååã®ãšãã«ã®ãŒã衚ããŸãã
åå®å šãªVQEå®è£ ã¯ãè©Šè¡æ³¢å颿°ãæå¹ãªéåç¶æ ïŒäŸïŒããŠãªã®æä»åŸãæºããïŒã§ããããšãã«ã®ãŒèšç®ãæ£ããå®è¡ãããããšãä¿èšŒããŸãã
æ¬äŒŒã³ãŒãã®ç°¡ç¥åãããäŸã¯æ¬¡ã®ããã«ãªããŸãã
data Electron = Electron Int
data Spin = Up | Down
data MolecularOrbital = MO Int
data Hamiltonian = Hamiltonian Matrix
data Energy = Energy Float
validWaveFunction :: [Spin] -> Bool
validWaveFunction spins = -- ... ããŠãªã®æä»åŸã®ãã§ã㯠...
vqe :: Hamiltonian -> ([Float] -> [Spin]) -> IO Energy
vqe hamiltonian ansatz = do
-- ... éååè·¯ã®å®è¡ ...
let spins = ansatz parameters
if validWaveFunction spins then
let energy = -- ... ããã«ããã¢ã³ãšã¹ãã³ã䜿çšããŠãšãã«ã®ãŒãèšç® ...
return (Energy energy)
else
error "ç¡å¹ãªæ³¢å颿°ïŒããŠãªã®æä»åŸã«éåããŠããŸãã"
ãã®äŸã¯ãåãéåç³»ã«ç©ççå¶çŽã匷å¶ããããä¿¡é Œæ§ã®é«ãæ£ç¢ºãªçµæãããããæ¹æ³ã瀺ããŠããŸãã
3. åå®å šãªéåè¿äŒŒæé©åã¢ã«ãŽãªãºã ïŒQAOAïŒ
QAOAã¯ãçµåãæé©ååé¡ã®è¿äŒŒè§£ãèŠã€ããããã«äœ¿çšãããå¥ã®éåã¢ã«ãŽãªãºã ã§ããåå®å šæ§ã«ãããéååè·¯ã®ãã©ã¡ãŒã¿ãç¹å®ã®åé¡ã«å¯ŸããŠæ£ããæé©åãããŠããããšãä¿èšŒã§ããããè¯ãããã©ãŒãã³ã¹ã«ã€ãªãããŸãã
äŸïŒMaxCutåé¡
ã°ã©ãäžã®MaxCutåé¡ãèããŸãã以äžã®ãããªåãå®çŸ©ã§ããŸãã
Vertex: ã°ã©ãå ã®é ç¹ã衚ããŸããEdge: 2ã€ã®é ç¹éã®èŸºã衚ããŸããCut: é ç¹ã2ã€ã®éåã«åå²ãããã®ã衚ããŸããCutSize: ã«ããã®ãµã€ãºïŒåå²ã暪åãèŸºã®æ°ïŒã衚ããŸãã
åå®å šãªQAOAå®è£ ã¯ãã°ã©ãæ§é ã«åºã¥ããŠéååè·¯ãæ£ããæ§ç¯ãããã«ãããµã€ãºãæå€§åããããã«æé©åãã©ã¡ãŒã¿ãéžæãããŠããããšãä¿èšŒããŸãã
æ¬äŒŒã³ãŒãã®äŸïŒ
data Vertex = Vertex Int
data Edge = Edge Vertex Vertex
data Cut = Cut [Vertex] [Vertex]
data CutSize = CutSize Int
validCut :: [Vertex] -> [Edge] -> Cut -> Bool
validCut vertices edges (Cut set1 set2) = -- ... set1ãšset2ãã°ã©ãã®æå¹ãªã«ããã圢æããããæ€èšŒ ...
qaoa :: [Vertex] -> [Edge] -> [Float] -> IO Cut
qaoa vertices edges parameters = do
-- ... ã°ã©ããšãã©ã¡ãŒã¿ã«åºã¥ããŠQAOAåè·¯ãæ§ç¯ ...
let cut = -- ... éåç¶æ
ãæž¬å®ããŠã«ãããååŸ ...
if validCut vertices edges cut then
return cut
else
error "ç¡å¹ãªã«ãããçæãããŸããïŒ"
å®è£ æŠç¥
ããã€ãã®ããã°ã©ãã³ã°èšèªãšãã¬ãŒã ã¯ãŒã¯ãåå®å šãªéåããã°ã©ãã³ã°ããµããŒãããŠããŸããæ³šç®ãã¹ãäŸãšããŠã¯ã以äžãæããããŸãã
- Quipper: éåããã°ã©ãã³ã°ã®ããã«ç¹å¥ã«èšèšããã颿°åããã°ã©ãã³ã°èšèªã§ããéåããŒã¿ãšæäœã衚çŸããããã®è±å¯ãªåã·ã¹ãã ãæäŸããŸããQuipperã¯ãã¹ãèšèªãšããŠHaskellã䜿çšããHaskellã®åŒ·åãªåã·ã¹ãã ãåãç¶ãã§ããŸãã
- Q#: Microsoftã®éåããã°ã©ãã³ã°èšèªã§ã.NETãã¬ãŒã ã¯ãŒã¯ãšçµ±åãããŠããŸããQ#ã¯äžéšã®åå®å šæ©èœãåãå ¥ããŠããŸããããã®åã·ã¹ãã ã¯Haskellã®ãããªé¢æ°åèšèªã»ã©è¡šçŸåè±ãã§ã¯ãããŸããã
- Silq: åå®å šãã€ãªãœãŒã¹ãæèããèšèšã®é«çŽéåããã°ã©ãã³ã°èšèªã§ããSilqã¯ã³ã³ãã€ã«æã«ããããéåããã°ã©ãã³ã°ãšã©ãŒãé²ãããšãç®æããŠããŸãã
- ã«ã¹ã¿ã ã©ã€ãã©ãªãšDSLïŒHaskellãScalaãªã©ã®åå®å šãªãã¹ãèšèªã«åã蟌ãŸãããã¡ã€ã³åºæèšèªïŒDSLïŒãäœæããŸããããã«ããæè»æ§ãæäŸãããåã·ã¹ãã ãéåæé©ååé¡ã®ç¹å®ã®ããŒãºã«åãããŠèª¿æŽã§ããŸãã
åå®å šãªéåæé©åã¢ã«ãŽãªãºã ãå®è£ ããéã«ã¯ã以äžã®æŠç¥ãæ€èšããŠãã ããã
- 匷åãªåã·ã¹ãã ããå§ããïŒHaskellãScalaãSilqãªã©ã®åŒ·åãªåã·ã¹ãã ãæã€ããã°ã©ãã³ã°èšèªãŸãã¯ãã¬ãŒã ã¯ãŒã¯ãéžæããŸãã
- åé¡ã®å¶çŽãåãšããŠã¢ãã«åããïŒæé©ååé¡ã®å¶çŽãæ³šææ·±ãåæããããã°ã©ãã³ã°èšèªã§ããããåãšããŠãšã³ã³ãŒãããŸãã
- 代æ°çããŒã¿åã䜿çšããïŒä»£æ°çããŒã¿åïŒADTïŒã掻çšããŠãéåããŒã¿æ§é ãšæäœãåå®å šãªæ¹æ³ã§è¡šçŸããŸãã
- äŸååãçšããïŒããã°ã©ãã³ã°èšèªãäŸååããµããŒãããŠããå Žåããããã䜿çšããŠãæ§é ãšæäœãåé¡ã®åã«äŸåããéååè·¯ãäœæããŸãã
- å æ¬çãªåäœãã¹ããäœæããïŒåå®å šãªéåæé©åã¢ã«ãŽãªãºã ã培åºçã«ãã¹ãããæåŸ éãã«åäœããããšã確èªããŸãã
課é¡ãšä»åŸã®æ¹åæ§
åå®å šãªéåããã°ã©ãã³ã°ã¯å€§ããªå©ç¹ãæäŸããäžæ¹ã§ãããã€ãã®èª²é¡ãæ±ããŠããŸãã
- è€éãïŒåã·ã¹ãã ã¯è€éã§ãããåçè«ã«å¯Ÿããæ·±ãçè§£ãå¿ èŠãšããŸãã
- ããã©ãŒãã³ã¹ãªãŒããŒãããïŒåãã§ãã¯ã¯ããããã®ããã©ãŒãã³ã¹ãªãŒããŒããããçºçãããå¯èœæ§ããããŸãããããã¯ãšã©ãŒã®åæžãã³ãŒãå質ã®åäžãšãã£ãå©ç¹ã«ãã£ãŠçžæ®ºãããããšãå€ãã§ãã
- éãããããŒã«ïŒåå®å šãªéåããã°ã©ãã³ã°ã®ããã®ããŒã«ã¯ããŸã éçºã®åææ®µéã«ãããŸãã
ãã®åéã®ä»åŸã®ç ç©¶æ¹åã«ã¯ã以äžãå«ãŸããŸãã
- éåããã°ã©ãã³ã°ã®ããã®ãã衚çŸåè±ããªåã·ã¹ãã ã®éçºã
- åå®å šãªéåæé©åã®ããã®ããããŠãŒã¶ãŒãã¬ã³ããªãŒãªããŒã«ãšã©ã€ãã©ãªã®äœæã
- éåæ©æ¢°åŠç¿ãéåã·ãã¥ã¬ãŒã·ã§ã³ãªã©ãä»ã®éåã³ã³ãã¥ãŒãã£ã³ã°ã¢ããªã±ãŒã·ã§ã³ã«ãããåå®å šããã°ã©ãã³ã°ã®æŽ»ç𿢿±ã
- åå®å šãªéåããã°ã©ãã³ã°ãšåœ¢åŒçæ€èšŒæè¡ã®çµ±åã«ãããããã«é«ãã¬ãã«ã®ä¿èšŒãæäŸããããšã
çµè«
åå®å šãªéåæé©åã¯ãããä¿¡é Œæ§ãé«ãå¹ççãªéåã¢ã«ãŽãªãºã ãéçºããããã®ææãªã¢ãããŒãã§ããåã·ã¹ãã ã®å³å¯ããæŽ»çšããããšã§ãéçºããã»ã¹ã®æ©ã段éã§ãšã©ãŒãææããã³ãŒãå質ãåäžãããéåãœãããŠã§ã¢ã®æ€èšŒã匷åã§ããŸãã課é¡ã¯æ®ããã®ã®ãåå®å šãªéåããã°ã©ãã³ã°ã®æœåšçãªå©ç¹ã¯å€§ããããã®åéã¯ä»åŸãæé·ãšé©æ°ãç¶ããã§ããããåé¡è§£æ±ºåå®è£ ã®å©çšã¯ãåé¡ã®å¶çŽãåã·ã¹ãã ã«çŽæ¥ãšã³ã³ãŒãããããšã§ãåå®å šãªéåããã°ã©ãã³ã°ã®å©ç¹ãããã«é«ããŸãããã®ã¢ãããŒãã¯ãå¹ åºãæé©ååé¡ã«å¯ŸããŠãããå ç¢ã§æ€èšŒå¯èœãã€å¹ççãªéåãœãªã¥ãŒã·ã§ã³ããããããŸãã
éåã³ã³ãã¥ãŒãã£ã³ã°æè¡ãæçããã«ã€ããŠãéåãœãããŠã§ã¢ã®æ£ç¢ºæ§ãšä¿¡é Œæ§ã確ä¿ããããã«ãåå®å šæ§ããŸããŸãéèŠã«ãªãã§ããããåå®å šãªããã°ã©ãã³ã°ååãåãå ¥ããããšã¯ãéåæé©åããã³ãã®ä»ã®éåã³ã³ãã¥ãŒãã£ã³ã°ã¢ããªã±ãŒã·ã§ã³ã®å¯èœæ§ãæå€§éã«åŒãåºãäžã§äžå¯æ¬ ãšãªããŸãã
åã·ã¹ãã ãçšããŠçŸå®äžçã®åé¡ã解決ãããã®ã¢ãããŒãã¯ãéåã³ã³ãã¥ãŒãã£ã³ã°ã«éå®ããããã®ã§ã¯ãªããæ©æ¢°åŠç¿ããµã€ããŒã»ãã¥ãªãã£ãªã©ã®ä»ã®åéã«ãå¿çšå¯èœã§ãããåŠã¶äŸ¡å€ã®ããã¹ãã«ãšãªããŸãã