Beispiel #1
0
    def selection(self, best_selection=True, destruction=False):
        individual_indices = np.random.choice(range(len(self.population)),
                                              size=4,
                                              replace=False)
        fitness_values = [
            self.population[ind].score for ind in individual_indices
        ]

        if best_selection:
            worst1 = individual_indices[fitness_values.index(
                max(fitness_values[0], fitness_values[1]))]
            worst2 = individual_indices[fitness_values.index(
                max(fitness_values[2], fitness_values[3]))]

            if destruction and (len(
                    np.where(
                        (self.population[worst1].schedule -
                         self.population[worst2].schedule) == 0)[0]) / float(
                             self.population[worst1].schedule.size)) > 0.75:
                self.population[worst1] = Timetable(self.data,
                                                    self.compactness_ini)
                self.population[worst2] = Timetable(self.data,
                                                    self.compactness_ini)

            return (individual_indices[fitness_values.index(
                min(fitness_values[0], fitness_values[1]))],
                    individual_indices[fitness_values.index(
                        min(fitness_values[2], fitness_values[3]))])
        else:
            return (individual_indices[fitness_values.index(
                max(fitness_values[0], fitness_values[1]))],
                    individual_indices[fitness_values.index(
                        max(fitness_values[2], fitness_values[3]))])
        def set_changes():
            def get_day_specialized(day):
                if len(day) == 0:
                    return -1
                day = day[0].upper() + day[1:-1].lower()
                for i in range(len(config.day_names)):
                    if config.day_names[i][:-1] == day:
                        return i
                return 7

            def set_changes_sub(lesson_ch, cl_ind):
                if cl_ind == -1:
                    return
                tt_t.changes.has_changes[cl_ind] = True
                tmp = [sub_ch[:sub_ch.find("</p>")] for sub_ch in lesson_ch.split("<p>") if len(sub_ch) >= 2]
                tt_t.changes.changes.append(TClasses.Changes.ChangesCell(cl_ind, tmp))
                tt_t.changes.ch_ind[cl_ind] = len(tt_t.changes.changes) - 1

            changes_raw = get_changes_raw()
            tt_t.changes = TClasses.Changes(len(tt_t.classes))
            temp = changes_raw[changes_raw.find("НА ") + len("НА "):]
            tt_t.changes.change_day = get_day_specialized(temp[:temp.find(' ') - 1])
            changes_raw = changes_raw[changes_raw.find("</h3>") + len("</h3>"):].replace("&nbsp;&mdash;", "-")
            for les_ch in [s for s in changes_raw.split("<h6>") if len(s) != 0]:
                if "</h6>" in les_ch:
                    set_changes_sub(les_ch[les_ch.find("<p>"):],
                                    Timetable.bin_search_crutch(tt_t.classes, les_ch[:les_ch.index('</h6>')]))
                else:
                    print("Error occupied while setting changes:", les_ch)
Beispiel #3
0
def random_timetable(teachers, audiences, subjects, specialities):
    current_timetable = []
    for speciality in specialities:
        days_in_week = []
        for day in day_of_week:
            lessons_in_day = []
            num_of_lessons = random.choice(range(1, 7))
            for numb in range(num_of_lessons):
                num_of_lesson = random.choice(range(1, 7))
                type_of_lesson = random.choice(l_or_p)
                subject = random.choice(subjects)
                teacher = random.choice(teachers)
                audience = random.choice(audiences)
                if type_of_lesson == 'practice':
                    group = random.choice([1, 2])
                    lesson = Lesson(num_of_lesson, type_of_lesson, subject,
                                    teacher, audience, group)
                else:
                    lesson = Lesson(num_of_lesson, type_of_lesson, subject,
                                    teacher, audience)
                lessons_in_day.append(lesson)
            current_day = Day(day, lessons_in_day)
            days_in_week.append(current_day)
        current_week = Week(speciality, days_in_week)
        current_timetable.append(current_week)
    timetable = Timetable(current_timetable)
    return timetable
 def set_class_lesson_sub(lesson_data, group, cl_ind):
     if ' ' not in lesson_data:
         if lesson_data == "Физкультура":
             room = defaults[0]
         else:
             room = defaults[1]
         subject = lesson_data
     else:
         arr = lesson_data.split(" ")
         room = Timetable.bin_search_crutch(tt_t.rooms, arr[1], False)
         if room == -1:
             room = defaults[2]
         subject = arr[0]
     return TClasses.TTDay.TTLesson.TTLClass.TTCell(cl_ind, room, defaults[3], subject, group)
Beispiel #5
0
    def __init__(self, *args, **kwargs):
        super().__init__(task_each_event=True, *args, **kwargs)
        config_path = "timetable_config.json"

        assert os.path.exists(
            config_path), f"Config file {config_path} not found."
        with open(config_path, "r") as timetable_file:
            timetables_json = json.load(timetable_file)
            self._admins = timetables_json["admins"]
            self._timetables = {
                timetable.pop("peer_id"): Timetable(timetable)
                for timetable in timetables_json["timetables"]
            }
            self._timetable_work_flg = False
