dataminer.me

データマイニングやその周辺のお話を書くブログ

R+Pythonで線形計画法

バイト先の新規タイトルの広告戦略のためにEXCEL→R→Python→出力という

ややこしい線形計画法のスクリプトを書いてみた

Excelで線形計画法をやったことはないけど、多分こっちのほうが早く答えを出せるんじゃないかと思う。

使うファイルはこちら(http://www.mediafire.com/?zmvtme1m4mm
(pyExceleratorは2007には対応してないので。)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#rpy2が使える環境であることを確認
import numpy as NP
try:
	import rpy2.robjects as robjects
except:
	print "Rpy2をインストールしてください。"
	print "UBUNTUの場合、apt-get install python-rpy2 でインストールできます。"
	print "easy_install が入っている場合は easy_install rpy2 でインストールできます。"
	print "その他の場合は http://sourceforge.net/projects/rpy/files/rpy2/ からダウンロードして対応ください。"
try:
	import pyExcelerator
except:
	print "pyExceleratorをインストールしてください。"
	print "UBUNTUの場合、apt-get install python-excelerator でインストールできます。"
	print "その他の場合は http://sourceforge.net/projects/pyexcelerator/ からダウンロードして対応ください。"
#RのMCMCパッケージであるMCMCpackをダウンロード
try:
	robjects.r["library"]("lpSolve")
except:
	print "CRANのミラーサイトを使ってlpSolveパッケージをダウンロードしてください。"
	robjects.r["install.packages"]("lpSolve")

#Excelデータのハンドリング
rows = {}
ExcelSheets = pyExcelerator.parse_xls('sample.xls')
for sheet_name, values in ExcelSheets:
	if sheet_name.startswith("Model"):
		for row, col in sorted(values.keys()):
			v = values[row,col]
			if rows.has_key(row):
				rows[row].append(v)
			else:rows[row] = [v]

#解析用のデータ作成
Con = []
Dir = []
Rhs = []
for RowKey in rows.keys():
	if RowKey == 0:
		Index =rows[RowKey]
	elif RowKey == 1:
		Robj = robjects.r["c"](robjects.FloatVector(rows[RowKey][1:]))
	else:
		Con += rows[RowKey][1:-2]
		Dir.append(rows[RowKey][-2])
		Rhs.append(rows[RowKey][-1])

#データの流し込み
Vcon = robjects.r["c"](robjects.FloatVector(Con))
Rcon = robjects.r["matrix"](Vcon,nrow=len(rows.keys())-2,byrow="TRUE")
Rdir = robjects.r["c"](robjects.StrVector(Dir))
Rrhs = robjects.r["c"](robjects.FloatVector(Rhs))
Result = robjects.r["lp"]("max", Robj, Rcon, Rdir, Rrhs)

#結果の提示
Solution = map(str,list(NP.array(Result.r["solution"])[0]))
OutputFile = open("Solution.txt","w")
OutputFile.write("Solution:"+"\n"+"\t".join(Index)+"\n" + "\t".join(Solution)+"\n")