プログラミング所感 - 前へ 目次 次へ


14/01/06(月)

今年の抱負は、 子供に数理最適化を教える。

14/02/05(水)

pandas よさそう。PyConでも聞いたんだけど、よく覚えてない。

14/03/12(水)

Pythonで bool('False')がTrueになったよ。

14/03/18(火)

店舗最適化に関してメモ。 昼食を取る順番。特売データを除く。補充を考慮する。新製品の扱い。季節性の扱い。対象の粒度をどうするか。製品別か分類別か。

14/03/19(水)

Pythonにvirtualenvというのがある。 テストとかに使えるかも。

14/04/18(金)

Pythonで数独。 定式化して解くのに、入出力合わせて15行だ。
from pulp import *
m = LpProblem()
v = [[[LpVariable('v%d%d%d' % (i, j, k), cat = LpBinary) for k in range(9)] for j in range(9)] for i in range(9)]
with open('pulp-sudoku.txt') as fp:
	for i, j in [(i0, j0) for i0 in range(9) for j0 in range(9)]:
		if j == 0: s = fp.readline()
		if s[j].isdigit(): m += v[i][j][int(s[j]) - 1] == 1
		m += lpSum(v[i][j]) == 1
		m += lpSum(v[i][k][j] for k in range(9)) == 1
		m += lpSum(v[k][i][j] for k in range(9)) == 1
		m += lpSum(v[i / 3 * 3 + i1][i % 3 * 3 + j1][j] for i1 in range(3) for j1 in range(3)) == 1
m.solve()
for i in range(9):
	for j in range(9): print int(1 + sum([k * value(v[i][j][k]) for k in range(9)])),
	print

14/04/25(金)

matplotlibで xkcd()とやると面白い。

14/05/01(木)

ipythonを リモートサーバでホスティングする方法のメモ。

下記を実行し、ハッシュをメモ。

import IPython.lib
IPython.lib.passwd()
DOS画面で「ipython profile create XXX」を実行する。(XXXは適宜) %HOMEPATH%\.ipython\profile_XXX\ipython_notebook_config.py の「c = get_config()」を下記で修正。
c = get_config()
c.IPKernelApp.pylab = 'inline'
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.password = 最初のハッシュ
c.NotebookApp.port = 9999
「ipython notebook --profile=XXX」を実行し、「http://localhost:9999」にアクセス

14/05/08(木)

ビンパッキングの問題HARD28を 取ってきて、問題ごとに分割する。
import os, urllib
if not os.path.exists('hard28'): os.mkdir('hard28')
fp = urllib.urlopen('http://www.math.tu-dresden.de/~capad/TESTS/1DBPP/hard28')
while True:
	fnam = fp.readline().strip('\'\n')
	if not fnam: break
	n1 = int(fp.readline())
	n2 = int(fp.readline())
	with open('hard28\\' + fnam + '.txt', 'w') as gp:
		gp.write('%d,%d\n' % (n1, n2))
		for i in range(n1):
			a, b = [int(s) for s in fp.readline().split()]
			gp.write('%d %d\n' % (a, b))
fp.close()

14/06/02(月)

私の気に入ったPythonicな書き方。
  • リスト内包表記:Pythonといったら、まずこれ。
  • 代入が複数可。swapも簡単「a, b = b, a」
  • 比較も複数可。「a != x or b != y」より「(a, b) != (x, y)」がわかりやすい。
  • 範囲判定。「0 <= x < n」とか「x in range(n)」。わかりやすい。
  • 反転。「a[::-1]」
  • 上の応用でaが2次元のとき、90度回転。「zip(*a[::-1])」
  • ポインタでなく指している先を変える。「a[:] = ...」
  • コンテナかどうか。「isinstance(..., collections.Iteranle)」
  • 最大公約数
    def gcd(a, b):
    	while b: a, b = b, a % b
    	return a
Python ORセミナーします。
https://kke.smartseminar.jp/public/seminar/view/1014

14/06/05(木)

LLの比較。便利。 http://hyperpolyglot.org/scripting

__slots__を指定すると、オブジェクトの辞書を作らないので、メモリが節約できる。


14/06/06(金)