def t_update(timetable, full=True, fast=False):
    try:
        tt_t = Timetable(True)

        def get_token():
            m_token = IO.InternetIO.get("http://lyceum.urfu.ru/n/?p=tmtbl", fast=fast)
            if m_token is None:
                raise Exception("No internet connection")
            m_token = m_token[m_token.find("<script>var tmToken=\"") + len("<script>var tmToken=\""):]
            return m_token[:m_token.find("\"</script>")]

        token = get_token()

        def set_base():
            def extract_by_str(string, sort_by_ind=False):
                ans = []
                a = string.split("</option>")[:-1]
                for ss in a:
                    d_i = ss[ss.find("value='") + len("value='"):]
                    ans.append(TClass(d_i[: d_i.find("'")], ss[ss.rfind(">") + 1:], sort_by_ind))
                ans.sort()
                return ans

            page = IO.InternetIO.get("http://lyceum.urfu.ru/n/?p=tmtbl", fast=fast)
            if page is None:
                raise Exception("No internet connection")
            arr = page[page.find("<div class=\"tmtbl\""): page.find("<script>var tmToken=")].split("tmtbl")

            tt_t.classes = extract_by_str(arr[3])
            tt_t.teachers = extract_by_str(arr[4])
            tt_t.rooms = extract_by_str(arr[5])
            tt_t.rooms += [TClass('F', "Каф. ин. яз"), TClass('Hz', 'ACCESS DENIED')]
            tt_t.rooms.sort()
            tt_t.days = extract_by_str(arr[6], True)

            tt_t.set_tt_base(len(tt_t.classes))

        set_base()
        defaults = [Timetable.bin_search_crutch(tt_t.rooms, 'S', False),
                    Timetable.bin_search_crutch(tt_t.rooms, 'F', False),
                    Timetable.bin_search_crutch(tt_t.rooms, 'Hz', False),
                    Timetable.bin_search_crutch(tt_t.teachers, "Сотрудник И. С.")]

        def set_class(class_ind, day_ind):
            def set_class_lesson(class_ind_int, d_ind, les_data):
                def set_class_lesson_sub(lesson_data, group, cl_ind):
                    if ' ' not in lesson_data:
                        if lesson_data == "Физкультура":
                            room = defaults[0]
                        else:
                            room = defaults[1]
                        subject = lesson_data
                    else:
                        arr = lesson_data.split(" ")
                        room = Timetable.bin_search_crutch(tt_t.rooms, arr[1], False)
                        if room == -1:
                            room = defaults[2]
                        subject = arr[0]
                    return TClasses.TTDay.TTLesson.TTLClass.TTCell(cl_ind, room, defaults[3], subject, group)

                if les_data.rfind("<td>") == -1:
                    return
                les_num = int(les_data[len("<td>"):len("<td>") + 1]) - 1
                if les_data.find("width") == -1:
                    temp = set_class_lesson_sub(les_data[les_data.index("<td colspan=2>") + len("<td colspan=2>"):
                                                         les_data.index("</td></tr>")], 0, class_ind_int)
                    tt_t.all[d_ind].day[les_num].lesson[class_ind_int].group.append(temp)
                else:
                    aaa = les_data.split("<td width=47%>")[1:]
                    for i in range(len(aaa)):
                        l_data = aaa[i][:aaa[i].index("</td>")]
                        if "&times" not in l_data:
                            temp = set_class_lesson_sub(l_data, i + 1, class_ind_int)
                            tt_t.all[d_ind].day[les_num].lesson[class_ind_int].group.append(temp)

            ans = IO.InternetIO.get(config.base_url + token + "&tmrType=0&tmrClass=" + tt_t.classes[class_ind].ind +
                                    "&tmrTeach=0&tmrRoom=0&tmrDay=" + str(day_ind + 1), fast=fast)
            if ans is None:
                raise Exception("No internet connection")
            if ans == "Err\n":
                raise Exception("update failed", class_ind, day_ind, ans)
            for les in ans[ans.index("<tr>") + len("<tr>"):].split("<tr>"):
                set_class_lesson(class_ind, day_ind, les)

        def set_teacher(teacher_ind):
            def set_teacher_day(day_info, teach_ind):
                def set_teacher_day_sub(l_data, t_ind, d_ind):
                    c = l_data[l_data.rfind("</td>") - 1]
                    if c == ';':
                        return
                    group = int(c) if c.isdecimal() else 0
                    l_data = l_data[:l_data.rfind("<td>") - len("</td>")]
                    if '<td>' not in l_data:
                        return
                    les_num = int(l_data[len("<td>"): len("<td>") + 1]) - 1
                    m_arr = l_data[l_data.find("</td>") + len("</td><td>"):].split("</td><td>")
                    subject = m_arr[0]

                    for cl_ in range(len(tt_t.classes)):
                        if m_arr[1] == tt_t.classes[cl_].name:
                            class_ind = cl_
                            break
                    else:
                        class_ind = -1  # TODO: add binary search

                    group_i = 1 if group == 2 and len(tt_t.all[d_ind].day[les_num].lesson[class_ind].group) != 1 else 0
                    if d_ind < 0 or les_num < 0 or group_i < 0 or d_ind >= len(tt_t.all) or \
                            les_num >= len(tt_t.all[d_ind].day) or \
                            class_ind >= len(tt_t.all[d_ind].day[les_num].lesson) or \
                            group_i >= len(tt_t.all[d_ind].day[les_num].lesson[class_ind].group):
                        # От создателя if'а с 64 условиями в 1 строке
                        print("Хьюстон, у нас проблемы", d_ind, les_num, group_i, t_ind)
                    t_cell = tt_t.all[d_ind].day[les_num].lesson[class_ind].group[group_i]
                    t_cell.teacher_ind = t_ind
                    if subject not in t_cell.subject:
                        t_cell.subject.append(subject)
                    tt_t.all[d_ind].day[les_num].lesson[class_ind].group[group_i] = t_cell

                arr = day_info.split("<tr>")
                day_ind = timetable.bin_search_crutch(tt_t.days, arr[0][:arr[0].find("</h3>")], True)
                for arr_sub in arr[1:]:
                    set_teacher_day_sub(arr_sub, teach_ind, day_ind)

            ans = IO.InternetIO.get(config.base_url + token + "&tmrType=1&tmrClass=&tmrTeach=" +
                                    tt_t.teachers[teacher_ind].ind + "&tmrRoom=0&tmrDay=0", fast=fast)
            if ans is None:
                raise Exception("No internet connection")
            if ans == "Err\n":
                raise Exception("Fail while updating teachers\n", teacher_ind, ans)
            if "Уроков не найдено" in ans:
                return
            ans = ans[ans.index("<h3>") + len("<h3>"): ans.index("<details><summary>")]
            for sub_s in ans.split("<h3>"):
                set_teacher_day(sub_s, teacher_ind)

        def get_changes_raw():
            ans = IO.InternetIO.get(config.base_url + token + "&tmrType=1&tmrClass=&tmrTeach=" + tt_t.teachers[0].ind +
                                    "&tmrRoom=0&tmrDay=0", fast=fast)
            if ans is None:
                raise Exception("No internet connection")
            if ans == "Err\n":
                raise Exception("Fail while updating teachers\n", 0, ans)
            return ans[ans.find("</summary>") + len("</summary>"):]

        def set_changes():
            def get_day_specialized(day):
                if len(day) == 0:
                    return -1
                day = day[0].upper() + day[1:-1].lower()
                for i in range(len(config.day_names)):
                    if config.day_names[i][:-1] == day:
                        return i
                return 7

            def set_changes_sub(lesson_ch, cl_ind):
                if cl_ind == -1:
                    return
                tt_t.changes.has_changes[cl_ind] = True
                tmp = [sub_ch[:sub_ch.find("</p>")] for sub_ch in lesson_ch.split("<p>") if len(sub_ch) >= 2]
                tt_t.changes.changes.append(TClasses.Changes.ChangesCell(cl_ind, tmp))
                tt_t.changes.ch_ind[cl_ind] = len(tt_t.changes.changes) - 1

            changes_raw = get_changes_raw()
            tt_t.changes = TClasses.Changes(len(tt_t.classes))
            temp = changes_raw[changes_raw.find("НА ") + len("НА "):]
            tt_t.changes.change_day = get_day_specialized(temp[:temp.find(' ') - 1])
            changes_raw = changes_raw[changes_raw.find("</h3>") + len("</h3>"):].replace("&nbsp;&mdash;", "-")
            for les_ch in [s for s in changes_raw.split("<h6>") if len(s) != 0]:
                if "</h6>" in les_ch:
                    set_changes_sub(les_ch[les_ch.find("<p>"):],
                                    Timetable.bin_search_crutch(tt_t.classes, les_ch[:les_ch.index('</h6>')]))
                else:
                    print("Error occupied while setting changes:", les_ch)

        if full:
            for cl in range(len(tt_t.classes)):
                for d in range(len(tt_t.days)):
                    set_class(cl, d)
            for t in range(len(tt_t.teachers)):
                set_teacher(t)
            tt_t.free_rooms.set(tt_t)

        set_changes()

        timetable.changes = tt_t.changes
        if full:
            timetable.free_rooms = tt_t.free_rooms
            timetable.all = tt_t.all
            timetable.t_n = [t.name for t in tt_t.teachers]
            timetable.c_n = [c.name for c in tt_t.classes]
            timetable.d_n = [d.name for d in tt_t.days]
            timetable.r_n = [r.name for r in tt_t.rooms]
            timetable.r_i = [r.ind for r in tt_t.rooms]
            timetable.trap = timetable.r_i.index('Hz')
        return True
    except BaseException as e:
        logging.error(e, exc_info=True)
    return False
