スケジューリング

問題解決の数理 第5章スケジューリング1

問題解決の数理のWebサイトにある指標計算のプログラムとデータを読み込んで実行してみる。

OSがlinuxなので読み込むときにencodingしないとエラーになる

1
2
3
4
5
6
7
source('http://www.campus.ouj.ac.jp/~maps13/05/PERT.R', encoding="CP932")
x <- read.table('http://www.campus.ouj.ac.jp/~maps13/05/Cake.txt', header=T, fileEncoding="CP932")
y<-PERT(x)
z<-data.frame(y$ID,y$作業,y$開始点,y$最早開始時刻,y$終了点,y$作業時間,y$終了点の最遅開始時刻,y$作業の最遅開始時刻,y$余裕時間)
colnames(z)<-c("ID","作業","開始点","最早開始時刻","終了点","作業時間", "終了点の最遅開始時刻","作業の最遅開始時刻","余裕時間")
library(knitr)
kable(z)
ID 作業 開始点 最早開始時刻 終了点 作業時間 終了点の最遅開始時刻 作業の最遅開始時刻 余裕時間
1 A 1 1 3 6 7 1 0
2 B 1 1 2 5 7 2 1
3 d 2 6 3 0 7 7 1
4 C 3 7 4 8 15 7 0
5 D 2 6 4 2 15 13 7
6 E 4 15 5 10 25 15 0

上記の指標計算のプログラムに続けて簡易的なアローダイアグラムを作成する。
diagramパッケージを使う。

1
2
3
4
5
6
7
8
9
10
library(diagram)
num<-length(unique(c(unique(z$開始点),unique(z$終了点))))
M<-matrix(nrow=num,ncol=num,byrow=T,data=0)
for (i in 1:length(z$作業)) {
moji<-paste(z$作業[i],z$作業時間[i],sep="-")
M[z$開始点[i],z$終了点[i]]<-moji
}
names<-1:num
#このままだと矢印の向きが逆になるので転置してからプロット
pp<-plotmat(t(M),name=names,pos=c(1,num-2,1), box.size = 0.02,box.col = "lightblue",shadow.size = 0, arr.len =0.3, cex.txt = 0.8)

  • ポジションの調整を行う。
  • 上から 1-2-1-1の配置。plotmat関数は上からの配置のみ。
1
pp<-plotmat(t(M),name=names,pos=c(1,2,1,1), box.size = 0.02 ,box.col = "lightblue",shadow.size = 0,curve=0,arr.type = "simple", arr.len =0.3, cex.txt = 0.8)

  • ダミー作業も実線になる。点線にするために一工夫。
1
2
3
4
5
6
7
8
9
10
#d-0の入っている箇所に0を入れて線を書かないようにする。
M[2,3]<-"0"
pp<-plotmat(t(M),name=names,pos=c(1,2,1,1), box.size = 0.02 ,box.col = "lightblue",shadow.size = 0,curve=0,arr.type = "simple", arr.len =0.3,cex.txt = 0.8)
#ダミー作業の線を描く始点と終点の座標
m2<- pp$comp[names==2]
m3<- pp$comp[names==3]
#線を書く
dummy<-straightarrow(from =m2,to = m3,arr.type ="simple", arr.pos =0.5,lty=3,arr.len =0.3)
#d-0を書く
textplain(mid=(m2+m3)/2,lab=c("","d-0"),adj = c(0, 0.5),cex=0.8)

  • あまり美しくないけどとりあえず完成