torstai 25. lokakuuta 2012

Ryhmienmuodostus-ohjelmanpätkä

Arvottiin uudet ryhmät ao. Python ohjelmalla. Siinä voi valita
  1. ryhmäkoon, 
  2. yritetäänkö tehdä mahdollisimman tasa-sukupuolisia ryhmiä 
  3. yritetäänkö tehdä osaamisen mielessä mahdollisimman heterogeenisiä ryhmiä.  
Ohjelma vaatii input-tiedoston (jossa ei saa olla ääkkösiå) ja joka on muotoa
Aalto Antti     1      1
Ystad Yrsa      0      0

(2 viimeistä lukua ovat sukupuoli ja osaako vei eikö)

Jos esim haluaa 4 hengen tasasukupuolisia, ja mahd. heterogeenisia ryhmiä sanotaan
./make_random_groups.py mab4.txt 4 True True

#-------OHJELMA ALKAA TASTA--------


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# markus.kaukonen@iki.fi 25.10.2012

"""
Forming student groups for schools in the spirit of Kagan structures.
Each group should have equal amount of boys and girls if second last flag==True
Each group should have good and bad students (by grade) if the last flag == True

The sex equality preceeds the heterogenity of a group.

USAGE:

./make_random_groups.py namefile.txt groupsize boys/girls Hetero
./make_random_groups.py mab4.txt 4 True True

In the text file
first column name
second column name
third column: 1=boy, 0=girl,
fourth column: 1=good previous marks, 0=bad previous marks
"""

import sys, random
import numpy as np

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.collections import PatchCollection
import matplotlib.path as mpath
import matplotlib.patches as mpatches
import matplotlib.lines as mlines

max_trial = 1000

#read lines
infile=open(sys.argv[1],'r')
initlines=infile.readlines()
infile.close()
lines = []
# Get rid of empty lines
for line in initlines:
    # Strip whitespace, should leave nothing if empty line was just "\n"
    if not line.strip():
        continue
    # We got something, save it
    else:
        lines.append(line)

group_size = int(sys.argv[2])

if eval(sys.argv[3]):
    sex=[]
    for line in lines:
        sex.append(int(line.split()[2]))
sexnp = np.array(sex)

bestsex = sum(sexnp)/float(len(sex))
#how many sexually even groups one can make
boys=sum(sexnp)
girls=len(lines)-boys
n_of_groups = len(lines)/group_size
print "boys, girls, min(boys,girls)",boys, girls, min(boys,girls)
max_ok_sex_groups=min(boys,girls)/2
print "n_of_groups, max_ok_sex_groups", n_of_groups, max_ok_sex_groups

a=np.array(lines)
data=a.ravel()
ok_sex_groups = 0
#trying to make even-sex groups
while not(ok_sex_groups == max_ok_sex_groups):
    indexes=np.random.permutation(data.size)
    ok_sex_groups = 0
    j=0
    sum_sex = 0
    for i in indexes:
        j=j+1
        sum_sex = sum_sex + int(lines[i].split()[2])
        if j==group_size:
            if sum_sex == group_size/2:
                ok_sex_groups = ok_sex_groups + 1
            j=0
            sum_sex = 0

#trying to make heterogeneous (by grade) groups
print "sys.argv[4]:", sys.argv[4]
if eval(sys.argv[4]):
    grade=[]
    for i in indexes:
        grade.append(int(lines[i].split()[3]))
    for i in indexes[0:4]:
        print lines[i],
    gradenp = np.array(grade)
    group_grade_sum=gradenp.copy()
    for igra in range(0,len(grade),group_size):
        group_grade_sum[igra:igra+group_size]=\
            abs(group_size/2 - sum(gradenp[igra:igra+group_size]))
    #swapping pairs if it makes groups more heterogeneous
    #also, sex must be conserved
    trial = 0
    while trial < max_trial:
        trial = trial + 1
        while True:
            i1=random.randint(0,len(grade)-1)
            i2=random.randint(0,len(grade)-1)
            if sex[indexes[i1]]==sex[indexes[i2]]:
                break
        trial_gradenp = gradenp.copy()
        tmp=trial_gradenp[i1]
        trial_gradenp[i1] = trial_gradenp[i2]
        trial_gradenp[i2] = tmp
        new_group_grade_sum=group_grade_sum.copy()
        for igra in range(0,len(grade),group_size):
            new_group_grade_sum[igra:igra+group_size]=\
                abs(group_size/2 - sum(trial_gradenp[igra:igra+group_size]))
        if (sum(new_group_grade_sum) < sum(group_grade_sum)):
            group_grade_sum=new_group_grade_sum.copy()
            gradenp = trial_gradenp.copy()

            tmp=indexes[i1]
            indexes[i1]=indexes[i2]
            indexes[i2]=tmp
j=0
for i in indexes:
    line=lines[i]
    print line,
    j=j+1
    if j==group_size:
        print "------------------------------------"
        j=0

font = "sans-serif"
fig = plt.figure(figsize=(5,5))
ax = plt.axes([0,0,1,1])

# create 3x3 grid to plot the artists
pos = np.mgrid[0.2:0.8:3j, 0.2:0.8:3j].reshape(2, -1)

j=0
box=0

for i in indexes:
    line=lines[i]
    mystring = line.split()[1]+' '+line.split()[0][0]+'.'
    plt.text(-0.1+pos[0,box], pos[1,box]-0.15+0.05*j, mystring,
        family=font, size=10)
    j=j+1
    if j==group_size:
        box=box+1
        j=0

plt.show()

Ei kommentteja:

Lähetä kommentti