Beispiel #7
0
    def parse(self, input):

        words = input.lower().split(' ')

        if words[0] == 'help':
            print(self.__doc__)

        elif words[0] == 'exit':
            
            self.memory_handler.save_all_data()
            sys.exit()

        elif words[0] == 'add':

            if words[1] == 'driver':
                
                new_driver = Driver()

                name = self.get_user_input('driver name')
                new_driver.set_name(name)

                surname = self.get_user_input('driver surname')
                new_driver.set_surname(surname)

                self.memory_handler.save_driver(new_driver)

            elif words[1] == 'car':
                
                new_car = Car()

                manufacturer = self.get_user_input('car manufacturer')
                new_car.set_manufacturer(manufacturer)

                model = self.get_user_input('car model')
                new_car.set_model(model)

                color = self.get_user_input('car color')
                new_car.set_color(color)

                plate = self.get_user_input('car license plate')
                new_car.set_plate(plate)

                body = self.get_user_input('car body type', required=False)
                new_car.set_body(body)

                fuel = self.get_user_input('car fuel type', required=False)
                new_car.set_fuel(fuel)

                card = self.get_user_input('car fuel card number', required=False)
                new_car.set_card(card)

                pin = self.get_user_input('car fuel card pin number', required=False)
                new_car.set_pin(pin)

                self.memory_handler.save_car(new_car)

            elif words[1] == 'timetable':
                
                new_timetable = Timetable()

                owner = self.get_user_input('timetable owner')
                owner = owner.split()

                if len(owner) == 2:
                    driver = self.memory_handler.get_driver(owner[0], owner[1])
                else:
                    driver = self.memory_handler.get_driver(owner[0])

                    # TODO: what if there are multiple drivers returned?

                if not driver:
                    print('Could not find driver!')
                    return

                for day in range(7):
                    
                    start_time = self.get_user_input('beginning of shift for day ' + str(day), required=False)
                    
                    if start_time:
                        end_time = self.get_user_input('end of shift')
                        new_timetable.set_preferences(day, (int(start_time), int(end_time)))
                
                driver[0].set_timetable(new_timetable)

        elif words[0] == 'get':

            if words[1] == 'car':
                
                plate = self.get_user_input('car license plate')

                car = self.memory_handler.get_car_by_plate(plate)

                print(car)

            elif words[1] == 'driver':
                
                surname = self.get_user_input('driver surname and name')
                surname = surname.split()

                if len(surname) == 2:
                    driver = self.memory_handler.get_driver(surname[0], surname[1])
                
                else:
                    driver = self.memory_handler.get_driver(surname[0])

                print(driver)

            elif words[1] == 'cars':
                print(self.memory_handler.get_cars())

            elif words[1] == 'drivers':
                print(self.memory_handler.get_drivers())

            elif words[1] == 'solution':
                
                solve(self.memory_handler)
                
                cars = self.memory_handler.get_cars()
                
                for car in cars:
                    print(car.timetable)

        else:
            print('Could not understand input')
  def dlgOKPressed(self):
    # 環境設定画面のOKボタンを押したとき
    self.dlg.setVisible(False)

    layers = self.iface.legendInterface().layers()
    lTimeTable = layers[self.dlg.cmbTimetable.currentIndex()-1]
    lTransit = layers[self.dlg.cmbTransit.currentIndex()-1]
    
    if not lTimeTable.isValid():
      self.myprint ("Layer failed to load!")
      return
    if not lTransit.isValid():
      self.myprint ("Layer failed to load!")
      return
      
    self.timetable = None
    from Timetable import Timetable
    self.timetable = Timetable(self)
    
    from CATDB import CATDB
    self.cat_db = CATDB(self)
    
    # 時刻表の設定
    for f in lTimeTable.getFeatures ():
