ïŒããã°ã©ãåãã®ãšãã¥ãŒããŸãã¯æ°ããã¿ã€ãã®ã€ã³ã¿ãŒãããæ€çŽ¢ã®ãªã¯ãšã¹ãïŒ
ãã©ã€ãã象ãäœæããããã°ã©ã ïŒä»¥äžãMSããã°ã©ã ãšåŒã³ãŸãïŒã¯ãæå®ãããæåæ°ã®åè©ã®ç¡åã°ã©ãã«ã¯æ°åã®é ç¹ãå«ãŸããŠããŸããã
å®å
šãªã°ã©ãã«å¯ŸããŠããªãã现ããïŒã€ãŸãããšããžãæ¯èŒçå°ãªãïŒããšã瀺ããŸãã圌ã¯é ãé¢ããŠããŸãïŒäŸ1ãåç
§ïŒã èæž ã
Etudes for Programmers ãã®èè
ã§ãã
Charles Wetherellã«ç¶ãã圌ã¯ãã®ãããªã°ã©ãã
è¡šçŸ ããããŸããŸãªæ¹æ³ã
æç€ºããããã«ãšãã¥ãŒãã®ãžã£ã³ã«ãéžæããŸããã ïŒãããŠãããããçµè«ãåŒãåºããŠããã¬ãŒã³ããŒã·ã§ã³ã®éžæãèªååããŸã-ããããæ°ããã¿ã€ãã®ã€ã³ã¿ãŒãããæ€çŽ¢ã«è³ããŸã§ïŒã
Start for word length 8
6016 words loaded from dictionary file: ..\Dictionary\ORF3.txt
Graph was made: edges number = 871
äŸ1. 8æåã®åè©ã°ã©ãã®ç¹æ§ãæ§ããã«èšã£ãŠãããããã©ãŒãã³ã¹ã®æç€ºãã¯èãããã«èãããŸãããç§ã®æèŠã§ã¯ããã®ãããªç²ãã¯ãšãã¥ãŒãã®ãžã£ã³ã«ãšæãäžèŽããŠãããããã€ãã®ç°ãªãããªãšãŒã·ã§ã³ã®æŠèŠã瀺ããŠããŸãïŒWeserellã«ããïŒã èãããããã¹ãŠã®ã±ãŒã¹ã«å¯ŸããŠèšèšãè¡ããŸãããæçµçãªå®å
šãªãœãªã¥ãŒã·ã§ã³ã¯æäŸããŸããã å®è£
ã®äºæ¬¡çãªçŽç²ã«æè¡çãªè©³çްã«ãã ããã€ããã¯ãããŸããããããŠããããã䜿ã£ãŠèª¿æ»ãéè² è·ã«ããªãããã«ãæ¬è³ªã®ããã«æãéèŠãªã³ãŒãã®æçã®ã¿ãåŒçšããŸãã åè¿°ã®MSããã°ã©ã ã®ããã«ïŒã³ãŒãã®åå©çšã®çç±ãå«ãïŒãå€ãOO Pascal Delphi-7ã䜿çšããŸãããã®ãããªã·ã³ãã«ã§åºãç¥ãããŠããèšèªãèªã¿ããããå¿
èŠã«å¿ããŠãããçŸä»£çãªãŠãããŒãµã«èšèªã«ç°¡åã«ç¿»èš³ã§ããããšãé¡ã£ãŠããŸãããã°ã©ãã³ã°ã ã°ã©ãçè«ã®åºç€ã«ã€ããŠã¯è§ŠããŸãã-ãããã¯ã以äžã§äœ¿çšãããä»ã®ãã®ãšåæ§ã«ããŠã£ãããã£ã¢ã§æŠå¿µãšçšèªãæç¢ºã«ããããšãã§ããŸã-å Žåã«ãã£ãŠã¯ãªã³ã¯ãæäŸããŸãã ãããåæã«ãç§ã¯wikièšäºã®æ£ç¢ºæ§ã«å¯Ÿãã責任ãå®å
šã«æåŠããŸããåèšäºã«ã¯ãWikiã«ãŒã«ã«åŸã£ãŠãä¿¡é Œã§ãããœãŒã¹ãžã®ãªã³ã¯ãããããããã®ãœãŒã¹ã¯æçµçãªèª¬æã«äœ¿çšãããã¹ãã§ãã
ãŸãã説æãããã¹ãããŒãã°ã©ãã¯ãåèªã²ãŒã ã ãã§ãªããããæ·±å»ãªã¿ã¹ã¯ã«ãå¿
èŠã§ããããšã«æ³šæããŠãã ããã ããšãã°ã
ã³ã³ãã¥ãŒã¿ãŒïŒæ°åŠïŒææ©ååŠã§ã¯ãååŠååã¯ãé ç¹ãååã«å¯Ÿå¿ããååŠçµåããšããžã«å¯Ÿå¿ããã°ã©ããšããŠè¡šãããŸãã ãã®ãããªè¡šçŸïŒæ£åŒãªè«ççã¢ãããŒããšåŒã°ããããšããããŸãïŒã¯ãäŒçµ±çã«
æ§é åŒãš
ããŒã«ãããã¢ãã«ã䜿çšããææ©ååŠã®å€å
žçãªæ§é çè«ã«å¯Ÿå¿ããŠã
ãŸã ã ãããŠãçŸä»£ã®ãã¹ãŠã®ååŠè
ã¯ãååãããŒã«ã®ãããªãã®ã§ã¯ãªããååéã®çµåããããã®ãããªãã®ã§ã¯ãªãããšã確å®ã«ç¥ã£ãŠããŸããããããã®ã¢ãã«ã¯ååŠã«ãããŠåºãæåè£ã«é©çšããç¶ããŠããŸãã ææ©ååã®éªšæ Œã¯äž»ã«å䟡ççŽ ã§æ§æãããŠããããããããã衚ãã°ã©ãã®é ç¹ã®æ¬¡æ°ã¯4ãè¶
ããŸããã 確ãã«ãäŸå€ã¯å¯èœã§ããããšãã°ã
ãã§ãã»ã³ååã®ã°ã©ãã§ã¯ãéååã«å¯Ÿå¿ããé ç¹ã®æ¬¡æ°ã¯10ã§ããå®å
šãªã°ã©ãã¯
ã·ã¯ããããã³ã®ççŽ éªšæ Œã®ã¿ã§ãæ®ãã¯éåžžã«äžå®å
šã§ãã ãã®ã¹ã±ããã¯ãã°ã©ãã䜿çšããäžå®ã®å€§éäœæ¥ã«ã¯åœ¹ç«ã¡ããã«ãããŸããããã²ãŒã ãªã©ã®ç¶æ³åé¡ã解決ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã ãããã«ããŠãããã®ç°¡åãªäŸã«ããããã¬ãŒã³ããŒã·ã§ã³ã®éžæïŒAIã®äœ¿çšãå«ãïŒã®åé¡ã«å¯Ÿããç¥ç解決çã®ã¢ã€ãã¢ã説æã§ããŸãã
MSããã°ã©ã ã®å Žåãšåæ§ã«ãå衚çŸã§ã¯ãã°ã©ãã®é ç¹ã®ç¹å®ã®ãã¢éã®æçãã¹ãæ€çŽ¢ããŸãã TGraphã¯ã©ã¹ãå®çŸ©ããããšããå§ããŸãããã
TGraph = class(TObject) protected procedure initA (vNum, eNum : integer); virtual; abstract; procedure addEdgeA (v,u : integer); virtual; abstract; function isEdgeA (v,u : integer) : Boolean; virtual; abstract; private vertNum : integer;
åå«ããã®çœ®æã«ã¯ãä¿è·ãããïŒä¿è·ãããïŒæœè±¡ã¡ãœãããå¿
èŠã§ãã äŸïŒ
procedure TGraph.addEdge (v,u : integer); begin addEdgeA (v,u); end;
䜿çšãããåçé
åã§ã¯ãã€ã³ããã¯ã¹ä»ãã¯ãŒãããå§ãŸããŸãããã°ã©ãçè«ã«é¢ããå€ãã®æ¬ã§ã¯ãé ç¹ãšãšããžã®çªå·ä»ãã¯1ããå§ãŸããŸãã ã°ã©ããæ¥ç¶ããå¿
èŠããªããããå
¥åãããšãïŒããã«ã€ããŠã¯åŸã§èª¬æããŸãïŒãããã©ã«ãã§å€ç«ãããŒãã®é ç¹ãèš±å¯ããæ¬ã®æåã®é ç¹ããã°ã©ããå
¥åã§ããŸãã
飿¥è¡åïŒadjMatrixïŒã䜿çšããã°ã©ã衚çŸã¯ãããããæãäžè¬çã§æ®éçãªè¡šçŸã®1ã€ã§ãã äžè¬çãªå Žåããã®è¡åã¯ããšããžïŒvãuïŒãèŠçŽ adjMatrix [vãu] = trueïŒåæåäžã«falseããã¹ãŠã®èŠçŽ ã«æžã蟌ãŸããïŒã«å¯Ÿå¿ããæåã°ã©ããšããŠè¡šãããšãã§ããŸãã ãã®ãããªã°ã©ãã¯æ¬¡ã®ããã«å®çŸ©ã§ããŸãã
TDirectedGraph = class(TGraph) protected procedure initA (vNum,eNum : integer); override; procedure addEdgeA (v,u : integer); override; function isEdgeA (v,u : integer) : Boolean; override; end;
åãã¯ã©ã¹ãç¡åã°ã©ãã«äœ¿çšã§ããŸãã ãã®å Žåãé ç¹ã®ãã¢ïŒvãuïŒã«å
¥å°ããç¡åã°ã©ãã®ãšããžã¯ãæåã°ã©ãã®ãšããžïŒvãuïŒããã³ïŒuãvïŒã«å¯Ÿå¿ããŸãã ãããç§ãã¡ãããããšã§ãã ãããã£ãŠããšããžã®è¿œå ã¡ãœããïŒaddEdgeAïŒã¯æ¬¡ã®ããã«å®çŸ©ãããŸãã
procedure TDirectedGraph.addEdgeA (v,u : integer); var i,j : integer; begin if not adjMatrix [v,u] then begin adjMatrix [v,u] := true; adjMatrix [u,v] := true; inc (edgeNum);
ãšããžãæ¯èŒçå°ãªãå Žåã飿¥è¡åã¯çã«ãªããŸãã ãã®ãããªè¡åã®äœ¿çšã«ã€ããŠã¯ã
SãPissanetskiãSparse Matrix TechnologyãM .: Mirã1988ã®æ¬ã§è©³ãã説æãããŠããŸãã ããã§ã¯ãããã§èª¬æãããŠããããªãæŽç·Žãããææ³ãé©çšããããšã¯ãããäžäžè§ãµããããªãã¯ã¹ã®ã¿ã䜿çšããŠãã®ãããªãã¯ã¹ãåçŽã«ãååãã«ããŸãã ã«ãŒãã®ããã°ã©ãã¯èæ
®ããªããããã¡ã€ã³ã®å¯Ÿè§ç·ã¯å¿
èŠãããŸããã å¥ã®ã¯ã©ã¹ãå®çŸ©ããŸãã
TUndirectedGraph = class(TGraph) protected procedure initA (vNum,eNum : integer); override; procedure addEdgeA (v,u : integer); override; function isEdgeA (v,u : integer) : Boolean; override; public procedure clear; end;
次ã®åæåã¡ãœããã䜿çšã§ããŸãã
procedure TUndirectedGraph.initA (vNum, eNum : integer); var i,j : integer; begin degVector := nil; predV := nil; path := nil; vertNum := vNum; setLength (adjMatrix,vertNum-1); setLength (degVector,vertNum); for i:=0 to vertNum-2 do begin degVector [i] := 0; setLength (adjMatrix [i], i+1); for j := 0 to i do adjMatrix [i,j] := false; end; degVector [vertNum-1] := 0; end;
ãã®å Žåããšããžã®è¿œå ã¡ãœããïŒaddEdgeAïŒã¯ãæåã°ã©ãã®å Žåãšã¯ç°ãªããŸãã
procedure TUndirectedGraph.addEdgeA (v,u : integer); var i,j : integer; begin if v>u then begin i := v-1;
åæ§ã«ãisEdgeAã¡ãœããã®å®è£
æ¹æ³ã¯ç°ãªããŸãã
function TDirectedGraph.isEdgeA (v,u : integer) : Boolean; begin Result := adjMatrix [v,u]; end; function TUndirectedGraph.isEdgeA (v,u : integer) : Boolean; begin if u<v then Result := adjMatrix [v-1,u] else if u>v then Result := adjMatrix [u-1,v] else Result := false; end;
ã§ã¯ãéåžžã«å€§ããªã°ã©ããããšãã°100äžåã®é ç¹ãåŠçããæ¹æ³ã«ã€ããŠèããŠã¿ãŸãããã -ãã®ãããªãµã€ãºã®äžè§åœ¢ã®é£æ¥è¡åã§ããã倧ããããå ŽåããããŸãïŒ ä»¥äžã®å®çŸ©ãäœæããŸãã
TEdgeRec = record v1,v2 : integer; end; TBigUndirectedGraph = class(TGraph) protected procedure initA (vNum,eNum : integer); override; procedure addEdgeA (v,u : integer); override; function isEdgeA (v,u : integer) : Boolean; override; private edgeIndex : integer; edges : array of TEdgeRec; nbVertex : array of integer;
ãšããžãæ¯èŒçå°ãªãã¹ãããŒã°ã©ãã§äœæ¥ããŠããããšãèãããšããšããžãšããžãã¯ãã«ã®ãšããžã«ä»éããé ç¹ã®ãã¢ãèŠããŠããŸãã
procedure TBigUndirectedGraph.addEdgeA (v,u : integer); begin with edges [edgeIndex] do begin v1 := v; v2 := u; end; inc (edgeIndex); inc(degVector [v]); inc(degVector [u]); end;
ãã®ã¢ãããŒãã¯ã飿¥ãªã¹ãã®åœ¢åŒã§ã®ã°ã©ãã®æãçµæžçãªè¡šçŸã®1ã€ã«å¯Ÿå¿ããŸãã ç¹ã«ãã°ã©ããæåã§å
¥åããã®ã«éåžžã«äŸ¿å©ã§ãã æ¬¡ã®åœ¢åŒã䜿çšããŠããšããžãèšé²ã§ããŸãã
vu
ããã§ãvãuã¯ãšããžã«ä»éããé ç¹ã§ãã
ãšã³ããªã¯æååã§äœæãããã«ã³ãã§åºåãããŸãã åçŽãªå Žåã§ããè¡ãå
¥åããæ¹ã䟿å©ã§ãã
1-2,2-3,3-1
3x3飿¥è¡åãå
¥åãããããã
ãã ããããããããšã§ãããããã°ã©ã ããšããžãã¯ãã«ãšããžãçŽæ¥æäœããå Žåãã¡ã¢ãªéãç¯çŽããããšã¯æéã®æµªè²»ã«ãªãå¯èœæ§ããããŸãã å®éãisEdgeAã¡ãœããã§ã¯ããã¹ãŠã®ãšããžãå埩åŠçããå¿
èŠãããå ŽåããããŸãã ãã¡ããããã®ãã¯ãã«ãäžŠã¹æ¿ããŠååã«åå²ããŠæ€çŽ¢ããããšãã§ããŸãããåé ç¹ã®è§åºŠãå°ãããããšãããé«éãªæ¹æ³ã䜿çšã§ããŸãã ãã¯ãã«nbVertexã«ã¯ãåé ç¹ã®è¿åãæžã蟌ã¿ãŸãã é ç¹ã®è¿åã®æ°ã¯ãã®æ¬¡æ°ã«å¯Ÿå¿ãããããé ç¹ããŒãã®è¿åã¯æ¬¡ã®ããã«èšè¿°ãããŸãã
NbVertex [0], âŠ, nbVertex[deg(0)-1]
次ã«ãæåã®é ç¹ã®è¿åãªã©ãåæ§ã«èšè¿°ãããŸã åé ç¹ã®æåã®åè¿åã®ã€ã³ããã¯ã¹ã¯ãnbStartãã¯ãã«ã«ä¿åãããŸãã
nbStart[0]=0, nbStart[1]= deg(0),âŠ
ãã®ãããªã€ã³ããã¯ã¹ã¯ãè£å©ãã¯ãã«nbCountã䜿çšããã¡ãœããã«ãã£ãŠå®è¡ãããŸãã
procedure TBigUndirectedGraph.calcNb; var i,n : integer; begin n := 0; for i:=0 to vertNum-1 do begin nbStart [i] := n; nbCount [i] := n; inc (n, degVector [i]); end; for i:=0 to edgeNum-1 do begin nbVertex [nbCount[edges [i].v1]] := edges [i].v2; inc (nbCount[edges [i].v1]); nbVertex [nbCount[edges [i].v2]] := edges [i].v1; inc (nbCount[edges [i].v2]); end; end;
é ç¹ã®ãã¢ïŒvãuïŒã®isEdgeAã¡ãœããã¯ãæå€§ã§degïŒvïŒnbVertexèŠçŽ ã®åæãå¿
èŠãšããŸãã
function TBigUndirectedGraph.isEdgeA (v,u : integer) : Boolean; var i,n,d : integer; begin d := deg (v); if d>0 then begin n := nbStart [v]; for i:=0 to d-1 do begin Result := nbVertex[n+i]=u; if Result then exit; end; end else Result := false; end;
ãã®ãããªæ€çŽ¢ã¯ãæå®ãããå¶éå
ã®è€æ°ã®äœçœ®ããç¬ç«ããŠå®è¡ã§ãããããéåžžã«å€§ããªã°ã©ãã§å€§ããªãã¯ãŒãæã€é ç¹ãèŠã€ãã£ãå Žåãæ€çŽ¢ãç°¡åã«äžŠååã§ããŸãã äžéšã®ã¢ã«ãŽãªãºã ã§ã¯ããšããžã®è¿œå ãšåé€ãå¿
èŠã«ãªãå ŽåããããŸãã ããã¯äžèšã®è¡šçŸã§ã¯ç°¡åã«ã§ããŸãããåŸè
ã®å Žåã¯ããã§ã¯ãªããæããã«ãã€ãã¹ã§ãã ãã ããç®çã®ããã«-æçãã¹ãèŠã€ãã-ãšããžã远å ããã³åé€ããå¿
èŠã¯ãããŸããã
æççµè·¯ãèŠã€ããŸãããã 䜿çšãããŠããBFSã¢ã«ãŽãªãºã ã¯å€å
žçã§ãããWikipediaã§å販ãããå€ãã®æ¬ã§è©³ãã説æãããŠããããããã®èª¬æãçç¥ããŠå®è£
ã瀺ããŸãã
function TGraph.BFSsp(v,u : integer) : Boolean;
3ã€ã®ç°ãªãã°ã©ã衚çŸã®èšè¿°ãããã¯ã©ã¹ã¯ãããã°ã©ã ãäœæããããããã°ãšãã¹ãïŒããã³ãã®èª¿æ»ã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ïŒã®ããã«å¥ã®ã¢ãžã¥ãŒã«ã«å®è£
ãããŸãã-ããã°ã©ã TãšåŒã³ãŸãããããã®ããã°ã©ã ã®ãŠã£ã³ããŠã®ã¹ã¯ãªãŒã³ã·ã§ãããå³ã«ç€ºããŸãã

