質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

619閲覧

Pythonでのランダムに入れ替え

yoshipiman

総合スコア6

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/01/08 12:56

編集2020/01/10 08:29

前提・実現したいこと

Pythonでシフト作成のシステムを作っています。
できたシフトに社員がいなかった場合の入れ替え作業と3連勤がいたときの入れ替え作業が分かりません。

発生している問題・エラーメッセージ

制約条件 1.各日各時間に社員が最低1人は配置する。 2.全従業員3連勤以上は禁止 この2つの制約に引っかかったときの処理のプログラムに困っています。

該当のソースコード

Python

1#従業員=["能力値","シフト希望時間","役職","休む度合い","対応度合い","名前"] 2#役職=["社員","アルバイト"] 3#役職=[0,1] 4#シフト希望時間=[11:00-17:00,17:00-22:00,11:00-22:00,"希望無し"] 5#シフト希望時間=[0,1,2,9] 6 7#aは社員 8a=[5,[2,0,2,2,2],0,1,3,"a"] 9#bは社員 10b=[3,[2,2,2,0,2],0,1,3,"b"] 11#cは主婦 12c=[3,[0,0,0,0,9],1,2,1,"c"] 13#dはフリーター 14d=[4,[2,2,2,9,1],1,2,2,"d"] 15#eは大学生(夕方) 16e=[1,[1,1,9,1,1],1,1,3,"e"] 17#fは大学生(朝) 18f=[2,[9,2,9,2,0],1,1,2,"f"] 19 20member=[a,b,c,d,e,f] 21 22shift = [] 23gozen = [] 24gogo = [] 25 26for i in range(len(member[1][1])): 27 for j in member: 28 if j[1][i] == 0: 29 gozen.append(j) 30 elif j[1][i] == 1: 31 gogo.append(j) 32 elif j[1][i] == 2: 33 gozen.append(j) 34 gogo.append(j) 35 shift.append([gozen, gogo]) 36 gozen = [] 37 gogo = [] 38 39print(shift[0][0]) #1日目の午前の希望 40print(shift[0][1]) #1日目の午後の希望  41print(shift[1][0]) #2日目の午前の希望 42print(shift[1][1]) #2日目の午後の希望 43print(shift[2][0]) #3日目の午前の希望 44print(shift[2][1]) #3日目の午後の希望 45print(shift[3][0]) #4日目の午前の希望 46print(shift[3][1]) #4日目の午後の希望 47print(shift[4][0]) #5日目の午前の希望 48print(shift[4][1]) #5日目の午後の希望 49print(".............................................") 50 51 52#必要人数 53#1日目=[午前の必要人数,午後の必要人数] 54d1=[3,3] 55d2=[2,3] 56d3=[3,2] 57d4=[2,2] 58d5=[2,3] 59 60day=[d1,d2,d3,d4,d5] 61 62shift[0][0].sort(reverse=True) #1日目の午前の希望を能力値の高い順にソート 63print (shift[0][0]) 64 65shift[0][1].sort(reverse=True) #1日目の午後の希望を能力値の高い順にソート 66print (shift[0][1]) 67 68shift[1][0].sort(reverse=True) #2日目の午前の希望を能力値の高い順にソート 69print (shift[1][0]) 70 71shift[1][1].sort(reverse=True) #2日目の午後の希望を能力値の高い順にソート 72print (shift[1][1]) 73 74shift[2][0].sort(reverse=True) #3日目の午前の希望を能力値の高い順にソート 75print (shift[2][0]) 76 77shift[2][1].sort(reverse=True) #3日目の午後の希望を能力値の高い順にソート 78print (shift[2][1]) 79 80shift[3][0].sort(reverse=True) #4日目の午前の希望を能力値の高い順にソート 81print (shift[3][0]) 82 83shift[3][1].sort(reverse=True) #4日目の午後の希望を能力値の高い順にソート 84print (shift[3][1]) 85 86shift[4][0].sort(reverse=True) #5日目の午前の希望を能力値の高い順にソート 87print (shift[4][0]) 88 89shift[4][0].sort(reverse=True) #5日目の午後の希望を能力値の高い順にソート 90print (shift[4][1]) 91 92print(".............................................") 93 94 95d1gozen=[] 96for i in range(day[0][0]): #1日目の午前のソートされたリストから必要人数分取る 97 d1gozen.append(shift[0][0][i]) 98print (d1gozen) 99 100d1gogo=[] 101for i in range(day[0][1]): #1日目の午後のソートされたリストから必要人数分取る 102 d1gogo.append(shift[0][1][i]) 103print (d1gogo) 104 105d2gozen=[] 106for i in range(day[1][0]): #2日目の午前のソートされたリストから必要人数分取る 107 d2gozen.append(shift[1][0][i]) 108print (d2gozen) 109 110d2gogo=[] 111for i in range(day[1][1]): #2日目の午後のソートされたリストから必要人数分取る 112 d2gogo.append(shift[1][1][i]) 113print (d2gogo) 114 115d3gozen=[] 116for i in range(day[2][0]): #3日目の午前のソートされたリストから必要人数分取る 117 d3gozen.append(shift[2][0][i]) 118print (d3gozen) 119 120d3gogo=[] 121for i in range(day[2][1]): #3日目の午後のソートされたリストから必要人数分取る 122 d3gogo.append(shift[2][1][i]) 123print (d3gogo) 124 125d4gozen=[] 126for i in range(day[3][0]): #4日目の午前のソートされたリストから必要人数分取る 127 d4gozen.append(shift[3][0][i]) 128print (d4gozen) 129 130d4gogo=[] 131for i in range(day[3][1]): #4日目の午後のソートされたリストから必要人数分取る 132 d4gogo.append(shift[3][1][i]) 133print (d4gogo) 134 135d5gozen=[] 136for i in range(day[4][0]): #5日目の午前のソートされたリストから必要人数分取る 137 d5gozen.append(shift[4][0][i]) 138print (d5gozen) 139 140d5gogo=[] 141for i in range(day[4][1]): #5日目の午後のソートされたリストから必要人数分取る 142 d5gogo.append(shift[4][1][i]) 143print (d5gogo) 144 145print(".............................................") 146 147for day in range(len(shift)): 148 for am_pm in range(len(shift[day])): 149 person_list = [] 150 for i in shift[day][am_pm]: 151 person_list.append(i[2]) 152 if 0 in person_list: 153 print('社員います') 154 else: 155 print('社員いません') 156 157day1=[d1gozen,d1gogo] 158day2=[d2gozen,d2gogo] 159day3=[d3gozen,d3gogo] 160day4=[d4gozen,d4gogo] 161day5=[d5gozen,d5gogo] 162week=[day1,day2,day3,day4,day,5] 163 164for people in member: 165 for i in range(len(week)): 166 if people in week[i]: 167 if people in week[i-1] and if people in week[i+1]: 168

