[b][size=150]このワークシートは[url=https://www.geogebra.org/m/twxxx3yq]Math by Code[/url]の一部です。[br][br]<図形を使うことで処理が見やすくなる>[br][/size][/b]グラフは頂点の集まりVとそれらをいくつか結ぶ線分(辺)の集まりEでできている。[br][br][color=#38761d][b][u][size=150][size=200]頂点がnodeか vertexかpointだ。[br]辺がedgeかsegmentだ。[br][/size][/size][/u][/b][/color][br]辺の情報を与えれば、頂点の隣接状態の図としてのグラフはかける。[br]特に指定しなければ、点の位置は任意になる。[br][br]pythonでグラフを使うためにパッケージがいろいろ必要になる。[br]昔からnetworkxとかgraphvizが有名だね。[br](juliaでは典型的なグラフ用パッケージがあるかどうか不明なのでpythonとnetworkでコードをかく。)[br][color=#ff00ff]#======================[br]pip install scipy[br]pip install networkx[br]pip install [/color][color=#ff00ff]matplotlib[br][/color][color=#0000ff]#======================[br]import networkx as nx[br]G =nx.Graph()[br]G.add_edge(1,2)[br]G.add_edge(2,3)[br]G.add_edge(2,4)[br]nx.draw_networkx(G)[br]#======================[br][/color][OUT][br][br][color=#0000ff]#geogebra[br][/color][b][size=150][color=#38761d]グラフ用のパッケージがないので、[br]座標Nodesをランダムに4個発生させる。[br]その座標を引用して、点の番号NumTを打つ。[br][/color][/size][/b][color=#0000ff]Nodes=Sequence((RandomBetween(1,20),RandomBetween(1,20)),k,1,4)[br]NumT=Sequence(Text(k,Element(Nodes,k)),k,1,4)[br][br][/color][color=#38761d][size=150][b]描画のスピードは気にせず、4個の総当たりで辺のリストAllComiを作り、非表示にする。[br]データ作成上、リストが2層になってしまったので、辺のリストをフラットなCsにする。[br][/b][/size][/color][color=#0000ff]AllCombi=Sequence(Sequence(Segment(Element(Nodes,i),Element(Nodes,j)),j,i+1,4),i,1,3)[br]Cs=Flatten(AllCombi)[br][br][/color][color=#38761d][b][size=150]ランダムに連結すると辺が3本できないおそれがあるので辺をシャッフルして前から3本選ぶ。[br][/size][/b][/color][color=#0000ff]Take(Shuffle(Cs),1,3)[br][br][/color]
[b][size=150]<ランダムに頂点を連結してみる>[br][br][/size][/b]randomにm辺できるまで、n頂点を適当に結ぶ。[br]辺の集合edge_setに2頂点の組を, [color=#0000ff][b]隣接行列[/b][/color]graph_dataに2頂点の連結情報を1に[br]セットしよう。これが[color=#0000ff][b]グラフを適当につくる関数generate_G(n,m)[/b][/color]だ。[br][br][[color=#0000ff]IN]Python[br]#================================================[br]import random[br][br]def generate_G(n, m):[br] graph_data = [[0] * n for i in range(n)][br] edge_set = set()[br] while len(edge_set) < m:[br] i, j = random.sample(range(n), 2)[br] if i > j: i, j = j, i[br] edge_set.add((i, j))[br] graph_data[i][j] = graph_data[j][i] = 1[br] return graph_data, edge_set[br][br][/color][color=#0000ff]random.seed(6)[br]node_num = 16[br]edge_num = 20[br]figGraph, edgeSet = generate_G(node_num, edge_num)[br][br]edgeSet[br][/color]figGraph[br]#================================================[br][OUT][br]{(0, 2),[br] (0, 4),[br] (0, 8),[br] (1, 9),[br] (2, 5),[br] (2, 7),[br] (2, 13),[br] (3, 12),[br] (3, 15),[br] (5, 11),[br] (5, 13),[br] (6, 8),[br] (6, 11),[br] (6, 13),[br] (7, 8),[br] (7, 11),[br] (8, 10),[br] (12, 13),[br] (12, 15),[br] (13, 14)}[br][br]geogebraの場合は、上記とほぼ同じでできます。[br]3本の頂点の選び方は、4C3=6本の辺をすべて引いてしまい。その順番をシャッフルしから前から3本[br]選びましたね。[br]これが16本になっても同じロジックで16C2=120本引いておき、その順番をシャッフルしてから20本選んだものだけを表示するという方法です。