#      self.myprint("add_timetable %d, %d, %f" % (
#        f[self.dlg.cmbRouteid.currentText()], \
#        f[self.dlg.cmbCat.currentText()], \
#        f[self.dlg.cmbTime.currentText()] ))
      catName = ""
      if self.dlg.cmbCatName.currentIndex() <> 0:
        catName = f[self.dlg.cmbCatName.currentText()]
      routeName = ""
      if self.dlg.cmbRouteName.currentIndex() <> 0:
        routeName = f[self.dlg.cmbRouteName.currentText()]

      ptn = re.compile('(\d+):(\d+)')
      m = ptn.match(f[self.dlg.cmbTime.currentText()])
      if m:
        tmp_time = (float(m.group(1))*60+float(m.group(2))) /1440.0
        # 深夜12時~2時までは24時から26時に変換
        if tmp_time < 0.083333: tmp_time = tmp_time+1
      else:
        QMessageBox.information(None, "DEBUG:", "set time correctly") 

      self.timetable.add_timetable( \
        f[self.dlg.cmbRouteid.currentText()], \
        f[self.dlg.cmbCat.currentText()], \
        tmp_time, \
        routeName)
      self.cat_db.add_cat(f[self.dlg.cmbCat.currentText()], \
        f.geometry().asPoint().x(), \
        f.geometry().asPoint().y(), \
        catName)

    # 乗り換え表の設定
    for f in lTransit.getFeatures ():
      ptn = re.compile('(\d+):(\d+)')
      m = ptn.match(f[self.dlg.cmbTime2.currentText()])
      if m:
        tmp_time = (float(m.group(1))*60+float(m.group(2))) /1440.0
      else:
        QMessageBox.information(None, "DEBUG:", "set time correctly") 

      self.timetable.set_transit( \
        f[self.dlg.cmbFromcat.currentText()], \
        f[self.dlg.cmbTocat.currentText()], \
        tmp_time)

    self.myprint(QCoreApplication.translate('code', "Timetable, Transit table set")+u"\n")
    
    self.i_cmbTimetable   = self.dlg.cmbTimetable.currentIndex()
    self.i_cmbRouteid     = self.dlg.cmbRouteid.currentIndex()
    self.i_cmbCat         = self.dlg.cmbCat.currentIndex()
    self.i_cmbTime        = self.dlg.cmbTime.currentIndex()
    self.i_cmbCatName     = self.dlg.cmbCatName.currentIndex()
    self.i_cmbRouteName   = self.dlg.cmbRouteName.currentIndex()
    self.i_cmbTransit     = self.dlg.cmbTransit.currentIndex()
    self.i_cmbFromcat     = self.dlg.cmbFromcat.currentIndex()
    self.i_cmbTocat       = self.dlg.cmbTocat.currentIndex()
    self.i_cmbTime2       = self.dlg.cmbTime2.currentIndex()
    self.i_cmbOrigin      = self.dlg.cmbOrigin.currentIndex()
    self.i_cmbIdOrig      = self.dlg.cmbIdOrig.currentIndex()
    self.i_cmbDestination = self.dlg.cmbDestination.currentIndex()
    self.i_cmbIdDest      = self.dlg.cmbIdDest.currentIndex()
