コード例 #1
0
def solveSchedule():
    # Parse the data in a way that seems easy at 2am
    profTimes = dict(map( lambda x: (x[0], x[1:]),
                        map( lambda x:
                            map(str, x.replace('"','').strip().split(",")),
                                open(sys.argv[1]).readlines())))
    students = dict(map(lambda z: (z[0], z[1:]),
                        map( lambda y: filter(lambda x: len(x) > 0, y),
                                map(lambda x: x.strip().split(","),
                                    open(sys.argv[2]).readlines()))))

    model = Model()

    # Set up the professors as lists of variables
    profResources = {}
    for prof in visit_day_scheduler.PROFESSORS:
        profResources[prof] = [Variable(i, i)
                                    for i in range(len(profTimes[prof]))
                                    if profTimes[prof][i].find('NO') == 0]

    # Now add meetings
    studentMeetings = {}
    obj = []
    for s in visit_day_scheduler.VISITORS:
      # 4 is a magic number which seems to make things SAT so mistral stays happy
      studentMeetings[s] = [Variable(0, 4*visit_day_scheduler.NUM_SLOTS) for i in students[s]]
      for i in range(len(students[s])):
          if profResources.has_key(students[s][i]):
              profResources[ students[s][i] ].append(studentMeetings[s][i])
      if len(studentMeetings[s]) > 1: model.add(AllDiff(studentMeetings[s]))
      
      # try to put meetings in actual slots, not fake ones
      obj_test = [i > visit_day_scheduler.NUM_SLOTS - 1 for i in studentMeetings[s]]
      obj.extend(obj_test)

    model.add([AllDiff(x) for x in profResources.values() if len(x) > 1])

    model.add(Minimize(Sum(obj)))

    solver = Solver(model)
    solver.setVerbosity(2)
    solver.setTimeLimit(10)

    if solver.solve() or True:
        outfile = open("out.csv", "wb")
        outwriter = csv.writer(outfile)
        outwriter.writerow(header) 
        for s in visit_day_scheduler.VISITORS:
            outRow = [s] + ["" for i in range(visit_day_scheduler.NUM_SLOTS)]
            for i in range(len(studentMeetings[s])):
                if profResources.has_key(students[s][i]):
                    meeting = int(str(studentMeetings[s][i]))
                    if meeting < visit_day_scheduler.NUM_SLOTS: # only output real meetings
                      outRow[meeting + 1] = str(students[s][i])
            outwriter.writerow(outRow)
コード例 #2
0
def main():
  faculty_var_arrays = [get_prof(VISITORS) for prof in PROFESSORS]
  model = Model()
  model.add(get_visitor_consistency_constraints(faculty_var_arrays))
  model.add(get_no_repeat_constraints(faculty_var_arrays))

  # read faculty availability information
  busyfile = open(sys.argv[2], 'rb')
  busyreader = csv.reader(busyfile)
  for r in busyreader:
    if r[0] in PROFESSORS:
      prof_index = PROFESSORS.index(r[0])
      for i in range(1,NUM_SLOTS + 1): 
        if r[i] == "NO":
          model.add(get_busy_constraint(i-1, prof_index, faculty_var_arrays))
    else:
      print "professor not found in list"
  busyfile.close()

  requestfile = open(sys.argv[1], 'rb')
  reader = csv.reader(requestfile)
  for r in reader:
    row = [name for name in r if not (name == "," or name == "" or name == " ")]
    if row[0] in VISITORS:
      for i in range(1,len(row)):
        if not (row[i] in PROFESSORS):
          print "professor name mismatch: " + str(row[i])
        else:
          model.add(get_meeting_constraint(VISITORS.index(row[0]), PROFESSORS.index(row[i]), faculty_var_arrays))
    elif row[0] in PROFESSORS:
      for i in range(1,len(row)):
        if not (row[i] in VISITORS):
          print "visitor name mismatch in row " + str(row)
        else:
          model.add(get_meeting_constraint(VISITORS.index(row[i]), PROFESSORS.index(row[0]), faculty_var_arrays))
    else:
      print "requestor name mismatch in row " + str(row)

  solver = Solver(model, [p[s] for p in faculty_var_arrays for s in range(NUM_SLOTS)])
  solver.setVerbosity(2)
  solver.solve()
  # print(solver.solveAndRestart())
  print "PROFESSOR SCHEDULES"
  print "-------------------"
  for i in range(len(PROFESSORS)):
    print "---------------"
    print "schedule for " + PROFESSORS[i]
    for slot in faculty_var_arrays[i]:
      if slot.get_value():
        print VISITORS[slot.get_value()]

  # print(solver)
  requestfile.close()