前提・実現したいこと
遺伝的アルゴリズムについて学ぶために下記の動画を参考にしてコードを書いていたところ、
動画の#6の親となるデータを2つ生成するところで何度実行しても2つのデータが同じになってしまうため
その2つのデータが同じにならないようにしたいです。
該当のソースコード
def gene(kiso, holiday, day, days): count = 0 for i in range(len(kiso.index)): #今回では40回分(午前午後含む)を処理 if i % 2 == 0: holi = holiday.loc[i / 2][0] #2回に1回1人分の休日数を取得 count += 1 for l in range(1, days + 1): #1人分の午前、午後のどちらかを埋める(午前から) d = day.loc[1][l] #土日か平日を取得 g = kiso.loc[i][l] if g != 4: if g != 1 and g != 2 and g != 3: if d == 0: #希望休がなく社員の希望もなしで、休日なら kiso.loc[i][l] = 0 #休みする holi -= 1 #2回に1回取得するholiから1を引く else: kiso.loc[i][l] = random.randint(1, 3) #希望がなく、休日でなければ else: holi -= 1 #希望休の分の休みを引く if count % 2 == 0 and holi >= 1: #1人の人の午後の処理も終わり、休みが半日でも残っていれば for k in range(holi): #残っている休みの数だけループ while True: #必ず休みを消化するためwhile o = random.randint(0, 1) #午前と午後のどちらかを選ぶ r = random.randint(1, days) #1日から31日の中で選ぶ if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4: #上2つのo,rのところが休みでも希望休でもなければ kiso.loc[i - o][r] = 0 #o,rのところを休みに break return kiso dateframe = gene(kiso_,holiday,day,days)#ここをfor文で2回実行(appendで追加)
kiso_ 実際は20人分ですが、午前と午後を分けるために40個になっています また、1,2,3はそれぞれの部署?を意味しています
holiday 休日数は半日で1回のため20人分です
day 土曜と日曜を休日にするために0にしています
days その月の日数
試したこと
for文を使わずに2回書いて実行してみましたが解決しませんでした。
補足情報
pythonを始めて間もなく読みずらいコードですが、どなたかご教授よろしくお願いします。
google colaboratory python 3.7.12
pandas 1.1.5
追記
このexcelファイルがkiso_です
このファイルをread_excel関数で読み取り、そのデータをgeneに送っています。
import pandas as pd import random def read_excel(): df = pd.read_excel('Book1.xlsx') ho = df.iloc[2:42, 32:34] day = df.iloc[1:2, 1:32] day = day.replace('土', 0) day = day.replace('日', 0) day.columns = [i + 1 for i in range(len(day.columns))] df = df.iloc[2:42, 1:32] df = df.fillna(0) df = df.replace('o', 4) df.columns = [i + 1 for i in range(len(df.columns))] df.index = [i + 1 for i in range(len(df.index))] holiday = ho.iloc[:,0:1].dropna().reset_index(drop=True) holiday.columns = ['休日数'] ad = ho.iloc[:,1:2].fillna(0).reset_index(drop=True) ad.columns = ['管理者'] kiso = df.iloc[:,0:31].reset_index(drop=True) kiso.columns = [i + 1 for i in range(len(kiso.columns))] return kiso,holiday,df,ad,day,len(kiso.columns) def gene(kiso, holiday, day, days): count = 0 for i in range(len(kiso.index)): #今回では40回分(午前午後含む)を処理 if i % 2 == 0: holi = holiday.loc[i / 2][0] #2回に1回1人分の休日数を取得 count += 1 for l in range(1, days + 1): #1人分の午前、午後のどちらかを埋める(午前から) d = day.loc[1][l] #土日か平日を取得 g = kiso.loc[i][l] if g != 4: if g != 1 and g != 2 and g != 3: if d == 0: #希望休がなく社員の希望もなしで、休日なら kiso.loc[i][l] = 0 #休みする holi -= 1 #2回に1回取得するholiから1を引く else: kiso.loc[i][l] = random.randint(1, 3) #希望がなく、休日でなければ else: holi -= 1 #希望休の分の休みを引く if count % 2 == 0 and holi >= 1: #1人の人の午後の処理も終わり、休みが半日でも残っていれば for k in range(holi): #残っている休みの数だけループ while True: #必ず休みを消化するためwhile o = random.randint(0, 1) #午前と午後のどちらかを選ぶ r = random.randint(1, days) #1日から31日の中で選ぶ if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4: #上2つのo,rのところが休みでも希望休でもなければ kiso.loc[i - o][r] = 0 #o,rのところを休みに break return kiso kiso_,holiday,df,ad,day,days = read_excel() kiso_ = gene(kiso_,holiday,day,days)
回答1件
あなたの回答
tips
プレビュー