class PublicTransportFinder:

  def __init__(self, iface):
    self.iface = iface
    
    self.lock = threading.Lock()
    

    self.calc = None
    self.cat_db = None
    self.timetable = None
    self.thread = None
    self.worker = None

  def initGui(self):
    # initialize locale 
    locale = QSettings().value('locale/userLocale')
    if not locale: locale = 'en'
    else: locale = locale[0:2]
    locale_path = os.path.join( 
      os.path.dirname(__file__), 
      'i18n', 
      'PublicTransportFinder_{}.qm'.format(locale)) 
    if os.path.exists(locale_path): 
      self.translator = QTranslator() 
      self.translator.load(locale_path) 
      if qVersion() > '4.3.3': 
        QCoreApplication.installTranslator(self.translator) 

    path = os.path.dirname( os.path.abspath( __file__ ) )
    self.dock = uic.loadUi( os.path.join( path, "Dock.ui" ) )
    self.dlg = uic.loadUi( os.path.join( path, "Dialog.ui" ) )
    self.log = uic.loadUi( os.path.join( path, "Log.ui" ) )
    self.iface.addDockWidget( Qt.LeftDockWidgetArea, self.dock )
    self.clickTool = QgsMapToolEmitPoint(self.iface.mapCanvas()) 

    QObject.connect(self.dock.btnConf,SIGNAL("clicked()"),self.dockConfPressed)
    QObject.connect(self.dlg.btnOK,SIGNAL("clicked()"),self.dlgOKPressed)
    QObject.connect(self.dock.btnCalc,SIGNAL("clicked()"),self.dockCalcPressed)
    QObject.connect(self.dock.btnOrigin,SIGNAL("clicked()"),self.dockOriginClicked)
    QObject.connect(self.dock.btnDestination,SIGNAL("clicked()"),self.dockDestinationClicked)
#    QObject.connect(self.iface.mapCanvas(), SIGNAL('layersChanged()'), self.update_layers)
    QObject.connect(self.dlg.cmbTimetable,SIGNAL("currentIndexChanged(int)"),self.cmbTimetableChanged)
    QObject.connect(self.dlg.cmbTransit,SIGNAL("currentIndexChanged(int)"),self.cmbTransitChanged)
    QObject.connect(self.dlg.cmbOrigin,SIGNAL("currentIndexChanged(int)"),self.cmbOriginChanged)
    QObject.connect(self.dlg.cmbDestination,SIGNAL("currentIndexChanged(int)"),self.cmbDestinationChanged)

    self.i_cmbTimetable   = 0
    self.i_cmbRouteid     = 0
    self.i_cmbCat         = 0
    self.i_cmbTime        = 0
    self.i_cmbCatName     = 0
    self.i_cmbRouteName   = 0
    self.i_cmbTransit     = 0
    self.i_cmbFromcat     = 0
    self.i_cmbTocat       = 0
    self.i_cmbTime2       = 0
    self.i_cmbOrigin      = 0
    self.i_cmbIdOrig      = 0
    self.i_cmbDestination = 0
    self.i_cmbIdDest      = 0


    # add to plugins toolbar
    try:
      self.action = QAction("Toggle visibility", self.iface.mainWindow())
      self.action.triggered.connect(self.toggleDock)
      self.iface.addPluginToMenu("&PublicTransportFinder", self.action)
    except:
      pass  # OK for testing


  def unload(self):
    """unload the plugin"""
    self.iface.removeDockWidget(self.dock)
    self.iface.removePluginMenu("PublicTransportFinder", self.action)

  def toggleDock(self):
    self.dock.setVisible(not self.dock.isVisible())
#    self.update_layers()

  def dockOriginClicked(self):
    QObject.connect(self.clickTool, \
      SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), \
      self.handleMouseDownOrig)
    self.iface.mapCanvas().setMapTool(self.clickTool)

  def dockDestinationClicked(self):
    QObject.connect(self.clickTool, \
      SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), \
      self.handleMouseDownDest)
    self.iface.mapCanvas().setMapTool(self.clickTool)
    
  def handleMouseDownOrig(self, point, button): 
    self.dock.qleOrigin.clear()
    self.dock.qleOrigin.insert( str(point.x()) + "," +str(point.y()) )
    QObject.disconnect(self.clickTool, \
      SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), \
      self.handleMouseDownOrig)
    self.iface.mapCanvas().unsetMapTool(self.clickTool)
  def handleMouseDownDest(self, point, button): 
    self.dock.qleDestination.clear()
    self.dock.qleDestination.insert( str(point.x()) + "," +str(point.y()) )
    QObject.disconnect(self.clickTool, \
      SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), \
      self.handleMouseDownDest)
    self.iface.mapCanvas().unsetMapTool(self.clickTool)

  def dockConfPressed(self):
    self.dlg.setVisible(True)
    self.dlg.raise_()

    self.dlg.cmbTimetable.clear()
    self.dlg.cmbTransit.clear()
    self.dlg.cmbOrigin.clear()
    self.dlg.cmbDestination.clear()

    layers = self.iface.legendInterface().layers()
    layer_list = [QCoreApplication.translate('code', "Select an Item...")]
    for layer in layers:
