ソースプログラムを覗いてみよう!! |
以下はPython 3.6によるソースプログラムです。
他のバージョンの方は適宜読み替える必要があります。
なお,Pythonの動作環境がない方はメモ帳などで参照して下さい。
ソーステキストのコードはUTF-8です。
Shift_JISで表示すると文字化けします。
表示上で右ボタンをクリックして「エンコード(E)]をクリックして
「unicode(UTF-8)」を選んでください。
あるいはダウンロードして
メモ帳等でASCIIコードを指定して保存してもかまいません。
なお,Shift_JISやeuc_jp等でPythonを使う場合,
先頭でコード指定をします。
# -*- coding: shift_jis -*-
('shift_jis'を使っているコードに合わせて'euc_jp', 'UTF-8'等に変えます)
変幻自在に変化する画像をお楽しみ下さい。
反撥係数や速度に比例する粘性抵抗等を変化させて見ましょう。
ボールの動きをより単純化して,
壁で跳ね返るボールをラケットで打ち返すゲームにしました。
タートル・グラフィックスでコッホ曲線を描くプログラムです。
Canvasを使ったコッホ曲線描画
タートル・グラフィックスで立ち枯れ木立を描くプログラムです。
Canvasを使った立ち枯れ木立
C曲線を描くプログラムです。
Canvasを使ったC曲線
ドラゴン曲線を描くプログラムです。
コッホ曲線と同様,tkinterを使った高速描画例が以下の例です。
C曲線と同様,複数階層のクラス継承を行っています。
Canvasを使ったドラゴン曲線
ヒルベルト曲線を描くプログラムです。
コッホ曲線と同様,tkinterを使った高速描画例が以下の例です。
Canvasを使ったヒルベルト曲線
シェルピンスキ曲線を描くプログラムです。
コッホ曲線と同様,tkinterを使った高速描画例が以下の例です。
Canvasを使ったシェルピンスキ曲線
反復関数系で羊歯の葉を描く例です。
なお,Python 3.6にPILが対応していないので,
1ピクセルの大きさの四角形で点を代表させています。
PILが対応したらここは変更すべきでしょうね。
なお,拙著Kindle版「C言語によるフラクタルの描き方 第4巻」で
様々な反復関数系を紹介しています。
ぜひご一読の上,Python上でも表示して楽しまれることを推奨します。
以下は,タートル・グラフィックスを使った例です。
表示速度が遅いので,画面タイトルに途中経過を表示しています。
タートル・グラフィックス版・反復関数系
マンデルブロ集合を描く例です。
なお,反復関数形と同様,
1ピクセルの大きさの四角形で点を代表させています。
表示速度は遅いですが,タートル・グラフィックスで描く例を以下に示します。
タートル・グラフィックス版・マンデルブロー集合
【充填ジュリア集合との合体と表示操作の追加】
以下は、次項の充填ジュリア集合と合体させ,以下のような操作を可能にしたバージョンです。
充填ジュリア集合との合体と表示操作の追加
- 左ドラッギングで表示位置の移動
- 左ダブルクリックで拡大表示
- 右ドラッギングで縮小表示
- 右ダブルクリックで配色変更
以下は表示例です。
充填ジュリア集合を描く例です。
なお,反復関数形と同様,
1ピクセルの大きさの四角形で点を代表させています。
表示速度は遅いですが,タートル・グラフィックスで描く例を以下に示します。
タートル・グラフィックス版・充填ジュリア集合
畑政義写像を描く例です。
なお,反復関数形と同様,
1ピクセルの大きさの四角形で点を代表させています。
表示速度は遅いですが,タートル・グラフィックスで描く例を以下に示します。
タートル・グラフィックス版・畑政義写像
なお,畑政義写像ではパラメータによって様々な画像を生成できます。
畑政義写像画像集
カントールの塵を描く例です。
シェルピンスキのカーペットを描く例です。
シェルピンスキのギャスケットを描く例です。
メンガーのスポンジを描く例です。若干,時間がかかります。
グモウスキーとミラの写像を描く例です。
例題プログラムではμの値を-1〜1の間で変化させます。
めまぐるしく変化する画像をお楽しみ下さい。
単に線を描いたり,消したりするだけのプログラムですが,
マウス・イベント操作の良い例題になっています。
キーボードのイベント処理と、入力データをリストに保管するだけのプログラムです。
キーボード・イベント操作の良い例題になっています。
さらに,プログラムを完了させる際の問合せ処理のために
インポートするライブラリ名や関数名がPython 2.7と非常に異なっていますので,
プログラム中にその対応を示しています。
【実行結果例】Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
RESTART: C:\Users\Shirai\AppData\Local\Programs\Python\Python36-32\project\keyboadEvent.py
[]
Key Pressed char= '' key sombol= Shift_L
['K']
Key Pressed char= 'K' key sombol= K
['K', 'e']
Key Pressed char= 'e' key sombol= e
['K', 'e', 'y']
Key Pressed char= 'y' key sombol= y
['K', 'e', 'y', 'b']
Key Pressed char= 'b' key sombol= b
['K', 'e', 'y', 'b', 'o']
Key Pressed char= 'o' key sombol= o
['K', 'e', 'y', 'b', 'o', 'a']
Key Pressed char= 'a' key sombol= a
['K', 'e', 'y', 'b', 'o', 'a', 'r']
Key Pressed char= 'r' key sombol= r
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd']
Key Pressed char= 'd' key sombol= d
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の']
Key Pressed char= '\u306e' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処']
Key Pressed char= '\u51e6' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理']
Key Pressed char= '\u7406' key sombol= ??
Return Pressed key sombol= Return
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x']
Key Pressed char= '\uff58' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x', '\t']
Key Pressed char= '\t' key sombol= Tab
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x', '\t']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x', '\t']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x', '\t']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x', '\t']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x', '\t']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x', '\t']
Key Pressed char= '' key sombol= ??
['K', 'e', 'y', 'b', 'o', 'a', 'r', 'd', 'の', '処', '理', 'x', '\t', 'z']
Key Pressed char= '\uff5a' key sombol= ??
フルカラー(24ビット)以外のBMPではヘッダの直後にカラーマップが格納されます。
これをすべて表示します。
BMPのヘッダ構成を理解するための例題でもあります。
なお,この種のプログラムではPython 2.7で動いていたものが、
ことごとく動かなくなりました。
Python 3.6に移行するためのケーススタディになるかもしれません。
256色BMPのカラーマップ 256色BMPのヘッダ内容例
Python 3.6用のPILはなかなかサポートされそうにありません。
2.7から3への移行で大幅な改変がありましたので,
ツール側がついていくのが大変なのでしょう。
しかし,GetPixelとSetPixelなしに画像いじりはできません。
そこで,Canvas上に擬似的なPixel(1×1の正方形)を置いて
入力したBMPファイルのビットデータの色に変えることで
仮想的なイメージデータを表現してみました。
以下は,BMPファイルを読み込み、
(100,100)-(199,199)のピクセルを(0,0)-(99,99)に移動した例です。
「22.PILを使わないBMPファイルの表示とGetPixel/SetPixel」に、
BMPファイルの出力と新規に画像を生成するための機能(24ビットのみ)を追加しました。
本プログラムでは,カラーをコードで指定する方法を前提としていますが、
どうしてもカラー名を使いたい人のための関数も用意してあります。
なお,256色カラー(8bits)や16色カラー(4bits)での出力が遅いですが,
類似色判定の処理に時間がかかっています。
アルゴリズムの改善が必要でしょう。
色調を変更するプログラム例です。
なお、以下のモジュール(23で示したプログラムを整理したもの)をインポートしています。
また、カラーテーブルの色を明度別に並べることで類似色判定の高速化を行っています。
画像キャンバス・モジュール
以下は,上記モジュールを用いた入出力テストプログラムです。
画像入出力テスト
元画像 プログラムの実行例
フィルタ行列を使った画像処理のプログラム例です。
なお、以下のモジュールをインポートしています。
画像キャンバス・モジュール
拡大画像
平滑化 加重平均 鮮明化 エッジ抽出 エンボス効果
メディアン・フィルタによる画像処理のプログラム例です。
いわば「ゴミ取りフィルタ」ですので,あらかじめ元画像に小さな点を混在させています。
若干のぼかしは入りますが,ゴミはきれいに取り除かれています。
なお、以下のモジュールをインポートしています。
画像キャンバス・モジュール
ちなみに、以下は平滑化処理を行った結果です。
小さなゴミは、ぼかされてはいますが残ってしまいます。
ヒストグラムを平坦化する画像処理プログラム例です。
ヒストグラムが明るい側に集まっていて不鮮明になっている元画像が、
平坦化させることで鮮明になりました。
なお、以下のモジュールをインポートしています。
画像キャンバス・モジュール
ガンマ補正処理を行うプログラム例です。
なお、以下のモジュールをインポートしています。
画像キャンバス・モジュール
γ=0.54 γ=1.55
モザイク処理を行うプログラム例です。
マウス・イベントの例題にもなっています。
なお、以下のモジュールをインポートしています。
画像キャンバス・モジュール
アナログ時計を表示するプログラム例です。
ウィンドウサイズが変更されたときのイベント処理の例題にもなっています。
カレンダーを表示するプログラム例です。
ただし,Rythonにおけるテキストボックスからのデータ取り出しは普通の言語とかなりの隔たりがあります。
【旧暦・六曜表示カレンダー】 以下は,次項「33.旧暦および六曜計算」にカレンダー表の文字生成を組み込み
カレンダーに旧暦の日付,および六曜を表示するようにしたバージョンです。
旧暦・六曜表示版
以下のモジュールをインポートしていますので,併せてダウンロードして下さい。
旧暦・六曜計算・表示
以下は、実行例です。
【元号表示/祭日・振替休日表示カレンダー】
[2017/09/01 元号一覧の元号をクリックすると、
その元号の最初の日のカレンダーを表示する機能を追加しました]
小生と同年代の人たちから「元号が表示されていないと暦らしくない」との
意見がありましたので、元号を表示できるようにしました。
明治以降の元号表示だけでは面白くないので、過去の元号も表示できるようにしました。
元号表示/祭日・振替休日表示
以下のモジュールをインポートしていますので,併せてダウンロードして下さい。
旧暦・六曜計算・表示
祭日や振替休日を求める
なお,2019年の5月1日の元号改正については,
2019年の4月1日に発表されましたので,元号「令和」を反映しました,
以下、1573年以前のカレンダーを表示する際の注意事項です。
過去の元号の表示 2017/08 1989/01 1868/01 1573/09 1700/04
旧暦及び六曜を求めるプログラム例です。
以下はその実行例です。
祭日や振替休日を求めるプログラム例です。以下は,その実行例です。
時代と共に祭日が変わっていることが分かります。特に戦前は、同じ日なのに祭日名がまったく違いますね。
関数実行例(2008年) 1990年の祭日と振替休日 1970年の祭日
(振替休日なし)1950年の祭日
(振替休日なし)1900年の祭日
(振替休日なし)
オセロ・ゲームのプログラム例です。
以下はその実行例です。
マインスィーパ・ゲームのプログラム例です。
以下はその実行例です。
テトリス・ゲームのプログラム例です。
以下はその実行例です。
3D表示用のインポートファイルです。以下は、インポートファイルを用いたプログラム例です。
ワイヤフレーム 法線ベクター(その1) 法線ベクター(その2) 塗りつぶし法 Zバッファー法
【シェーディング手法の違い】
なお、基本的には Z バッファ法を用い、反射光、環境光、照明光の 3 種類を考慮したものです。
照明光だけの Z バッファ法の画像とも比較して下さい。
フラット・シェーディング
(flat shading)グロー・シェーディング
(gouraud shading)フォン・シェーディング
(phong shading)
【反射、屈折の扱い】
なお、3D用表示用インポートファイル以外に、以下のファイルをインポートしています。
3Dモデル用インポートファイル
【注意】色混合では、本来は光周波数ごとのエネルギーを求め、周波数別エネルギーを加算して、
その対数値からRGBを求めるのが本来の方法ですが、本プログラムでは各RGB値の比率の加算(反射等)、
減算(透過)という簡便な方法を使っています。
影のみ考慮 反射と影を考慮 屈折率を考慮
弦の振動のシミュレーションです。
ただし,刻み幅は微小と考えていますので,x方向移動量は 0 とみなされています。
初期値が三角形の弦形状でも、徐々にsin曲線に近づいていくのを観察下さい。
なお、プログラムでは弦形状の初期値を選択できるようになっています。
以下は弦形状の初期値が三角形の場合の実行例です。
振り子の運動のシミュレーションです。
ただし,初期角度は微小という前提を入れていませんので、
最初の角度が大きくてもかまいません。
簡単なプログラムですので、入門者に最適な例題だと思います。
以下は、途中までの実行例の繰返しです。
ニューラルネットワーク誤差逆伝播法のプログラム例です。
徐々に誤差が少なくなっていく過程を観察しましょう。
以下は、最終結果の例です。
球をゴムひもで引っ張る動きをシミュレーションします。
マウスボタンをクリックしないでマウスを動かすイベントの良い例になっています。
画面上でマウスを動かすだけでもちょっと楽しいかも・・・。
messageboxがあるのに、何を今更と言われそうですが、
サブウィンドウの例として自作のメッセージボックスを作ってみました。
呼び出し側 メッセージボックス
分子運動のシミュレーションを行います。
分子間力は、レナード・ジョーンズ・ポテンシャルで計算します。
なお、以下のGIFファイルの動きは遅いようですが、
プログラム上は、各分子はもっと速く動きます。
分子間力のグラフ 実行のGIFファイル
ランダムな地形を生成するプログラムです。
パラメータを変更して楽しみましょう。
また地形データをテキストデータとして入出力できます。
ですから、生成データを保存して,再度読み込んで表示できます。
他のプログラムでCSVファイルを作成して読み込むこともできます。
簡易なテキスト・エディタのPythonによる実装例です。
以下は、表題のプログラムを起動し、
その標準出力を受け取るプログラム例です。
子プロセスは、1秒ごとに標準出力に番号を出力し
5回で終わる非常に簡単なプログラム例です。
同期方式親プログラム 非同期方式親プログラム
以下は、表題のプログラムを起動し、
起動したプログラムに標準入力のデータを送ります。
さらに、その標準出力を受け取って表示します。
子プロセスは、標準入力から数字を受け取って
英語表記を標準出力に出力する単純なプログラムです。
標準入力を送る親プロセスのプログラム
【出力例】
Pythonの標準入力をMS-DOSコマンドとしてみなして、
外部コマンドを実行して、その標準出力を表示します。
外部コマンドの実行と標準出力を受け取る例題です。
2017/09/24 UTF-8のファイルをtypeコマンドで表示しても
変換エラーで無視される現象がなくなりました。
【出力例】
なお、プログラム起動だけなら以下のような簡単なプログラムで可能です。
(インターネット・エクスプローラを起動する例です)import subprocess, sys
try:
result = subprocess.run("C:\\Program Files\\Internet Explorer\\iexplore.exe",shell=True, check=True)
except subprocess.CalledProcessError: print('外部プログラムの実行に失敗しました', file=sys.stderr)
とかくマルチスレッドで同期制御を無視したプログラミング例が多いので、
セマフォーによる表示衝突制御、サブプロセスの終了検知の例を示します。
なお、論理的な手法については
を参照いただければ幸いです。拙著Kindle版「C言語によるマルチスレッドプログラミング」
【出力例】
ハノイの塔の問題は、再帰的プログラミングの代表例です。
簡単な問題ですので、表示にこだわりました。
【出力例】
平面充填問題のPython版です。
ハンカチのデザインにでも使えそうでしょうか?
【出力例】
コッホ雪片を描くだけなら面白くないので、ターン角度を −60 度から +60度まで変化させて色分けしました。
当然のことですが −60 度のとき各辺のコッホ曲線が中央で交わります。
【出力例】
なお、例2では 60度と−60度は線幅 1、以外は、振りこぼしを少なくするため線幅 3 で描画しています。
例3では 60度のみ線幅 1、以外は線幅 3 で描画しています。例4では−60度を最後に白で描画しています。
描画方法の変更でいろいろ楽しめそうです。皆さんは、どれが好みでしょうか?
画像例1
(カラフルな画像)画像例2
(青基調)画像例3
(画像例2の白青逆転)画像例4
(色相変更と−60度と60度再描画)
ブラウン運動のシミュレーションプログラムです。
ほこりの壁との反撥係数を 0 としています。
反撥係数を設定すると、隅にほこりが集まる確率が少なくなります。
【出力例】
煙の粒子の運動のシミュレーションプログラムです。考え方については、
を参照頂ければ幸いです。〜ExcelとVBAで絵を動かすテクニック〜「動く力学シミュレーション」(白井豊 著)(ISBN978-4-904551-04-2)
【出力例】
二次元での花火のシミュレーションです。
【出力例】
温度による膨張を横方向への変動の大きさと解釈しています。
ただし、この方法では、ライターの炎のように点火場所が高温の場合、急激に周辺温度に近づきますので
横方向への変動量を少なくする等の調整を行う必要があります。
2017/09/22:表示部分を大幅改造しました。かなり炎らしくなったと思います。
2017/09/23:表示範囲を狭めたり、省略可能な計算を判定することで高速化しました。
ただし、プログラムの実行でアニメーション表示ができるまでには至っていません。
アニメーション表示するには、C、C++等で実装すべきでしょう。
【出力例】
粒子数 1,000のとき
(ばらつきが大きい)粒子数 2,000 のとき
(ばらつきが少なくなった)粒子数 3,000 のとき
(かなり安定するが実行時間が遅い)
以下は、粒子数 2,000 のとき画面キャプチャして
1コマごとの表示時間間隔を短くして動画化したものです。
C言語に比べ非常に遅いので、100×100のメッシュにしました。
2017/09/23 表示色が変わる部分だけ色を変えるようにしたらかなりスムーズになりました。
なお N = 5 〜 12 程度が適当です。N = 3, 4 のときはなかなか群落ができません。
N = 16 のときは、周りに餌がなくてほとんどの生物が増殖しないこともあります。
【出力例】
Pythonでのロジスティック写像を描画する例題です。
マウス左クリックで全体の描画、2倍、4倍、6倍の切り替えを行います。
【出力例】
全体画像 2倍にした画像 4倍にした画像 8倍にした画像
世界最古のカオス・アトラクタ、いわゆるジャパニーズ・アトラクタ(京都大学・上田v亮の報告)を描画する例題です。
なお、X/Y座標オーバフロー時は、便宜上 0 に設定しています。
【出力例】
実行時画面例 画面キャプチャした画像をもとに
アニメーション化したもの
カオスの例題として定番のローレンツ・モデルを描いてみました。
【出力例】
以下は画面キャプチャした画像をもとにアニメーション化したものです。
エノン写像、これもカオスの例題としての定番かもしれません。
【出力例】
以下は画面キャプチャした画像をもとにアニメーション化したものです。
解説されることの少ないリアプノフ・フラクタルの描画例を示します。
【出力例】
ABのときの画像 AABABの画像
燃える船/バーニングシップ・フラクタルの描画例を示します。
特に拡大画像その2の発散回数で色分けした画像は、
「燃える船」がはっきりと現れています。
【出力例】
全体の画像
(-2.5, -2.0)〜(1.5, 2)拡大画像その1
(-0.84, -1.00)〜(-0.68, -0.84)拡大画像その2
(-1.8, -0.08)〜(-1.7, 0.02 )上記を発散回数で色分け 上記を発散回数で色分け 上記を発散回数で色分け
なお、全体画像と拡大画像の位置関係は以下のとおりです。
シェルピンスキのビラミッドを描いてみました。
【出力例】
相似縮小変換によるフラクタルを描きました。
なお、以下のファイルをインポートしていますので、併せてダウンロードしてください。
2次元アフィン変換
【出力例】
【その他の出力例】(以下のソースでも2次元アフィン変換をインポートしています)
変換その2 変換その3 変換その4
曲線の X 座標を回転方向、Y 座標を半径方向に変換、すなわち極座標に変換することで島形状を生成します。
ただし、最初の Y 座標と最後の Y 座標を合わせることで、最初と最後がつながるよう調整します。
赤色の線 : 最初に求められた曲線
緑色の線 : 調整後の曲線
薄黄色の多角形 : 生成された島形状
マウスの左ボタンクリックで新しい島形状を生成します。
【生成例】
二次元波動のシミュレーションです。描画等が遅いので計算回数100回ごとに1回描画しています。
さらに,マウスの左ボタンクリックごとに再描画し,画面キャプチャを容易にしています。
以下は,画面キャプチャした画像をアニメーション化したものです。
モルフォロジー変換(グレースケール版)版です。
カラー画像(BMPファイル)は内部的にグレースケールに変換しています。
白黒画像は,グレースケールの最大・最小で判定していますので、
結果的に処理可能です。
構造体要素(カーネル)は,画面右上のマス目をクリックして指定します。
赤色が有効要素,白色が無効要素,中央が着目要素です。
以下のモジュールをインポートしていますので,併せてダウンロードして下さい。
imagecanvasモジュール
収縮
(Erosion)膨張
(Dilation)オープニング
(Opening)クロージング
(Closing)勾配
(Gradient)トップハット
(Tophat)ブラックハット
(Blackhat)文字画像の
勾配文字画像の
ブラックハット
第1章 色々な暦
第2章 元号と国民の休日
第3章 日本の暦の歴史と24節気
日本の夏至と冬至一覧(1873〜2019)
日本の冬至CSVファイル(1873〜2019)
【参考】日本の冬至表(1873〜2019)Python 3.6
二十四節気(sunLib.py)
二十四節気を表示する暦(SekkiCalendar.py)
第4章 日本の旧暦(天保暦)
朔日を求める(moonLib.py)
旧暦日付を求める(TempoCalendar.py)
改元日を旧暦で求める(Gengo2.py)
旧暦日付を暦に表示(NewAndTempoCalendar.py)
第5章 日本流宣明暦と簡易法
閏月一覧と検索(semmyouLeap.py)
元号一覧(Gengo3.py)
簡易法のための一覧表(monthTabLib.py)
大衍暦・宣明暦を考慮した旧暦(TempoCalendar2.py)
大衍暦・宣明暦を暦に表示(NewAndTempoCalendar2.py)
第6章 日本古代の暦
元号一覧(Gengo4.py)
簡易法のための一覧表(monthTabLib3.py)
元号表示(semmyouLib3.py)
元嘉暦・儀鳳暦を考慮した旧暦(TempoCalendar3.py)
元嘉暦・儀鳳暦を暦に表示(NewAndTempoCalendar3.py)
以下は,貞享暦,宝暦暦,寛政暦に対応した一覧表です。
プログラムを from monthTabLib3 import * ⇒ from monthTabLib4 import * と
変更してお使いください。
簡易法のための一覧表拡張版(monthTabLib4.py)
第7章 中国古代の暦
漏刻(水時計)のシミュレーション(waterClock.py)
中国古代暦の共通関数(kodaiLib.py)
太初暦(taisho.py)
四分暦(shibun.py)
景初暦(keisho.py)
第8章 秦王朝の暦の再現
センギョク暦の暦元の確認(list_8_1.py)
立春の確認(sengyokuRiss.py)
二十四節気リスト(sengyokuSekki.py)
センギョク暦とユリウス暦の対応(sengyoku.py)
本システムは,いわゆる診断システムの複雑な部分を一切カットし,
徹底的に単純化して分かりやすくしたものです。
MYCIN等のコンテキスト・ツリー等の考え方もありません。
学習用としてお使いいただけると思います。
以下は,YS Tiny Diagnosis内の例題をキャンセルして,
新たにルール等を再定義する例です。
ルール等の再定義例
以下は,条件部にand, or, not等を指定する例です。
条件部へのand, or, notの指定例
本プログラムは,ファジー演算の学習用の関数群です。
ここからダウンロードできます
【ファジー集合がお互いに独立な場合の演算】
マムダニの方法
wangとMendelの方法
整数化による低CPUでのモデル化
【ファジー推論】
マムダニの方法
wangとMendelの方法
【ファジー制御例】
ハンドルの操作
アクセルとブレーキの操作
単一ニューロン学習
単層パーセプトロン学習
二層パーセプトロン学習
三層以上のパーセプトロン学習
パーセプトロン学習(例題1)
パーセプトロン学習(例題2)
ボルツマン・マシン実行
ボルツマン・マシン学習
データ生成用共通モジュール
グラフ等表示モジュール
k-NN法
簡易的なクラス境界(共通関数)
簡易的なクラス境界(例1)
簡易的なクラス境界(例2)
決定表共通関数
決定木描画
決定木をPythonソース・プログラムに変換
決定表のルール結合
決定表のソート
ジニ係数による決定木の学習
決定表から決定木に変換(Pythonシェル画面)
決定表から決定木に変換(描画)
ソース・プログラム生成例
決定表のルール結合例
ジニ係数による決定木学習の指定例
SOMアルゴリズム
以下は,SOMアルゴリズムによる分類の画像例です。
ティアラ(Tierra)の初期バージョンの仕組みをより単純化して
Pythonで表現したシステムです。
仮想マシン・アセンブラ
仮想マシン・アセンブラ・テスト用プログラム
仮想マシン・インタプリタ
仮想マシン・インタプリタ・テスト用プログラム
@最も単純な例
以下は,交叉率0.3,突然変異率0.1, 選択率0.6で
1000回の繰り返しで得られた結果です。
初期値
0:0010111100 0.5000
1:0110101000 0.3000
2:1101100100 0.2000
3:1010001101 0.4000
4:0110010110 0.7000
5:1101100001 0.1000
6:1010001010 0.3000
7:1111000011 0.1000
8:0101010010 0.5000
9:1000011101 0.5000
適応度の高い遺伝子
4:0110010110
結果
0:0010010110 0.7000
1:0010010110 0.7000
2:0011010110 0.7000
3:0010010110 0.7000
4:0010010100 0.7000
5:0010010100 0.7000
6:0010010110 0.7000
7:0010010100 0.7000
8:0010010110 0.7000
9:0110010110 0.7000
適応度の高い遺伝子
0:0010010110
1:0010010110
2:0011010110
3:0010010110
4:0010010100
5:0010010100
6:0010010110
7:0010010100
8:0010010110
9:0110010110
AOne Max問題
以下は,遺伝子の数10, 遺伝子の長さ8,
交叉率0.5,突然変異率0.1, 選択率0.4で
5000回の繰り返しで得られた結果です。
なお,以下は最も良い結果であり,
試行によっては0が混じることもあります。
初期値
0: 1010 0100 0.3750
1: 1001 1011 0.6250
2: 1100 1000 0.3750
3: 0000 1101 0.3750
4: 0010 0001 0.2500
5: 0000 1000 0.1250
6: 1001 0001 0.3750
7: 1100 1100 0.5000
8: 1100 1010 0.5000
9: 0111 0000 0.3750
適応度の高い遺伝子
1: 1001 1011
結果
0: 1111 1111 1.0000
1: 1111 1111 1.0000
2: 1111 1011 0.8750
3: 1111 1111 1.0000
4: 1111 1111 1.0000
5: 1111 1111 1.0000
6: 0111 1111 0.8750
7: 1111 1011 0.8750
8: 1111 1011 0.8750
9: 1111 1111 1.0000
適応度の高い遺伝子
0: 1111 1111
1: 1111 1111
3: 1111 1111
4: 1111 1111
5: 1111 1111
9: 1111 1111
B N王妃問題
それぞれの行のクィーンの桁位置を番号(整数)で表現します。
異なる行の同じ桁位置にクィーンは存在しませんから,
すべての染色体は異なる番号になります。
したがって,すべて異なる番号を含んでいない場合,
適応度を最低にします。
初期値によって結果がかなり変わりますので,
5回程度の試行で初期設定からやり直します。
通常,整数で遺伝子を表現する場合,
乱数で置き換えるという方法を採用しますが,
この問題の場合,
同一染色体内に同一の番号があると困りますので,
同一染色体内の他の遺伝子と取り替える方法を採用します。
以下は,クィーンの数8(8 Queen), 染色体の数100,
染色体内遺伝子の個数(遺伝子の数=クィーンの数)=8,
交叉率0.3,突然変異率0.3, 選択率0.4で
5×100回の繰り返しで得られた結果です。
したがって初期設定のやり直し回数は100回です。
C巡回セールスマン問題(ビットパターンで次の都市を示す方法)
ビットパターンで次の都市を表現する方法によって
巡回セールスマン問題をGAで表現してみました。
例えば,6都市の場合,
0番目の遺伝子0010000は0番目の都市の次は2番目,
2番目の遺伝子0000100は2番目の都市の次は4番目の
都市を示します。
初期値によって,結果がかなり変わりますので,
5回程度の試行で初期設定からやり直します。
以下は,都市の数6, 染色体の数200,染色体の長さ=6×6=36,
交叉率0.4,突然変異率0.2, 選択率0.6で
5×100回の繰り返しで得られた結果です。
したがって初期設定のやり直し回数は100回です。
なお,以下は最も良い結果であり,
試行によっては最適解でない結果もあります。
都市の座標値
No. X Y
--------------------
0 0.0000, 0.0000
1 20.0000, 0.0000
2 0.0000, 20.0000
3 20.0000, 20.0000
4 0.0000, 40.0000
5 20.0000, 40.0000
最大適応度: 0.008333333333333333
最適解:
0: 010000 000100 100000 000001 001000 000010
P0→P1→P3→P5→P4→P2→P0
D巡回セールスマン問題(都市番号を遺伝子とみなす方法)
都市番号(整数)で遺伝子を表現する方法を示します。
遺伝子の位置が訪問順序を示します。
最後の都市番号の場合,先頭に戻るものとします。
前述のビットパターンで示す方法より,処理が単純になります。
この方法でも,初期値によって結果がかなり変わりますので,
5回程度の試行で初期設定からやり直します。
通常,整数で遺伝子を表現する場合,
乱数で置き換えるという方法を採用しますが,
巡回セールスマン問題の場合,
同一染色体内に同一の都市番号があると困りますので,
同一染色体内の他の遺伝子と取り替えるという方法にします。
以下は,都市の数8, 染色体の数400,
染色体内遺伝子の個数(染色体の数=都市の数)=8,
交叉率0.5,突然変異率0.1, 選択率0.4で
5×100回の繰り返しで得られた結果です。
したがって初期設定のやり直し回数は100回です。
また,適応度については,得られた適応度を100倍にしています。
なお,以下は最も良い結果であり,
試行によっては最適解でない結果もありえます。
都市の座標値
No. X Y
--------------------
0 0.0000, 0.0000
1 20.0000, 0.0000
2 0.0000, 20.0000
3 20.0000, 20.0000
4 0.0000, 40.0000
5 20.0000, 40.0000
6 0.0000, 60.0000
7 20.0000, 60.0000
最大適応度: 0.625
最適解:
0: 0135 7642
P0→P1→P3→P5→P7→P6→P4→P2→P0
1: 0246 7531
P0→P2→P4→P6→P7→P5→P3→P1→P0
プログラム例
なお,以下のモジュールをインポートしていますので
併せてダウンロードしてください。
GP基本処理
構文木アクセス関連
簡易構文解析(構文木生成まで)
簡易語彙解析
初期状態 | 実行結果 |
---|---|
X位置 | |
---|---|
適応度 |
初期状態 | 途中経過 | 収れん間近 | 収れん後 |
---|---|---|---|
基本的なアルゴリズムによるプログラム
実行例
蟻コロニー最適化(8×8)の実行例
プログラム例
基礎的な関数群
都市座標の設定
初期4都市の設定
描画および表示用関数
初期4都市以外の挿入
都市挿入・交換処理関数
@基本的なプログラム例
Aカラフルなプログラム例
B上下,左右を連結したサイクリックなプログラム例
なお,これは以下のようなトーラス上のセルを表現したものと同一です。
No.030 | No.060 | No.090 |
---|---|---|
No.110 | No.182 | |
【方法1】x(t,k)=(x(t-1,k-1)+x(t+1,k-1)) % 剰余で求めた例です。
【方法2】x(t,k)=(x(t-1,k-1)+x(t-1,k)+x(t+1,k-1)) % 剰余
方法1 剰余4 | 方法2 剰余4 | 方法2 剰余8 |
---|---|---|
初期状態 | 5秒後 2つの波に分離 | 10秒後 両方向に進む |
---|---|---|
20秒後 両方向に進む | 30秒後 壁に衝突 | 40秒後 中心に進む |
50秒後 中心に進む | 60秒後 衝突間近 | 63秒後 衝突後の状態 |
初期状態 | 定常状態(ただし振動している) |
---|---|
ヒンズー連続方式,バシェー方式,桂馬飛び法
式の確認
LUX法
4の倍数×4の倍数魔方陣
MN×MN魔方陣
奇数・偶数分離魔方陣
上記プログラム例で共通する関数群を以下のモジュールとしてまとめました。
魔方陣用共通関数群
以下は,共通関数群を用いて「式確認」以外を書き直したものです。
なお,魔方陣の表示形式を変更しています。
ヒンズー連続方式,バシェー方式,桂馬飛び法
LUX法
4の倍数×4の倍数魔方陣
MN×MN魔方陣
奇数・偶数分離魔方陣
ナンプレパズル
以下の共通関数群を使用しています。
合わせてダウンロードしてください
ナンプレパズル共通関数群
以下もご参照ください。
プログラムによる解法
プログラムによる解法のテスト
ナンプレパズルの自動生成
自動生成テスト(Pythonシェル画面版)
自動生成テスト(キャンバス版)
自動生成組込みナンプレパズル
【ナンプレの数字を絵柄にする】
以下の画像を用います。
以下をダウンロードし解凍して
ソースプログラムと同じフォルダの下に
サブフォルダgifを作成して格納してください。
数字を絵柄にするための画像データ
画像を表示するための簡単なプログラム例
以下は数字の替わりに絵柄を表示するナンプレ用の
ソースプログラムです。
絵柄等を変えてお楽しみ下さい。
絵柄表示用のナンプレパズル共通関数群
絵柄表示用の自動生成
絵柄表示用の自動生成テスト
絵柄表示ナンプレパズル(イメプレ)
拙著Kindle版「Pythonで作るナンプレパズル」では,
自動生成画面では数字になっていました。
以下のソースプログラムを使うことで,
自動生成画面も絵柄になります。
絵柄表示用のナンプレパズル共通関数群2
絵柄表示ナンプレパズル(イメプレ)2