[å
¥åã°ã©ã]ãã£ãŒã«ãã«ãã°ã©ãã®é£æ¥ã®ãªã¹ããäžèšã®åœ¢åŒã§å
¥åã§ããŸãã [çµæ]ãã£ãŒã«ãã«ãããã°ã©ã ã¯ã¡ãã»ãŒãžãšäœæ¥çµæã衚瀺ããŸãã ãã®åºåã¯ã[ä¿å]ãã¿ã³ã䜿çšããŠããã¹ããã¡ã€ã«ã«ä¿åã§ãã[ã¯ãªã¢]ãã¿ã³ã䜿çšããŠãã£ãŒã«ããã¯ãªã¢ã§ããŸãã [ã°ã©ãã®ã¯ã©ã¹ãéžæ]ããããããŠã³ãªã¹ãã䜿çšãããšã説æãããŠãããã¥ãŒã®ãããããéžæã§ããŸãã ãããã®æ°ã¯å°ãªããéçºäžïŒèšèšæïŒã«æåã§å
¥åããããšãå¯èœã§ãããå°æ¥ä»ã®ãã¥ãŒã远å ãããå¯èœæ§ããããããå®è¡æã«ïŒå®è¡æã«ïŒãªã¹ãã«ããŒã¿ã远å ããŸãã ãããè¡ãã«ã¯ãã¡ã€ã³ãã©ãŒã ãäœæããããã®æ¬¡ã®ç°¡åãªã€ãã³ããã³ãã©ãŒãäœæããŸãã
procedure TMainForm.FormCreate(Sender: TObject); begin dg := TDirectedGraph.create; ug := TUndirectedGraph.create; bg := TBigUndirectedGraph.create; ComboBoxClass.AddItem(dg.ClassName,dg); ComboBoxClass.AddItem(ug.ClassName,ug); ComboBoxClass.AddItem(bg.ClassName,bg); ComboBoxClass.ItemIndex := 0; end;
ããã§äœæãããã°ã©ãïŒdgãugãbgïŒã䜿çšãããšãããã°ã©ã ã¯åŒãç¶ãåäœããŸãã 飿¥ãªã¹ãã®è§£æãšãããŒããã£ã¹ãã¯ç°¡åãªãããèªè
ã®èª¬æã«èªè
ã®æ³šæãç¡é§ã«ãããŸããã ããã°ã©ã ã®2çªç®ã®ã¡ã€ã³ãã¹ãã«é²ã¿ãŸãããããŠãŒã¶ãŒå®çŸ©ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠãã©ã³ãã ã°ã©ãå
ã®é ç¹ã®ã©ã³ãã ãã¢ïŒãã¹ãé ç¹ïŒéã®æçãã¹ãèŠã€ããŸãã ãã®ãããªã°ã©ããçæããã«ã¯ã芪ã¯ã©ã¹ã«æ¬¡ã®ç°¡åãªã¡ãœããã远å ããŸãã ã¡ãœãããã©ã¡ãŒã¿-é ç¹ã®æ°ãšé ç¹ã®æå€§æ¬¡æ°ïŒ
procedure TGraph.make (eNum, maxDeg : integer); var n,i,j : integer; begin randomize; n := 0; repeat i := random (vertNum);
çæãããã°ã©ããã³ããŒããã«ã¯ã次ã®ç°¡åãªæ¹æ³ã䜿çšã§ããŸãã
procedure TGraph.copy (g : TGraph);
ãã¹ãé ç¹ã®æ€çŽ¢ãè€éã«ãªããŸããã§ããïŒã€ã³ã¿ãŒãããã§ã®è©³çްãªéç ç©¶ã®ç ç©¶ã§ã¯ãã©ã³ãã ã°ã©ããçæããããã®å€ãã®åªããæé ãèŠã€ããããšãã§ããŸãïŒã
function TGraph.findTestPair : string; var i,j,maxV1,maxV2 : integer; maxLen : integer; begin maxLen := 0; maxV1 := 0; maxV2 := 0; for i := 1 to maxGen do begin testPairV1 := random (vertNum);
10ã«çããmaxGen宿°ã䜿çšããŸããããéãè¯ããã°ããã¹ãŠã®äžä»£ãé©åã§ãããšã¯éããŸããã å
žåçãªçµæã®1ã€ã瀺ããŸãã
--- Benchmark ---------
Vertex number: 3000 Edge number: 4000 Max degree: 4
TDirectedGraph: Test vertex pair 2671, 853 Path length 12
TDirectedGraph: shortest path 2671-2629-2646-1658-499-2625-354-1027-626-733-2641-853
Elapsed time: 0.0160002149641514 sec.
TUndirectedGraph: shortest path 2671-2629-2646-1658-499-2625-354-1027-626-733-2641-853
Elapsed time: 0.030999630689621 sec.
TBigUndirectedGraph: shortest path 2671-2629-2646-1658-499-2625-354-1027-626-733-2641-853
Elapsed time: 0.0470004742965102 sec.
ä»ã®åé¡ã§ã¯ãæéå·®ã¯ããã«å°ãããªããŸãããå
šäœçã«åŸåããããŸã
ã©ãã§
-æéã
ãããã£ãŠãäžæ¹ã§ã¯ãïŒäœ¿çšãããŠãããã®ããïŒãã¬ãŒã³ããŒã·ã§ã³ã®å€æŽã¯ç¹ã«é床ã«åœ±é¿ãäžããªããããããŸããããäžæ¹ã§ã¯ãç¹å®ã®ã¿ã¹ã¯ããã³äºæ³ãããã¿ã€ãã®ã°ã©ãã§ã¯ãç°ãªããã¥ãŒã詊ã䟡å€ããããŸãã 圌ã¯ãææ¡ããšããèšèãç¹ã«åŒ·èª¿ããŸããã 瀺ãããŠããçµæã¯ãã«ããŽãªå¥ã®æšå¥šäºé
ã«ã¯ããŸãã«ãç·©ããã®ã§ãã å¥ã®ã¿ã¹ã¯ã§ã¯ã質çã«ç°ãªãçµæã衚瀺ãããå ŽåããããŸãã ããããããã¹ãŠã®å Žåã«1ã€ã®è¡šçŸãéžæããããšã¯ã§ããŸããã ããã«é¢é£ããŠã次ã®èããçŸããŸãã éåžžã説æãããŠããTããã°ã©ã ãªã©ã®ããã°ã©ã ã¯ãã©ã€ãã©ãªã®éçºãšæçµãã¹ãã®æ®µéã§äœ¿çšãããŸããããŠãŒã¶ãŒã«ã¯å±ããŸããã åæã«ãå€ãã®å€§èŠæš¡ãªã©ã€ãã©ãªã§ã¯ãåãããšãè¡ã颿°ãèŠã€ããããšãã§ããŸãããç°ãªãæ§é ãšç°ãªãã¡ãœããã®ããŒã¿ã䜿çšããŸãã ãã®ãããªå Žåãéçºè
ãããŒã«ã䜿çšããŠãã©ã€ãã©ãªãæèçãã€ååãªæ
å ±ã«åºã¥ããéžæãè¡ããããã«ãããšéåžžã«åœ¹ç«ã€ãšæããŸãã æ¬¡ã®æ®µéçãªã¹ãããã¯ãå¿
èŠãªãã¹ããçæããããã®ãŠãŒã¶ãŒãã©ã¡ãŒã¿ãŒãåãåãããããã®ãã¹ãã®çµæã«åºã¥ããŠã¢ã«ãŽãªãºã ãšããŒã¿æ§é ãéžæããã©ã€ãã©ãªãªãœãŒã¹ã®äœ¿çšã«é¢ãããŠãŒã¶ãŒãžã®æšå¥šäºé
ãæäŸããããã°ã©ã ã§ãã ã¿ã¹ã¯ãšãµããŒãæ©èœã«å¿ããŠããã¹ããçæã§ããã ãã§ãªããããŒã«ã«ããŒã¿ããŒã¹ããµããŒããµã€ãããããŸãã¯ã€ã³ã¿ãŒãããã§ã®ã°ããŒãã«æ€çŽ¢ã®çµæãšããŠããŠã³ããŒãããããšãã§ããŸãã ãã¹ããµã³ãã«ã§ã¯ãââ顧客ã«ã¯æããã§ãªãæ©èœãåããã°ã©ãã衚瀺ãããå ŽåããããŸãã ãã¹ãã§ã¯ããã®ãããªæ©èœãèªåçã«èæ
®ãããŸãã ããã¯ããã®ã¹ã±ããã®ã¿ã€ãã«ã«èšèŒãããŠãã衚çŸãéžæããåé¡ã«å¯Ÿããç¥çïŒAIãããããAI +èªç¶ç¥èœïŒãœãªã¥ãŒã·ã§ã³ã«ãªããŸãã
ãã£ãšãã£ãšã ããã§ãå¿
èŠãªã©ã€ãã©ãªãèŠã€ããããã«ããã°ã©ãå
ã®æçãã¹ãèŠã€ããããªã©ã®æ€çŽ¢ãšã³ãžã³ã«å
¥åããŸãã æ¬¡ã«ãæ°åäžã®ãªã³ã¯ããç§ãã¡ã®ã±ãŒã¹ã«æé©ãªãã®ãèŠã€ããã®ã«åœ¹ç«ã€å¥è·¡ãæåŸ
ããŠããŸãã ã©ã€ãã©ãªã«æšæºåããããããã¯ãŒã¯ãããã³ã«ïŒããããæ°ãããããã³ã«ãå¿
èŠã«ãªãïŒãåããTããã°ã©ã ãè£
åãããŠããå ŽåããŠãŒã¶ãŒã¯äžé£ã®ãã¹ããæ€çŽ¢ãšã³ãžã³ã«éä¿¡ããTããã°ã©ã ãµãŒããŒããããã®ãã¹ããå®è¡ããŸãã æ€çŽ¢ãšã³ãžã³ã¯çµæãåæãããã®ã±ãŒã¹ã«æé©ãªã©ã€ãã©ãªãžã®èŠæ±ãªã³ã¯ã«å¿çããŠæäŸããŸãã åæã«ãã¯ãšãªãéä¿¡ãããšãã«ãæ€çŽ¢ãšã³ãžã³ã¯ä»¥åã®åæ§ã®ã¯ãšãªã®çµæãèæ
®ããããšãã§ããŸãã ããã¯ãæ°ããã¿ã€ãã®æ€çŽ¢ã«ãªããŸãã çŸåšãã©ã€ãã©ãªã¯ããŠã³ããŒãæ°ããšã«è©äŸ¡ãåãåãããã®ãããªæ€çŽ¢ã®å ŽåããŠãŒã¶ãŒã®ãã¹ãã¿ã¹ã¯ãæºè¶³ãããããã®è©äŸ¡ãåãåããŸãã æ Œä»ãã¯å€§å¹
ã«å·®å¥åãããŸãã1ã€ã®èŠæ±ã°ã«ãŒãã«ã¯æå€§ããã©ãŒãã³ã¹ã®åªå
é äœãããããã1ã€ã«ã¯ã¡ã¢ãªã®ç¯çŽãããã3çªç®ã«ã¯ç¡æã©ã€ãã©ãªãžã®ãªã³ã¯ã®ã¿ã®è¿œå èŠä»¶ãããå ŽåããããŸãã ãã¡ãããç°ãªããµãŒããŒã§åŸãããçµæãæ¯èŒããããšã¯ããµãŒããŒã®èšç®èœåã«è£æ£ä¿æ°ã䜿çšããŠããéåžžã«è¿äŒŒããŸãã äºåã«éžæãããªãã·ã§ã³ã®æçµæ¯èŒã¯ãã¯ã©ã€ã¢ã³ãã³ã³ãã¥ãŒã¿ãŒã§è¡ãå¿
èŠããããŸãã
ä»ãã€ã³ã¿ãŒãããäžã§ãããããçš®é¡ã®ãªã³ã©ã€ã³èšç®æ©ãšãã¡ã€ã«åœ¢åŒã³ã³ããŒã¿ãŒã®æãèŠã€ããããšãã§ããŸã-ã ããããªã³ã©ã€ã³ã§äœã§ãæ°ããŠå€æã§ããããã§ãã ããããããã¯çµæã«å察ã®çŠç¹ãåœãŠããµãŒãã¹ã§ããããã®åŸã®ãªãã©ã€ã³äœ¿çšã®éžæã§ã¯ãããŸããã
çµè«ãšããŠãã°ã©ãã®è¡šçŸã¯äžèšã®ãã®ãããã¯ããã«å€ãããšã«æ³šæãã䟡å€ããããŸããããšãã°ããªã³ã¯ã䜿çšãããã€ããªããªãŒïŒéåžžã«ã现ããã°ã©ãïŒã®è¡šçŸã¯ãWirthã®å€å
žçãªäœåã§è©³çްã«èª¬æãããŠããŸãã以äžãå®çŸ©ããããšã«ããã容éã8åã«å¢ããããšãã§ããŸãã adjMatrix : array of array of Byte;
åãšããžã¯1ãããã«å¯Ÿå¿ããããã8ã€ã®ãšããžã1ãã€ãã«ããã¯ãããŸããããã¥ã¢ã«ã§ã¯ãæå€§ã®ããã©ãŒãã³ã¹ã¯Cardinalã¿ã€ãïŒ4ãã€ãïŒã«ãã£ãŠæäŸãããããããã®ãããªããŒã¿æ§é ãé©åã§ããå¯èœæ§ããããšè¿°ã¹ãŠããŸãã adjMatrix : array of array of Cardinal;
ãã®ãããªã¢ãããŒãã®äŸã¯ãKomosko LFãBatsyn MVããããæŒç®ã䜿çšããã°ã©ãã®è²ä»ãã®åé¡ã解決ããããã®é«éã¢ã«ãŽãªãºã ã第38åäŒè°ãæ
å ±æè¡ãšã·ã¹ãã -2014ããNãNovgorodïŒIPPI RASã2014ãC.432ã bsfïŒãããã¹ãã£ã³ãã©ã¯ãŒãïŒCPUåœä»€ã䜿çšããã°ã©ãã®ããã衚çŸã«ãããã»ãŒ17åã®å¹³åããã°ã©ã ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãååŸã§ããŸãããå€ãã®å€æ§ãªã°ã©ã衚çŸãGPUã«äœ¿çšãããŸãïŒäŸãåç
§ïŒãå¥ã®éèŠãªãããã¯ã¯ãã»ããã䜿çšããã°ã©ãã®è¡šçŸã§ãã adjMatrix : array [1..maxVertNum] of set of 1.. maxVertNum;
å®éã倿°ã®æŠå¿µã¯çŸä»£ã®æ°åŠã®åºæ¬ã§ãããããã°ã©ãã³ã°ã§åãããã«åºã䜿çšããã®ãèªç¶ã§ããããã°ã©ããå«ãããã ããããã§ã¯å°é£ãçºçããŸããããšãã°ãDelphiã§ã¯ãã»ããã®æå€§åºåïŒmaxVertNumïŒã¯éåžžã«å¶éãããŠããŸãããããã£ãŠã倧ããªã°ã©ãã®å Žåã倧ããªã»ããã衚ãããã®ç¹å¥ãªææ³ãå¿
èŠã§ããããã«ã瀺ãããèŠçŽ ã«ç¶ãã»ãããéžæããããã®äŸ¿å©ã§å¹æçãªæé ã¯ãããŸããããã®æ¬ é¥ã¯Wirth Pascal以æ¥ååšããŠãããOS 360/370ã®çµ¶æçã«å€ããªã£ãPascal 8000ã§ã®ã¿æ¡åŒµãè¡ãããããã§ã-ã«ãŒãæŒç®åforallïŒforall i in aSet do
ãã®æŒç®åã¯ã»ããã®åæèŠçŽ ã®æšæºçãªããã°ãæ§é ã眮ãæããããšãèš±å¯ããŸããïŒ for i:=minI to maxI do if i in aSet then
ã»ãããéåžžã«å°ããå Žåã¯ãããŒãã«å®è£
ã§æ¬¡ã®èŠçŽ ãéžæã§ããŸããã»ããã倧ããå Žåã¯ãç°¡åãªã¢ã»ã³ããªæé ãå®è¡ã§ããŸãã