teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

ソースについてそのままでは動作できなかったため、載せ替えさせていただきました。

2019/06/21 03:43

投稿

k-shiokawa
k-shiokawa

スコア11

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, '休暇': 0}
54
+ num_required_members = {'日勤': 6, '夜勤': 7, '明け': 5, '休暇': 0}
52
- num_rest_members = {'日勤': 1, '夜勤': 0, '明け': 0, '休暇': 5}
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(1)):
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() <= n_mem)
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

大変失礼いたしました。マークダウンの記述で訂正いたしました。

2019/06/21 03:42

投稿

k-shiokawa
k-shiokawa

スコア11

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