#      if isinstance(layer, QgsVectorLayer) or \
#         isinstance(layer, QgsRasterLayer):
       layer_list.append(layer.name())
    self.dlg.cmbTimetable.addItems(layer_list)
    self.dlg.cmbTransit.addItems(layer_list)

    layer_list = [QCoreApplication.translate('code', "One by One")]
    for layer in layers: layer_list.append(layer.name())
    self.dlg.cmbOrigin.addItems(layer_list)
    self.dlg.cmbDestination.addItems(layer_list)
    
    if self.i_cmbTimetable == 0 and u"Timetable" in layer_list:
      self.i_cmbTimetable = layer_list.index(u"Timetable")
    if self.i_cmbTransit==0 and u"Transit" in layer_list:
      self.i_cmbTransit=layer_list.index(u"Transit")
    if self.i_cmbOrigin == 0 and u"Origin" in layer_list:
      self.i_cmbOrigin  = layer_list.index(u"Origin")
    if self.i_cmbDestination == 0 and u"Destination" in layer_list:
      self.i_cmbDestination = layer_list.index(u"Destination")
      
    self.dlg.cmbTimetable.setCurrentIndex(self.i_cmbTimetable)
    self.dlg.cmbRouteid.setCurrentIndex(self.i_cmbRouteid)
    self.dlg.cmbCat.setCurrentIndex(self.i_cmbCat)
    self.dlg.cmbTime.setCurrentIndex(self.i_cmbTime)
    self.dlg.cmbCatName.setCurrentIndex(self.i_cmbCatName)
    self.dlg.cmbRouteName.setCurrentIndex(self.i_cmbRouteName)
    self.dlg.cmbTransit.setCurrentIndex(self.i_cmbTransit)
    self.dlg.cmbFromcat.setCurrentIndex(self.i_cmbFromcat)
    self.dlg.cmbTocat.setCurrentIndex(self.i_cmbTocat)
    self.dlg.cmbTime2.setCurrentIndex(self.i_cmbTime2)
    self.dlg.cmbOrigin.setCurrentIndex(self.i_cmbOrigin)
    self.dlg.cmbIdOrig.setCurrentIndex(self.i_cmbIdOrig)
    self.dlg.cmbDestination.setCurrentIndex(self.i_cmbDestination)
    self.dlg.cmbIdDest.setCurrentIndex(self.i_cmbIdDest)


  def cmbTimetableChanged(self):
    if self.dlg.cmbTimetable.currentIndex() == 0:
      return
    layers = self.iface.legendInterface().layers()
    lTimeTable = layers[self.dlg.cmbTimetable.currentIndex()-1]
    
    self.dlg.cmbRouteid.clear()
    self.dlg.cmbCat.clear()
    self.dlg.cmbTime.clear()
    self.dlg.cmbCatName.clear()
    self.dlg.cmbRouteName.clear()
    flist = [QCoreApplication.translate('code', "Select an Item...")]
    for f in lTimeTable.pendingFields():
      flist.append(f.name())
    self.dlg.cmbRouteid.addItems(flist)
    self.dlg.cmbCat.addItems(flist)
    self.dlg.cmbTime.addItems(flist)
    self.dlg.cmbCatName.addItems(flist)
    self.dlg.cmbRouteName.addItems(flist)
    
    if self.i_cmbRouteid == 0 and u"route_id" in flist:
      self.i_cmbRouteid = flist.index(u"route_id")
    if self.i_cmbCat == 0 and u"cat" in flist:
      self.i_cmbCat = flist.index(u"cat")
    if self.i_cmbTime == 0 and u"time" in flist:
      self.i_cmbTime = flist.index(u"time")
    if self.i_cmbCatName == 0 and u"cat_name" in flist:
      self.i_cmbCatName = flist.index(u"cat_name")
    if self.i_cmbRouteName == 0 and u"route_name" in flist:
      self.i_cmbRouteName = flist.index(u"route_name")
    
    
    
  def cmbTransitChanged(self):
    if self.dlg.cmbTransit.currentIndex() == 0:
      return
    layers = self.iface.legendInterface().layers()
    lTransit = layers[self.dlg.cmbTransit.currentIndex()-1]
    
    self.dlg.cmbFromcat.clear()
    self.dlg.cmbTocat.clear()
    self.dlg.cmbTime2.clear()
    flist = [QCoreApplication.translate('code', "Select an Item...")]
    for f in lTransit.pendingFields():
      flist.append(f.name())
    self.dlg.cmbFromcat.addItems(flist)
    self.dlg.cmbTocat.addItems(flist)
    self.dlg.cmbTime2.addItems(flist)
    
    if self.i_cmbFromcat == 0 and u"from_cat" in flist:
      self.i_cmbFromcat = flist.index(u"from_cat")
    if self.i_cmbTocat == 0 and u"to_cat" in flist:
      self.i_cmbTocat = flist.index(u"to_cat")
    if self.i_cmbTime2 == 0 and u"time" in flist:
      self.i_cmbTime2 = flist.index(u"time")
    
    
  def cmbOriginChanged(self):
    if self.dlg.cmbOrigin.currentIndex() == 0:
      self.dlg.cmbIdOrig.clear()
      return

    layers = self.iface.legendInterface().layers()
    lOrigin = layers[self.dlg.cmbOrigin.currentIndex()-1]
    
    self.dlg.cmbIdOrig.clear()
    flist = [QCoreApplication.translate('code', "Select an Item...")]
    if lOrigin <> None:
      for f in lOrigin.pendingFields():
        flist.append(f.name())
    self.dlg.cmbIdOrig.addItems(flist)
    
    if self.i_cmbIdOrig == 0 and u"id" in flist:
      self.i_cmbIdOrig = flist.index(u"id")

  def cmbDestinationChanged(self):
    if self.dlg.cmbDestination.currentIndex() == 0:
      self.dlg.cmbIdDest.clear()
      return
    layers = self.iface.legendInterface().layers()
    lDestination = layers[self.dlg.cmbDestination.currentIndex()-1]
    
    self.dlg.cmbIdDest.clear()
    flist = [QCoreApplication.translate('code', "Select an Item...")]
    for f in lDestination.pendingFields():
      flist.append(f.name())
    self.dlg.cmbIdDest.addItems(flist)
    
    if self.i_cmbIdDest == 0 and u"id" in flist:
      self.i_cmbIdDest = flist.index(u"id")
    
  def dlgOKPressed(self):
    # 環境設定画面のOKボタンを押したとき
    self.dlg.setVisible(False)

    layers = self.iface.legendInterface().layers()
    lTimeTable = layers[self.dlg.cmbTimetable.currentIndex()-1]
    lTransit = layers[self.dlg.cmbTransit.currentIndex()-1]
    
    if not lTimeTable.isValid():
      self.myprint ("Layer failed to load!")
      return
    if not lTransit.isValid():
      self.myprint ("Layer failed to load!")
      return
      
    self.timetable = None
    from Timetable import Timetable
    self.timetable = Timetable(self)
    
    from CATDB import CATDB
    self.cat_db = CATDB(self)
    
    # 時刻表の設定
    for f in lTimeTable.getFeatures ():
