プログラミング所感 - 前へ 目次 次へ
今年の抱負は、
子供に数理最適化を教える。
pandas
よさそう。PyConでも聞いたんだけど、よく覚えてない。
Pythonで
bool('False')がTrueになったよ。
店舗最適化に関してメモ。
昼食を取る順番。特売データを除く。補充を考慮する。新製品の扱い。季節性の扱い。対象の粒度をどうするか。製品別か分類別か。
Pythonにvirtualenvというのがある。
テストとかに使えるかも。
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
|
matplotlibで
xkcd()とやると面白い。
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」にアクセス
ビンパッキングの問題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() |
私の気に入った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
LLの比較。便利。
http://hyperpolyglot.org/scripting
__slots__を指定すると、オブジェクトの辞書を作らないので、メモリが節約できる。
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」で戻る。
最長しりとりは、
勉強会でやっている。こんな感じ。
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/
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 リポジトリがあって好きにインストールできるならば、
ネットにつなげるだけで、資料を共有できて、実行もできる。
turtleの
インストールができなかったので作った。
Logo.ipynb
pythonで
「Unable to find vcvarsall.bat」と出るとき、VC12があるなら、下記で直る。
http://plaza.harmonix.ne.jp/~fakira/turedure/set12to9.zip
PythonORセミナーは
大盛況だった。皆様お疲れ様でした。
IPythonNotebook
を印刷するには、HTML化してから印刷すればよい。
AnacondaではLatexも印刷できるが、通常のでは出ない。通常のでは、NodeJSをインストールするとLatexも印刷できる。http://nodejs.jp/nodejs.org_ja/docs/v0.10/
前にも書いたが、
もう一度書く。
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千円入っている確率はいくつか」という問題を考えよう。この問題は、上記の問題と同じである。従って答えは「わからない」だ。
- 確率はわからないため期待値も計算できない。従って、替えた方がよいかどうかもわからない。
pandasのDataFrameで
小数点をn桁目までに丸める方法。applymap(partial(round, ndigits=n))
6月から12月の間で、
Python数理最適化で11回発表する。
4回は自社開催セミナー。1回はOR学会。4回は大学向け。1回は研究会。1回はPyCon。
pandasのグラフで、
棒グラフにしたいときは、plot(kind='bar')、散布図にしたいときは、plot(x名称,y名称, kind='scatter')。
pandasのSeriesの
dtypeを変えたいとき、Seriesのapplyを使えばよい。
pandasで
dfがDataFrameだとすると、df.ix[:, i][条件]では更新可能だが、df[条件].ix[:, i]はコピーになり更新されない。
会社で新人は、
入社の意気込みを四字熟語で表現させられる。
私は、鶏口牛後だったか。しかし、早々にして鶏口牛後は気にしなくなった。
(向いていないと思ったからである)
「初心忘れるべからず」といわれるが、初心を忘れたわけではないと思っている。
私の中で、このことわざは、「ゴールを目指して進んでいくときに、
スタートした後、周りの状況が変わっても、自分は同じように進んでいく」ことと思っている。
同じ「スピード」というよりは、同じ「前向きな気持ち」でということだ。
すなわち、私の中で「初心」とは「前向きな気持ち」だ。
この中でゴールが大事になる。私の社会生活のゴールは「自分が楽して暮らす」であったが、
全く改善していない。実際にやっていることは、「他人が楽して暮らす手伝い」だ。
最初から、これをゴールにすればよかった。「限りなく他人が楽して暮らす手伝い」を
社会生活の目的にしよう。「限りなく」なのでゴールに到達することはない。
人生のゴールは、到達しなくてもいいんじゃなかろうか。
tex
のインストールが面倒だ。とりあえずw32tex入れた。前も入れたのに全然覚えていなかった。
プログラミング所感 - 前へ 目次 次へ
|