import random
from openpyxl import Workbook
from openpyxl.styles import Alignment
# Veriler
ogretmenler = ["Öğretmen1", "Öğretmen2", "Öğretmen3", "Öğretmen4", "Öğretmen5", "Öğretmen6", "Öğretmen7", "Öğretmen8", "Öğretmen9", "Öğretmen10"]
dersler = ["Matematik", "Seçmeli Müzik", "Sosyal Bilgiler", "Türkçe", "Fen Bilgisi", "Beden Eğitimi", "Din Kültürü ve Ahlak Bilgisi", "İngilizce", "Müzik", "Seçmeli Matematik", "Bilişim Teknolojileri ve Yazılım", "Görsel Sanatlar", "Seçmeli Spor Faaliyetleri"]
gunler = ["Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma"]
saatler = 7
siniflar = ["Sınıf1", "Sınıf2", "Sınıf3"]
siniflar = {sinif: idx for idx, sinif in enumerate(siniflar)}
siniflar_liste = list(siniflar.keys())
ogretmen_ders_sinif = {
"Sınıf1": {
"Öğretmen1": {"Matematik": (5, [2, 2, 1]), "Seçmeli Matematik": (2, [2])},
"Öğretmen2": {"Sosyal Bilgiler": (3, [2, 1])},
"Öğretmen3": {"Fen Bilgisi": (4, [2, 2])},
"Öğretmen4": {"Türkçe": (6, [2, 2, 2])},
"Öğretmen5": {"İngilizce": (3, [2, 1])},
"Öğretmen6": {"Beden Eğitimi": (2, [2]), "Seçmeli Spor Faaliyetleri": (2, [2])},
"Öğretmen7": {"Din Kültürü ve Ahlak Bilgisi": (2, [2])},
"Öğretmen8": {"Bilişim Teknolojileri ve Yazılım": (2, [2])},
"Öğretmen9": {"Müzik": (1, [1]), "Seçmeli Müzik": (2, [2])},
"Öğretmen10": {"Görsel Sanatlar": (1, [1])}
},
"Sınıf3": {
"Öğretmen1": {"Matematik": (5, [2, 2, 1]), "Seçmeli Matematik": (2, [2])},
"Öğretmen2": {"Sosyal Bilgiler": (3, [2, 1])},
"Öğretmen3": {"Fen Bilgisi": (4, [2, 2])},
"Öğretmen4": {"Türkçe": (6, [2, 2, 2])},
"Öğretmen5": {"İngilizce": (3, [2, 1])},
"Öğretmen6": {"Beden Eğitimi": (2, [2]), "Seçmeli Spor Faaliyetleri": (2, [2])},
"Öğretmen7": {"Din Kültürü ve Ahlak Bilgisi": (2, [2])},
"Öğretmen8": {"Bilişim Teknolojileri ve Yazılım": (2, [2])},
"Öğretmen9": {"Müzik": (1, [1]), "Seçmeli Müzik": (2, [2])},
"Öğretmen10": {"Görsel Sanatlar": (1, [1])}
},
"Sınıf2": {
"Öğretmen1": {"Matematik": (5, [2, 2, 1]), "Seçmeli Matematik": (2, [2])},
"Öğretmen2": {"Sosyal Bilgiler": (3, [2, 1])},
"Öğretmen3": {"Fen Bilgisi": (4, [2, 2])},
"Öğretmen4": {"Türkçe": (6, [2, 2, 2])},
"Öğretmen5": {"İngilizce": (3, [2, 1])},
"Öğretmen6": {"Beden Eğitimi": (2, [2]), "Seçmeli Spor Faaliyetleri": (2, [2])},
"Öğretmen7": {"Din Kültürü ve Ahlak Bilgisi": (2, [2])},
"Öğretmen8": {"Bilişim Teknolojileri ve Yazılım": (2, [2])},
"Öğretmen9": {"Müzik": (1, [1]), "Seçmeli Müzik": (2, [2])},
"Öğretmen10": {"Görsel Sanatlar": (1, [1])}
}
}
# Ders programı matrisi
program = [[[None for _ in range(saatler)] for _ in range(len(gunler))] for _ in range(len(siniflar))]
# Aktiviteleri sırala
aktiviteler = []
for sinif, ogretmenler in ogretmen_ders_sinif.items():
for ogretmen, dersler in ogretmenler.items():
for ders, detaylar in dersler.items():
ders_sayisi, bloklar = detaylar
for blok in bloklar:
aktiviteler.append((ogretmen, ders, sinif, blok))
random.shuffle(aktiviteler) # Zorluğa göre sıralanabilir
aktiviteler.sort(key=lambda x: x[3], reverse=True)
def ogretmen_cakisiyor_mu(ogretmen, gun, saat, blok_uzunlugu):
for sinif in range(len(siniflar)):
for blok in range(blok_uzunlugu):
if program[sinif][gun][saat + blok] is not None and program[sinif][gun][saat + blok][0] == ogretmen:
return True
return False
def yerlestir(aktivite, max_deneme=50000):
for _ in range(max_deneme):
gun = random.randint(0, len(gunler) - 1)
# Her blok dersi için alan ayır, eğer alan yoksa yeni bir deneme başlat
for saat in range(saatler - aktivite[3] + 1):
conflict = False
# Eğer blok için yeterli alan var mı diye kontrol et
for i in range(aktivite[3]):
if program[siniflar[aktivite[2]]][gun][saat + i]:
conflict = True
break
# Eğer öğretmen aynı saatte başka bir sınıfta ders veriyorsa çakışma vardır
elif ogretmen_cakisiyor_mu(aktivite[0], gun, saat + i, 1):
conflict = True
break
if not conflict: # Eğer çakışma yoksa dersi yerleştir
for i in range(aktivite[3]):
program[siniflar[aktivite[2]]][gun][saat + i] = (aktivite[0], aktivite[1]) # Öğretmen ve ders adını yerleştir
return True
return False
yerlestiremeyenler = []
for aktivite in aktiviteler:
if not yerlestir(aktivite):
yerlestiremeyenler.append(aktivite)
for aktivite in yerlestiremeyenler:
for _ in range(aktivite[3]):
if not yerlestir((aktivite[0], aktivite[1], aktivite[2], 1)):
print(f"Yerleştirilemeyen aktivite: {aktivite}")
# Sınıflara göre ders programı
sinif_workbook = Workbook()
for sinif in siniflar_liste:
sheet = sinif_workbook.create_sheet(title=sinif)
# Başlık satırını yazma
sheet["A1"] = "Saatler / Günler"
for gun in range(len(gunler)):
sheet.cell(row=1, column=gun + 2, value=gunler[gun])
# Ders programını yazma
for saat in range(saatler):
sheet.cell(row=saat + 2, column=1, value=f"Saat {saat + 1}")
for gun in range(len(gunler)):
ders = program[siniflar[sinif]][gun][saat]
if ders:
sheet.cell(row=saat + 2, column=gun + 2, value=f"{ders[0]} - {ders[1]}")
else:
sheet.cell(row=saat + 2, column=gun + 2, value="Boş")
# Hücre boyutlarını otomatik ayarlama
for column_cells in sheet.columns:
max_length = 0
for cell in column_cells:
if cell.value:
cell.alignment = Alignment(wrap_text=True)
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
adjusted_width = (max_length + 2) * 1.2
sheet.column_dimensions[column_cells[0].column_letter].width = adjusted_width
# Varsayılan sayfayı silme
sinif_workbook.remove(sinif_workbook.active)
# Sınıf ders programını kaydetme
sinif_workbook.save("sinif_ders_programi.xlsx")
# Öğretmenlere göre ders programı
ogretmen_workbook = Workbook()
for ogretmen in ogretmenler:
sheet = ogretmen_workbook.create_sheet(title=ogretmen)
# Başlık satırını yazma
sheet["A1"] = "Saatler / Günler"
for gun in range(len(gunler)):
sheet.cell(row=1, column=gun + 2, value=gunler[gun])
# Ders programını yazma
for saat in range(saatler):
sheet.cell(row=saat + 2, column=1, value=f"Saat {saat + 1}")
for gun in range(len(gunler)):
dersler_listesi = []
for sinif in siniflar_liste:
ders = program[siniflar[sinif]][gun][saat]
if ders and ders[0] == ogretmen:
dersler_listesi.append(ders[1])
dersler_str = "\n".join(dersler_listesi)
if dersler_str:
sheet.cell(row=saat + 2, column=gun + 2, value=dersler_str)
else:
sheet.cell(row=saat + 2, column=gun + 2, value="Boş")
# Hücre boyutlarını otomatik ayarlama
for column_cells in sheet.columns:
max_length = 0
for cell in column_cells:
if cell.value:
cell.alignment = Alignment(wrap_text=True)
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
adjusted_width = (max_length + 2) * 1.2
sheet.column_dimensions[column_cells[0].column_letter].width = adjusted_width
# Varsayılan sayfayı silme
ogretmen_workbook.remove(ogretmen_workbook.active)
# Öğretmen ders programını kaydetme
ogretmen_workbook.save("ogretmen_ders_programi.xlsx")
hocam yukarıdaki kodlar üzerinde bir incele istersen . blok yapısıda var. ders dagıtım optimisazyonu dediğimiz olay cok zor imiş bende araştırmalarım sonucu öğrendim.
kısıtlamalar mevcut blocklar mevcut. belki işine yarar eger ekleme yapmak istersen yada masa üstü yani görsel arayüz mevzusuna girmek istersen iletişime geçersen sevinirim veri yapısı içinde db modelisazyonu farklı bir uzmanlık alanı