#      self.myprint("add_timetable %d, %d, %f" % (
#        f[self.dlg.cmbRouteid.currentText()], \
#        f[self.dlg.cmbCat.currentText()], \
#        f[self.dlg.cmbTime.currentText()] ))
      catName = ""
      if self.dlg.cmbCatName.currentIndex() <> 0:
        catName = f[self.dlg.cmbCatName.currentText()]
      routeName = ""
      if self.dlg.cmbRouteName.currentIndex() <> 0:
        routeName = f[self.dlg.cmbRouteName.currentText()]

      ptn = re.compile('(\d+):(\d+)')
      m = ptn.match(f[self.dlg.cmbTime.currentText()])
      if m:
        tmp_time = (float(m.group(1))*60+float(m.group(2))) /1440.0
        # 深夜12時~2時までは24時から26時に変換
        if tmp_time < 0.083333: tmp_time = tmp_time+1
      else:
        QMessageBox.information(None, "DEBUG:", "set time correctly") 

      self.timetable.add_timetable( \
        f[self.dlg.cmbRouteid.currentText()], \
        f[self.dlg.cmbCat.currentText()], \
        tmp_time, \
        routeName)
      self.cat_db.add_cat(f[self.dlg.cmbCat.currentText()], \
        f.geometry().asPoint().x(), \
        f.geometry().asPoint().y(), \
        catName)

    # 乗り換え表の設定
    for f in lTransit.getFeatures ():
      ptn = re.compile('(\d+):(\d+)')
      m = ptn.match(f[self.dlg.cmbTime2.currentText()])
      if m:
        tmp_time = (float(m.group(1))*60+float(m.group(2))) /1440.0
      else:
        QMessageBox.information(None, "DEBUG:", "set time correctly") 

      self.timetable.set_transit( \
        f[self.dlg.cmbFromcat.currentText()], \
        f[self.dlg.cmbTocat.currentText()], \
        tmp_time)

    self.myprint(QCoreApplication.translate('code', "Timetable, Transit table set")+u"\n")
    
    self.i_cmbTimetable   = self.dlg.cmbTimetable.currentIndex()
    self.i_cmbRouteid     = self.dlg.cmbRouteid.currentIndex()
    self.i_cmbCat         = self.dlg.cmbCat.currentIndex()
    self.i_cmbTime        = self.dlg.cmbTime.currentIndex()
    self.i_cmbCatName     = self.dlg.cmbCatName.currentIndex()
    self.i_cmbRouteName   = self.dlg.cmbRouteName.currentIndex()
    self.i_cmbTransit     = self.dlg.cmbTransit.currentIndex()
    self.i_cmbFromcat     = self.dlg.cmbFromcat.currentIndex()
    self.i_cmbTocat       = self.dlg.cmbTocat.currentIndex()
    self.i_cmbTime2       = self.dlg.cmbTime2.currentIndex()
    self.i_cmbOrigin      = self.dlg.cmbOrigin.currentIndex()
    self.i_cmbIdOrig      = self.dlg.cmbIdOrig.currentIndex()
    self.i_cmbDestination = self.dlg.cmbDestination.currentIndex()
    self.i_cmbIdDest      = self.dlg.cmbIdDest.currentIndex()
    
    

  def dockCalcPressed(self):
    self.log.setVisible(True)
    self.log.raise_()
    
    if self.timetable == None:
      self.dockConfPressed()
      return
      
    orig_list = []
    dest_list = []
    
    if self.dlg.cmbOrigin.currentIndex() <> 0:
      layers = self.iface.legendInterface().layers()
      lOrigin = layers[self.dlg.cmbOrigin.currentIndex()-1]
      if not lOrigin.isValid():
        self.myprint ("Layer failed to load!")
        return
      for f in lOrigin.getFeatures():
        orig_list.append((f[self.dlg.cmbIdOrig.currentText()],f.geometry().asPoint().x(), f.geometry().asPoint().y()))
    else:
      ptn = re.compile('([+-]?\d+\.?\d*) *?, *?([+-]?\d+\.?\d*)')
      m = ptn.match(self.dock.qleOrigin.text())
      if m:
        orig_list.append((0, float(m.group(1)),float(m.group(2))))
      else:
        QMessageBox.information(None, "DEBUG:", "set origin correctly") 

    if self.dlg.cmbDestination.currentIndex() <> 0:
      layers = self.iface.legendInterface().layers()
      lDestination = layers[self.dlg.cmbDestination.currentIndex()-1]
      if not lDestination.isValid():
        self.myprint ("Layer failed to load!")
        return
      for f in lDestination.getFeatures():
        dest_list.append((f[self.dlg.cmbIdDest.currentText()],f.geometry().asPoint().x(), f.geometry().asPoint().y()))
    else:
      ptn = re.compile('([+-]?\d+\.?\d*) *?, *?([+-]?\d+\.?\d*)')
      m = ptn.match(self.dock.qleDestination.text())
      if m:
        dest_list.append((0, float(m.group(1)),float(m.group(2))))
      else:
        QMessageBox.information(None, "DEBUG:", "set destination correctly") 
    
    ptn = re.compile('(\d+):(\d+)')
    m = ptn.match(self.dock.qleStartTime.text())
    if m:
      start_time = (float(m.group(1))*60+float(m.group(2))) /1440.0
    else:
      QMessageBox.information(None, "DEBUG:", "set start/arrive time correctly") 

    from CalculatorManager import CalculatorManager
    worker = self.worker = CalculatorManager(self)
    thread = self.thread = QtCore.QThread()
    worker.moveToThread(thread)
    thread.started.connect(worker.run)
    
    for o in orig_list:
      for d in dest_list:
        worker.qi.put((o[0], d[0] \
                      ,self.timetable \
                      ,self.cat_db
                      ,int(self.dock.qleSearchdirection.text()) \
                      ,300 \
                      ,o[1] ,o[2] ,d[1] ,d[2] \
                      , start_time))

    worker.myprintsignal.connect(self.myprint)
    thread.start()
    #worker.run()
        
    #self.myprint("started")

  def myprint(self,txt):
    self.log.ptxResult.appendPlainText(txt)
    
    
