サブロウ丸

主にプログラミングと数学

python周辺

【Python】順序付きビンパッキング問題

この記事の応用です。 商品とビンに順序をつけた場合のビンパッキング問題になります。 ソースコード 実行結果 入力 うさぎ0が食べるりんごの量は1.2 うさぎ1が食べるりんごの量は2.2 うさぎ2が食べるりんごの量は1.0 うさぎ3が食べるりんごの量は0.7 うさぎ…

【Python】ビンパッキング問題

離散数学の組合せ論の代表的な問題としてビンパッキング問題というのがあります。 十分に用意された品物を、複数個のビン(容器)に詰めるときの最大利益を求める問題です。 このときビンの個数が1つであればナップサック問題と呼ばれる問題になります。 この…

Networkx バージョン更新に伴うエラー

Python上でグラフを取り扱うモジュールであるNetworkxのversionが1.11 -> 2.0に更新された際に、以前あった関数の幾つかが使えなくなっています。 現在、分かっているものを列挙していきます。 (旧) g.edge[i][j]['weight'] = 1 # i, jはノード (新) g[i][j]…

【Python】pulp CBC並列処理・ソルバー選択

CBCソルバー(デフォルト)並列処理 pythonの線形計画法ソルバーpulpを並列で計算する方法です。 例えば、4スレッドで実行するなら import pulp prob = pulp.LpProblem(sense=pulp.LpMinimize) (省略) prob.solve(pulp.PULP_CBC_CMD(threads=4)) と書きます。 …

Newtonの差分商補間(後編)

これの後編です。 実際に簡単な関数でいくつか補間による近似を行なってみたいと思います。 fが近似したい関数、gがデータ点(0, 0) (1, 1) (2, 2)から構成した差分商補間になります。 fは2次式でかつ、前編の最後の定理「剰余なしのn項からなるNewtonの差分…

PythonユーザーのためのMatlab対応表

PythonユーザーのためのMatlab対応表を作っていこうと思います。 Matlabのドキュメントは初心者殺しっぽいところがありますよね… 徐々に増やしていく予定です。 list 宣言・要素の追加 python a = [1, 2] a.append(3) # a = [1, 2, 3] a.append(4) # a = [1,…

python pulp 変数和

pulpです。 変数の和を表現するときにsumよりもlpSumを使った方が高速にプログラムが動くという話です。 この簡単な最小化問題を例に。aは定数、bは実変数です。 import pulp from random import randint # A new Lp problem prob = pulp.LpProblem('sample'…

【Matlab】【Python】ディレクトリ内のファイルに対し反復処理を行う