Pythonのプログラムを IPythonで実行すると、結果が変わっていた。 調べると、元々ビルトインのallがnumpyのallに変わっていた。 しかもnumpyのallはジェネレータを受け取ると常にTrueになっている!
all([0])
all(i for i in [0])
all([i for i in [0]])
__builtin__.all(i for i in [0])
1行目は期待通りFalseだが2行目はジェネレータを返しboolにするとTrue扱いだ。 期待通りにするには、3行目か4行目のようにするしかない。 忘れないようにするには、最初に「all = __builtin__.all」とするか。 「from numpy import all」で戻る。

14/06/07(土)

最長しりとりは、 勉強会でやっている。こんな感じ。
from pulp import *
with open('cpp11_keywords.csv') as fp:
    l = [s.rstrip() for s in fp.readlines()]
    nl = len(l)
    rl = range(nl)
arcs = [] # アークとする
aout = [[] for i in rl] # 出るアーク
ain = [[] for i in rl] # 入るアーク
for i in rl:
    si = l[i][-1:]
    for j in rl:
        if i == j: continue
        sj = l[j][:1]
        if si == sj:
            k = len(arcs)
            aout[i].append(k)
            ain[j].append(k)
            arcs.append((i, j, k))
na = len(arcs)
m = LpProblem('shiritori', LpMaximize)
va = [LpVariable('a%d' % i, upBound=nl, cat=LpBinary) for i in range(na)] # アークを選ぶかどうか
vs = [LpVariable('s%d' % i, lowBound=0, upBound=1) for i in rl] # 先頭かどうか
vp = [LpVariable('p%d' % i, lowBound=0, upBound=nl) for i in rl] # 先頭からの距離
m += lpSum(va)
m += lpSum(vs) == 1
for i in rl:
    so = lpSum(va[j] for j in aout[i])
    si = lpSum(va[j] for j in ain[i]) + vs[i]
    m += so <= si
    m += si <= 1
for i, j, k in arcs:
    m += vp[i] + 1 <= vp[j] + nl * (1 - va[k])
%time m.solve()
print int(value(m.objective) + 1)
p = sum(i * int(value(vs[i])) for i in rl)
while p >= 0:
    print l[p],
    t = -1
    for h in aout[p]:
        i, j, k = arcs[h]
        if value(va[k]) > 0.5:
            t = j
            break
    p = t
コードも短いし、計算も速い(1秒かからず)。

https://codeiq.jp/magazine/2013/08/1710/


14/06/20(金)

IPythonでカレンダーをみたい。 そんなときは、適当なファイルに下記を書いて、そのファイル名を環境変数のPYTHONSTARTUPに指定すればOK。
import IPython.core.getipython, calendar, datetime
ip = IPython.core.getipython.get_ipython()
def cal_impl(self, args):
	s, t = args.split(), datetime.datetime.today()
	m, y = (s + [t.month])[0], (s[1:] + [t.year])[0]
	print(calendar.month(int(y), int(m)))
ip and ip.define_magic('cal', cal_impl)
IPythonで cal とすればカレンダーが表示される。cal 1なら1月、cal 1 2014なら2014年1月になる。

最近、打合せ資料や学会発表資料をIPython notebookで作っている。 ipython notebookのprivate リポジトリがあって好きにインストールできるならば、 ネットにつなげるだけで、資料を共有できて、実行もできる。


14/06/29(日)

turtleの インストールができなかったので作った。 Logo.ipynb

14/07/01(火)

pythonで 「Unable to find vcvarsall.bat」と出るとき、VC12があるなら、下記で直る。 http://plaza.harmonix.ne.jp/~fakira/turedure/set12to9.zip

14/07/14(月)

PythonORセミナーは 大盛況だった。皆様お疲れ様でした。

14/07/24(木)

IPythonNotebook を印刷するには、HTML化してから印刷すればよい。 AnacondaではLatexも印刷できるが、通常のでは出ない。通常のでは、NodeJSをインストールするとLatexも印刷できる。http://nodejs.jp/nodejs.org_ja/docs/v0.10/

14/08/11(月)

