スケジューリング2

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

GanttProjectを使って

演習問題5.1

記号 標準所要日数 先行作業
A 4 -
B 2 -
C 3 A
D 5 A
E 6 B,C
F 1 D
G 2 E,F
H 3 D

(問題解決の数理のWebサイトで紹介されている)GanttProjectを使って作成した図

  • 2014年10月1日を開始点とした。
  • 休日はなしに設定。
  • 操作はわかりやすい。
  • クリティカルパス A->C->E->G も色分けされるので分かる。
  • PERT図の配置は手作業(ドラッグアンドドロップ)。

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

1
2
3
4
5
6
7
8
9
10
11
12
source('http://www.campus.ouj.ac.jp/~maps13/05/PERT.R', encoding="CP932")
x<-data.frame( c("A","B","C","D","E","F","G","H"),
c(1,2,3,4,5,6,7,8),
c(1,1,2,2,3,4,5,4),
c(2,3,3,4,5,5,6,6),
c(4,2,3,5,6,1,2,3))
names(x)<-c("作業","NO","開始点","終了点","作業時間")
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 2 4 5 1 0
2 B 1 1 3 2 8 6 5
3 C 2 5 3 3 8 5 0
4 D 2 5 4 5 13 8 3
5 E 3 8 5 6 14 8 0
6 F 4 10 5 1 14 13 3
7 G 5 14 6 2 16 14 0
8 H 4 10 6 3 16 13 3
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,2,2,1),box.size = 0.02 ,box.col = "lightblue",shadow.size = 0,curve=0,arr.type = "simple", arr.len =0.3, cex.txt = 0.8)

igraphパッケージを使う(作業名は表示されない)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
num<-length(unique(c(unique(z$開始点),unique(z$終了点))))
M<-matrix(nrow=num,ncol=num,byrow=T,data=0)
#ダミー作業を表示するため作業時間に1を加える
for (i in 1:length(z$作業)) {
M[z$開始点[i],z$終了点[i]]<-z$作業時間[i]+1
}
library(igraph)
#graph.adjacency()関数の引数tkplot(g,vertex.label=V(g)$name,edge.label=E(g)$weight-1,layout=layout.auto)weightedにTRUEを与えることで距離行列からグラフオブジェクトを作成できる.
#このときグラフは重み付きグラフになり,属性(後述)weightに重みが記録されたグラフになる.
g <- graph.adjacency(M, weighted=TRUE)
plot(g)
V(g)$size <-15
#プロットする際にはweightから1を引いた値をラベリング
plot(g,vertex.label=V(g)$name,edge.label=E(g)$weight-1,layout=layout.auto)