試したこと

【制約条件1】

for day in range(len(shift)): for am_pm in range(len(shift[day])): person_list = [] for i in shift[day][am_pm]: person_list.append(i[2]) if 0 in person_list: print('社員います') else: print('社員いません')

できたシフトに社員がいるかどうかの判別は上記のプログラムでできたのですが「社員がいません」となったリストを、そのリストの1中のランダム1人とシフト希望は出したが入らなかった社員ランダム1人と入れ替えるプログラムにしたく教えていただきたいです。

【制約条件2】

day1=[d1gozen,d1gogo] day2=[d2gozen,d2gogo] day3=[d3gozen,d3gogo] day4=[d4gozen,d4gogo] day5=[d5gozen,d5gogo] week=[day1,day2,day3,day4,day,5] for people in member: for i in range(len(week)): if people in week[i]: if people in week[i-1] and if people in week[i+1]:

「3連勤以上は禁止」は処理中のシフトの前後2シフト共ににその人がいるかどうかを調べ、3連勤をしていたら、その人とその時間帯にシフト希望は出したが入らなかった従ランダム1人と入れ替えるプログラムにしたく教えていただきたいです。

以上の2つが分からなくて困っています。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/01/08 13:48

上記プログラムですと、社員が1人もいない場合はそもそも希望を出していないのではないでしょうか? つまり「シフト希望は出したが入らなかった社員」がいない場合のロジックが抜けているのではないでしょうか?
yoshipiman

2020/01/09 05:22

修正いたしました。よろしくお願いします。
quickquip

2020/01/10 00:07

コードは読めるようにした方がいい(というかそうしないと答えようがない)ですね
yoshipiman

2020/01/10 06:01

ご指摘ありがとうございます。 読めるようにするとはどういうことでしょうか。
quickquip

2020/01/10 07:14 編集

自分で質問を読んで、インデントがなくなってしまったこのコードがどういう構造か理解できますか? インデントがある状態でソース部分を選択して<code>ボタンでコードとして読めるようにしてください。 https://teratail.com/help/question-tips#questionTips3-5-1
yoshipiman

2020/01/10 08:30

初心者で全然分かってなかったです。すみません。修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問