前にも書いたが、 もう一度書く。
http://blog.livedoor.jp/nwknews/archives/4126636.html
ジョーカーを除いたトランプ52枚の中から1枚のカードを抜き出し、表を見ないで箱の中にしまった。 
そして、残りのカードから無作為に3枚抜き出したところ、3枚ともダイヤであった。 
このとき、箱の中のカードがダイヤである確率はいくらか。 
答えは10/49。1/4と間違えている人が多い。そのパターンは以下の通り。
  • 1つめは、箱の中に入れた時点での確率を答えているもの。 問題が求めているのは、「3枚ともダイヤ」という情報を使った答え。これは問題文の「このとき」を理解していないため間違えている。
  • 2つめは、3枚のダイヤを作為的に選んでいるもの。つまり残りの51枚のカードを全て表にし、その中から3枚のダイヤを選んだと勘違いをしている。これは問題文の「無作為に」を理解していないため間違えている。
  • 3つめは、3枚のダイヤを選ぶ時に、最初の1枚も含めて選んだと勘違いをしているもの。これは問題文の「残りの」を理解していないために間違えている。
2つの封筒の問題。
ここにお金の入った封筒が2つある。
1つの封筒には他方の倍のお金が入っている。
(言い方を変えると、1つの封筒には他方の半分のお金が入っている) 
但し、いくら入っているかは分からない。
あなたは、2つの封筒のうち、どちらか1つだけを選び、中のお金をもらえる。
あなたが、1つ選んだところ1万円が入っていた。
ここで、「あなたが望むなら、もう1つの封筒と替えても良いですよ」と言われた。 
さて、替えた方が得か、替えない方が得か答えよ。
答えは「わからない」。替えても替えなくても同じという人が多いが、間違いである。

  • まず、「1つの封筒に5千円または2万円入っている。5千円の確率はいくつか」という問題を考えよう。 答えは、「わからない」だ。
  • 次に、「2つの封筒に比率が2となるように金額が入っている。1つ開けたところ1万円であった。もう1つの封筒に5千円入っている確率はいくつか」という問題を考えよう。この問題は、上記の問題と同じである。従って答えは「わからない」だ。
  • 確率はわからないため期待値も計算できない。従って、替えた方がよいかどうかもわからない。

14/08/12(火)

pandasのDataFrameで 小数点をn桁目までに丸める方法。applymap(partial(round, ndigits=n))

14/09/12(金)

6月から12月の間で、 Python数理最適化で11回発表する。 4回は自社開催セミナー。1回はOR学会。4回は大学向け。1回は研究会。1回はPyCon。

14/09/30(火)

pandasのグラフで、 棒グラフにしたいときは、plot(kind='bar')、散布図にしたいときは、plot(x名称,y名称, kind='scatter')。

14/10/01(水)

pandasのSeriesの dtypeを変えたいとき、Seriesのapplyを使えばよい。

14/10/02(木)

pandasで dfがDataFrameだとすると、df.ix[:, i][条件]では更新可能だが、df[条件].ix[:, i]はコピーになり更新されない。

14/10/16(木)

会社で新人は、 入社の意気込みを四字熟語で表現させられる。 私は、鶏口牛後だったか。しかし、早々にして鶏口牛後は気にしなくなった。 (向いていないと思ったからである)

「初心忘れるべからず」といわれるが、初心を忘れたわけではないと思っている。 私の中で、このことわざは、「ゴールを目指して進んでいくときに、 スタートした後、周りの状況が変わっても、自分は同じように進んでいく」ことと思っている。 同じ「スピード」というよりは、同じ「前向きな気持ち」でということだ。 すなわち、私の中で「初心」とは「前向きな気持ち」だ。

この中でゴールが大事になる。私の社会生活のゴールは「自分が楽して暮らす」であったが、 全く改善していない。実際にやっていることは、「他人が楽して暮らす手伝い」だ。 最初から、これをゴールにすればよかった。「限りなく他人が楽して暮らす手伝い」を 社会生活の目的にしよう。「限りなく」なのでゴールに到達することはない。 人生のゴールは、到達しなくてもいいんじゃなかろうか。


14/10/20(月)

tex のインストールが面倒だ。とりあえずw32tex入れた。前も入れたのに全然覚えていなかった。

プログラミング所感 - 前へ 目次 次へ