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")