Im working on my Mac and I just fixed the script. Then I wanted to make an edit and no nothing seem to work anymore.
I get the error message; Traceback (most recent call last): File “lu.py”, line 1, in import cplex ModuleNotFoundError: No module named ‘cplex’
import cplex
import csv
members =
obj_vars =
verbose = False
column_numbers = {
‘member_name’: 0,
‘not_possible_days’: 6,
‘preferred_people’: 2,
‘gender’: 4,
‘preferred_days’ : 3,
}
no_of_groups = 5
min_members = 10
max_members = 20
min_guys_per_group = 2
verenigingen = [
[‘Aug’, 0, 4, 0, 3, 0],
[‘Quint’, 1, 3, 4, 0, 0],
[‘Catena’, 3, 1, 2, 1, 1]
]
with open(‘lu.csv’, ‘r’) as lu_file:
csv_reader = csv.reader(lu_file, delimiter=’;’)
for row in csv_reader:
name = row[column_numbers[‘member_name’]].replace(" ", “_”).lower()
member = [name, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
if row[column_numbers['not_possible_days']] != 'None (I am pretty flexible !!)':
if "Monday" in row[column_numbers['not_possible_days']]:
member[1] = 0
if "Tuesday" in row[column_numbers['not_possible_days']]:
member[2] = 0
if "Wednesday" in row[column_numbers['not_possible_days']]:
member[3] = 0
if "Thursday" in row[column_numbers['not_possible_days']]:
member[4] = 0
if "Friday" in row[column_numbers['not_possible_days']]:
member[5] = 0
if 'Monday' in row[column_numbers['preferred_days']]:
member[6] = 1
if 'Tuesday' in row[column_numbers['preferred_days']]:
member[7] = 1
if 'Wednesday' in row[column_numbers['preferred_days']]:
member[8] = 1
if 'Thursday' in row[column_numbers['preferred_days']]:
member[9] = 1
if 'Friday' in row[column_numbers['preferred_days']]:
member[10] = 1
member.append(row[column_numbers['preferred_people']])
if row[column_numbers['gender']] == 'Male':
member.append(1)
else:
member.append(0)
members.append(member)
Get people together
for member in members:
preferred_friends_str = member[11]
preferred_friends_correct =
if preferred_friends_str:
preferred_friends = preferred_friends_str.split(',')
for preferred_friend in preferred_friends:
proper_name = preferred_friend.strip().lower().replace(' ', '_')
proper_friend = []
for other_member in members:
if proper_name in other_member[0]:
proper_friend.append(other_member[0])
if len(proper_friend) == 0:
print(f"Could not find {proper_name} for {member[0]}")
else:
if len(proper_friend) > 1:
print(f"Found {proper_friend} for {member[0]}, requested for {proper_name}, choosing {proper_friend[0]}")
preferred_friends_correct.append(proper_friend[0])
member[11] = preferred_friends_correct
print("")
if verbose:
for member in members:
print(member)
print("")
Create an instance of a linear problem to solve
problem = cplex.Cplex()
We want to find a maximum of our objective function
problem.objective.set_sense(problem.objective.sense.maximize)
constraints =
rhs =
var_names =
cns_type =
Define membership constraint:
group_cns = [ for _ in range(no_of_groups)]
groups_coef = [[1] * len(members) for _ in range(no_of_groups)]
for member in members:
member_cns_vars =
member_cns_coef = [1] * no_of_groups
for group in range(no_of_groups):
cns_var = f'{member[0]}_{group}'
var_names.append(cns_var)
member_cns_vars.append(cns_var)
group_cns[group].append(cns_var)
# Add all group constraints for every member
constraints.append([member_cns_vars, member_cns_coef])
rhs.append(1)
cns_type.append("E")
Add all member constraints for every group
for cns, coef in zip(group_cns, groups_coef):
constraints.append([cns, coef])
rhs.append(min_members)
cns_type.append(“G”)
constraints.append([cns, coef])
rhs.append(max_members)
cns_type.append("L")
All groups have at least 2 days they all can
for group in range(no_of_groups):
group_days_vars =
group_days_coef = [1]*7
for day in range(5):
cns_var = f'group{group}_D{day}'
var_names.append(cns_var)
group_days_vars.append(cns_var)
constraints.append([group_days_vars, group_days_coef])
rhs.append(2)
cns_type.append('E')
Constrain people to groups
for member in members:
for group in range(no_of_groups):
cns_vars = [f’group{group}D{day}’ for day in range(5)] + [f’{member[0]}{group}’]
cns_coef = member[1:6] + [-1000]
constraints.append([cns_vars, cns_coef])
rhs.append(-(1000-2))
cns_type.append('G')
All Groups go to all Verenigingen once
for group in range(no_of_groups):
for vereniging in verenigingen:
cns_vars =
cns_coef = [1] * 5
for day in range(5):
cns_var = f’group{group}D{day}{vereniging[0]}’
var_names.append(cns_var)
cns_vars.append(cns_var)
# Only group to vereniging on day X if group can on day X
constraints.append([[f'group{group}_D{day}', cns_var], [1, -1]])
rhs.append(0)
cns_type.append('G')
constraints.append([cns_vars, cns_coef])
rhs.append(1)
cns_type.append('E')
Verenigingen have limited capacity
for vereniging in verenigingen:
for day in range(5):
cns_vars = [f’group{group}D{day}{vereniging[0]}’ for group in range(no_of_groups)]
cns_coef = [1] * no_of_groups
constraints.append([cns_vars, cns_coef])
rhs.append(vereniging[day+1])
cns_type.append('L')
Set value of Member_NDX if of interest
Member_G0 + G0_D0 - Member_ND0 <= 1
for member in members:
for prefered_day, preferred in enumerate(member[6:11]):
if not preferred:
pref_var = f’{member[0]}ND{prefered_day}’
var_names.append(pref_var)
for group in range(no_of_groups):
cns_vars = [f’{member[0]}{group}’, f’group{group}_D{prefered_day}’, pref_var]
cns_coef = [1, 1, -1]
constraints.append([cns_vars, cns_coef])
rhs.append(1)
cns_type.append('L')
Make people preferred together
Member_G0 + Preferred_Friend_G0 - 2 Member_G0_Preferred_Friend_G0 >= 0
for member in members:
if member[11]:
for preferred_friend in member[11]:
for group in range(no_of_groups):
cns_vars = [f’{member[0]}{group}’, f’{preferred_friend}{group}’, f’{member[0]}{group}{preferred_friend}{group}’]
cns_coef = [1, 1, -2]
var_names.append(f’{member[0]}{group}{preferred_friend}{group}’)
obj_vars.append(f’{member[0]}{group}{preferred_friend}_{group}’)
constraints.append([cns_vars, cns_coef])
rhs.append(0)
cns_type.append('G')
Ensure at least min_guys_per_group
for group in range(no_of_groups):
cns_vars =
cns_coef =
for member in members:
cns_vars.append(f’{member[0]}_{group}’)
cns_coef.append(member[12])
constraints.append([cns_vars, cns_coef])
rhs.append(min_guys_per_group)
cns_type.append('G')
if verbose:
for i in range(len(constraints)):
print(constraints[i], cns_type[i], rhs[i])
print("")
obj =
Generate obj
for var_name in var_names:
if “_ND” in var_name:
obj.append(-10)
elif var_name in obj_vars:
obj.append(50)
else:
obj.append(0)
low = [0] * len(var_names)
upp = [1] * len(var_names)
problem.variables.add(obj=obj,
lb=low,
ub=upp,
names=var_names,
types=problem.variables.type.integer * len(obj))
problem.linear_constraints.add(lin_expr=constraints,
senses=cns_type,
rhs=rhs)
problem.solve()
solution = [round(i) for i in problem.solution.get_values()]
solution_space = {}
for i, j in zip(solution, var_names):
if verbose:
print(i, j)
solution_space[j] = i
groups = [ for _ in range(no_of_groups)]
start = 0
for i, member in enumerate(members):
for j in range(no_of_groups):
if solution[start + j]:
extra_str = “”
if sum(member[1:6]) == 5:
extra_str = “*”
groups[j].append(member[0] + extra_str)
break
start += no_of_groups
for i, group in enumerate(groups):
print(f"Group {i+1}:")
for key, value in solution_space.items():
if f’group{i}’ in key and value:
if key[-2:] == ‘D0’:
print(“Monday”)
if key[-2:] == ‘D1’:
print(“Tuesday”)
if key[-2:] == ‘D2’:
print(“Wednesday”)
if key[-2:] == ‘D3’:
print(“Thursday”)
if key[-2:] == ‘D4’:
print(“Friday”)
print("==========")
for member in group:
print(member)
print("")
I did not made the script and my knowledge about python is not much
When I want to start the script I use terminal – cd (file location) pyzton3 lu.py
Anyone who can help me with this problem?