python from glob import glob files = glob('パス名'); for file_name in files: pass file_nameにはファイルパスが代入されます。 matlab files = dir('パス名’) numfiles = length(files); for i =1:numfiles file = files(i); file_name = file.name; fo…

最短路問題を線形計画法で解く (Python)

グラフの最短路問題はダイクストラ法等で解くのが普通ですが、 今回は線形計画法で解いてみたいと思います。(あえてね) 定式化は こうなります。 最短路を解く問題なのに目的関数が最大化になっているところが面白いですね。 ad(j)については、jの隣接ノード…

【Python】 newton法(非線形計画)

newton法とは、目的関数の最小化元(或いは最大化元)を求める問題に対する反復法と呼ばれる解法の一つです。 関数fと勾配、初期点を問題に合わせて入力する必要があります。

【Python】 最急降下法(非線形計画)

最急降下法とは、目的関数の最小化元(或いは最大化元)を求める問題に対する反復法と呼ばれる解法の一つです。 目的関数fと勾配、初期点を問題に合わせて入力する必要があります。

Python 要素1のタプルの宣言

要素が一つのタプルを作りたいときに a = (1) としても, >>> a 1 >>> type(a) <class 'int'> でaは整数型になっていることが分かります。 じゃあ、どうすればいいかというと a = (1, ) もしくは a = 1, としてやれば、いいです。 なんか気持ち悪いですね。</class>

Python 数独を解く

pythonのpulpモジュールを用いて、数独を線形計画法で解きます。 pulpはpip3 install pulpでインストールできます。

Python multiprocessingで並列処理

pythonの標準モジュールmultiprocessingを使用すれば、並列処理を行うことができます。 Pool map 基本的な使い方は from multiprocessing import Pool with Pool(processes=None) as pool: pool.map(func, iter) Poolの引数であるprocessesには並列処理に使…

Python ジェネレーター内包表記

普通にリストの内包表記の感覚でタプルの内包表記を書こうとすると a = (i for i in range(10)) type(a) > <class 'generator'> と、ジェネレータが作成されてしまいます。 タプルが欲しいのに….と言うときは、 b = tuple(a) とtupleでジェネレーターをラップさせればokです。 </class>…

Python pickle プロトコルの指定

今までpickleファイルを作成するときは、 with open(file, 'wb') as f: pickle.dump(obj=obj, file=f) としていましたが、プロトコルバージョンを高いものに指定してやると、より速く読み込めるpickleファイルが作れるらしい。。 最新のプロトコルバージョン…

Python reduce関数

functoolsのreduce関数を使って、リストの中身を全て足したり掛けたり、といった操作を行えます。 from functools import reduce from operator import add, mul a = [1, 2, 3, 4] # 適当なリスト reduce(add, a) # 総和 > 10 reduce(mul, a) # 総乗 > 24 こ…

Python osmnxのインストール

pythonでopen street mapのデータを読み込めるosmnxという便利なモジュールがあるのですが、 pip3 install osmnxとインストールしようとすると、 fiona/_transform.cpp:473:10: fatal error: 'cpl_conv.h' file not found #include "cpl_conv.h" ^ 1 error g…

Python format形式の中で{}を使う。

pythonのformat形式で例えば{ゴリラ} という文字列を作りたいときは animal = 'ゴリラ' print('{{}}'.format(animal)) print('{{animal}}'.format(animal=animal)) と{を2つ重ねます。

Cython その3 配列の型付け

Cython その2 - サブロウ丸の続きです。 今回はCythonでの配列の型付けの話をします。 配列の要素が全て同一の型の場合、(当然ですが)そのことを宣言した方がより高速になります。 Cythonで上記を実現するにはメモリービューと呼ばれるものを使用します。 nu…

Cython その2 変数の型付け

Cython その1 - サブロウ丸 前回からの続きです。 cython tsp.pyx --annotate もしくは cython tsp.pyx -a を実行すると tsp.html というファイルが作られます。 tsp.html · GitHub これをブラウザ等で開くと という、画面が出てきます。 簡単に言うと、濃い…

Cython その1

Cythonを使ってPythonのコードを高速化します。 Cythonのインストール pip3 install cython コンパイル cythonのインストールが終わったら、スクリプトをc言語にコンパイルするために、以下のsetup.pyを用意します。 (ext_modules = [Extension('tsp', ['tsp…

Python 巡回セールスマン問題

巡回セールスマン問題をpythonで解きます。 問題の概要はwikipediaをご覧ください。 巡回セールスマン問題 - Wikipedia 01整数計画法を使っても解けますが、今回は動的計画法を使用します。 擬似コード (字が汚くて、ごめんなさい) pythonコード DPは配列で…

numpy.array の dtype ..

下記のような、csvファイルをnumpyのarrayに読み込ませるスクリプトを書いていました。 from csv import reader as csv_reader # データの読み込み print('data reading...') data = np.array([ [0 for ii in range(num_column)] for i in range(num_row)]) …

Python と OpenCV で 類似画像検索

全く同じ画像だけではなく、より幅広く'似てそう'な画像を探します。 OpenCVのインストール OpenCVのインストールに関するページがネット上に多数あることから、OpenCVのインストールの難しさ(というより、やっかいさ?)が伺えますが、例に違わず僕もOpenCVの…

Python 集合と自然数との対応付け

下記のような、集合と自然数の対応付けを考えます。 {0, 1, 2, 3} <—> 15 基本的な考えは2進数表記です。 {0, 1, 2, 3} <—> 20 + 21 + 22 + 23 = 15 {0, 1, 3} <—> 20 + 21 + 23 = 11 これをそのまま関数にすると、 def set2int(_iter): res = 0 for i in _i…

Pythonスクリプト内でシェルコマンドを使う

subprocess シェルの中で他のプログラムを起動し、そのプログラムが生成した出力を知りたいだけなら、getoutput()関数を使う。 import subprocess as sp ls = sp.getoutput('ls') ls > 'Applications\nDesktop\nDocuments\n...(略)' オプションとパイプ、リ…

Python collections の Counterオブジェクト

下記の問題を解きます。 kamipeipaa君は新しいものが大好きです。 kamipeipaa君はある日N個の整数A1,A2,A3,....,ANを見つけました。 整数Aiに対して,Ai=Ajとなるjがi以外に存在しなければ,Aiは新規性があるのではないかとkamipeipaa君は考えました。 上記…

Python 出力の上書き

プログラムのループ文の中で計算の途中結果を出力したいけど、 画面につらつらと出力されるのは鬱陶しいなー...という時に便利な、出力を上書きしていく方法です。 サンプルコード from time import sleep for i in range(10): print('\r', i, end='') sleep…

Python Numba のインストール

PythonパッケージのNumbaのインストールに手こずったので、記録。 とりあえず、やったこと numbaのインストールにはllvmとllvmliteが必要とのことなので e-1. llvmのインストール brwe install llvm e-2. export LLVM_CONFIG=/usr/local/Cellar/llvm/3.9.1/b…