#!/usr/bin/python

import sys
from Timetable import Timetable

if len(sys.argv) < 2:
    print "Usage : ", sys.argv[0], " sourceFile [filter]"
    sys.exit()
else:
    sourceFile = sys.argv[1]

if len(sys.argv) < 3:
    catFilter = ''
else:
    catFilter = sys.argv[2]

# MAIN
timetable = Timetable(sourceFile, catFilter)
timetable.parse()
Beispiel #11
0
    def genetic_simulation(self):
        init_time = time.time()
        iteration = 0

        score_list = [individual.score for individual in self.population]
        best_individual = score_list.index(min(score_list))
        self.best_individual = self.population[best_individual]
        print "Best score after initialization: ", self.best_individual.score

        while ((time.time() - init_time) < self.data["run_time"]):
            # Select 4 individuals randomly and return best of pairs
            p1, p2 = self.selection(destruction=True)
            self.population[p1].fill_unscheduled()
            self.population[p2].fill_unscheduled()
            self.population[p1].room_hill_climb()
            self.population[p2].room_hill_climb()

            if (time.time() - init_time) / float(
                    self.data["run_time"]) > 0.90 and iteration % 100 == 0:
                self.population[p1].room_hill_climb(
                    room2swap=self.population[p1].schedule.shape[0] / 3,
                    rndtry=2)
                self.population[p2].room_hill_climb(
                    room2swap=self.population[p2].schedule.shape[0] / 3,
                    rndtry=2)

            if (len(
                    np.where((self.population[p1].schedule -
                              self.population[p2].schedule) == 0)[0]) /
                    float(self.population[p1].schedule.size)) > 0.75:
                best_scores = [
                    self.population[p1].score, self.population[p2].score
                ]
                parents = [p1, p2]

                o1 = copy.deepcopy(self.population[parents[best_scores.index(
                    max(best_scores))]])
                o2 = Timetable(self.data, self.compactness_ini)
            else:
                o1, o2 = self.recombination(self.population[p1],
                                            self.population[p2])

            o1_prime, o2_prime = self.mutation((o1, o2))

            # Select 4 individuals and return worst of pairs
            w1, w2 = self.selection(best_selection=False)
            self.population[w1] = o1_prime
            self.population[w2] = o2_prime

            iteration += 1

            score_list = [individual.score for individual in self.population]
            best_individual = score_list.index(min(score_list))
            self.scores_per_iteration.append(
                self.population[best_individual].score)

        score_list = [individual.score for individual in self.population]
        best_individual = score_list.index(min(score_list))

        self.best_individual = self.population[best_individual]
        print self.best_individual.score
        self.best_individual.room_hill_climb(
            room2swap=self.population[p2].schedule.shape[0], rndtry=10)
        print self.best_individual.score

        # Score after hill climber
        self.scores_per_iteration.append(
            self.population[best_individual].score)

        print "Best score: ", self.best_individual.score
        self.generations = iteration
        print 'Iterations: ', iteration
Beispiel #12
0
 def initialize_population(self):
     for i in xrange(self.population_size):
         Individual = Timetable(self.data, self.compactness_ini)
         self.population.append(Individual)
Beispiel #13
0
from Timetable import Timetable
# Импортирование класса 'Subject' из файла 'Subject'
from Subject import Subject
# Импортирование класса 'Teacher' из файла 'Teacher'
from Teacher import Teacher
# Импортирование модуля 'pickle' для сериализации и десериализации объектов
import pickle

if __name__ == '__main__':
    # Создание объекта класса MainPojo
    Mp = MainPojo()
    # Передача значения 'Timetable' в метод 'get_Timetable'
    Mp.get_Timetable = "Timetable"

    # Создание объекта класса Timetable
    Tt = Timetable()
    # Передача значения 'Subject' в метод 'get_subject' класса 'Timetable'
    Tt.get_subject = "Subject"
    # Передача значения 'Teacher' в метод 'get_teacher' класса 'Timetable'
    Tt.get_teacher = "Teacher"

    # Создание объекта класса Subject
    Su = Subject()
    # Передача значения 'TPR' в метод 'get_name_sub' класса 'Subject'
    Su.get_name_sub = 'TPR'
    # Передача значения 'Monday' в метод 'get_day' класса 'Subject'
    Su.get_day = 'Monday'
    # Передача значения 'D-514' в метод 'get_audience' класса 'Subject'
    Su.get_audience = 'D-514'

    # Создание объекта класса Teacher
Beispiel #14
0
 def reset_timetable(self):
     self.timetable = Timetable()