質問編集履歴
2
ソースについてそのままでは動作できなかったため、載せ替えさせていただきました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -31,8 +31,6 @@
|
|
31
31
|
|
32
32
|
### 該当のソースコード
|
33
33
|
```html
|
34
|
-
Python
|
35
|
-
|
36
34
|
import numpy as np
|
37
35
|
import pandas as pd
|
38
36
|
from pulp import *
|
@@ -41,16 +39,23 @@
|
|
41
39
|
import string
|
42
40
|
|
43
41
|
model = LpProblem()
|
42
|
+
|
43
|
+
n_members = 5
|
44
|
+
members = list(string.ascii_uppercase[:n_members])
|
45
|
+
days = range(1, 31)
|
46
|
+
n_days = 30
|
47
|
+
|
44
48
|
"""
|
45
49
|
変数の準備
|
46
50
|
"""
|
47
51
|
a = pd.DataFrame(addvars(5, 30), index=members, columns=days)
|
48
52
|
members = list(string.ascii_uppercase[:n_members])
|
49
53
|
|
50
|
-
base_duty_list = ['日勤', '夜勤', '明け', '休暇']
|
51
|
-
num_required_members = {'日勤': 6, '夜勤': 7, '明け': 5,
|
54
|
+
num_required_members = {'日勤': 6, '夜勤': 7, '明け': 5, '休暇': 0}
|
52
|
-
num_rest_members = {'日勤': 1,
|
55
|
+
num_rest_members = {'日勤': 1, '夜勤': 0, '明け': 0, '休暇': 5}
|
53
56
|
|
57
|
+
duty_list = ['明け', '休暇', '日勤', '夜勤', '明け', '休暇', '日勤', '夜勤', '明け', '休暇', '日勤', '夜勤', '明け', '休暇', '日勤', '夜勤', '明け', '休暇', '日勤', '夜勤', '明け', '休暇', '日勤', '夜勤', '明け', '休暇', '日勤', '夜勤', '明け', '休暇']
|
58
|
+
|
54
59
|
t = 30
|
55
60
|
y = addvar()
|
56
61
|
x = addvar()
|
@@ -61,7 +66,7 @@
|
|
61
66
|
"""
|
62
67
|
各メンバーの出勤日数をなるべく小さくする
|
63
68
|
"""
|
64
|
-
for i, s in enumerate(a.sum(
|
69
|
+
for i, s in enumerate(a.sum()):
|
65
70
|
model.addConstraint(s - t <= y)
|
66
71
|
model.addConstraint(s - t >= -y)
|
67
72
|
|
@@ -77,7 +82,7 @@
|
|
77
82
|
"""
|
78
83
|
for i in range(n_days):
|
79
84
|
n_mem = num_required_members[duty_list[i]]
|
80
|
-
model.addConstraint(a.iloc[:,i].sum()
|
85
|
+
model.addConstraint(a.iloc[:,i].sum() == n_mem)
|
81
86
|
|
82
87
|
"""
|
83
88
|
該当の日の休暇(0)の数が一致する。
|
@@ -90,7 +95,6 @@
|
|
90
95
|
model.addConstraint(x <= n_rest)
|
91
96
|
|
92
97
|
model.solve()
|
93
|
-
|
94
98
|
```
|
95
99
|
|
96
100
|
### 試したこと
|
1
大変失礼いたしました。マークダウンの記述で訂正いたしました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -12,10 +12,13 @@
|
|
12
12
|
### 発生している問題・エラーメッセージ
|
13
13
|
元々存在していたソースは「0:休暇」「1:出勤」の組合せを制約式にしたものだったのですが、この制約式を修正し、0~2の値を取り得ることと、該当の日における「0:休暇」の人数を制約式として追加することを試みました。
|
14
14
|
######0~2の値を取り得る
|
15
|
+
```HTML
|
15
16
|
for i in range(n_members):
|
16
17
|
for j in range(n_days):
|
17
|
-
model.addConstraint(a.iloc[i,j] <= 2)
|
18
|
+
model.addConstraint(a.iloc[i,j] <= 2)
|
19
|
+
```
|
18
20
|
######該当の日における「0:休暇」の人数
|
21
|
+
```HTML
|
19
22
|
for i in range(n_days):
|
20
23
|
n_rest = num_rest_members[duty_list[i]]
|
21
24
|
for j in range(n_members):
|
@@ -25,8 +28,9 @@
|
|
25
28
|
```
|
26
29
|
実行すると後半部分の制約式に誤りがあり、次のようなエラーが発生します。
|
27
30
|
TypeError: Can only add LpConstraint objects
|
28
|
-
|
31
|
+
|
29
32
|
### 該当のソースコード
|
33
|
+
```html
|
30
34
|
Python
|
31
35
|
|
32
36
|
import numpy as np
|
@@ -87,6 +91,8 @@
|
|
87
91
|
|
88
92
|
model.solve()
|
89
93
|
|
94
|
+
```
|
95
|
+
|
90
96
|
### 試したこと
|
91
97
|
前述でも記載させていただきましたが、0~2の値を取り得ることと、該当の日における「0:休暇」の人数を制約式として追加することを試みましたが、休暇(0)の数の制御がうまく動作しませんでした。
|
92
98
|
|