/**
  * 計算課表
  */
 public static function caculate($param)
 {
     // 設定執行時間
     set_time_limit(60);
     // 產生教室使用時間,提供排課使用
     $classroom = Classroom::all();
     foreach ($classroom as $classroomItem) {
         $GLOBALS['classroomCourseTime'][$classroomItem->classroom_id] = str_replace('1', $classroomItem->count, $classroomItem->course_time);
     }
     // 取得教師排課需求,計算適應值用
     $teacher = Teacher::where('course_time', '<>', str_repeat(0, 35))->get();
     foreach ($teacher as $teacherItem) {
         $GLOBALS['teacherRequire'][$teacherItem->teacher_id]['require'] = $teacherItem->course_time;
         $GLOBALS['teacherRequire'][$teacherItem->teacher_id]['classes_id'] = $teacherItem->classes_id;
         if ($teacherItem->classes_id != 0) {
             $GLOBALS['teacherRequire'][$teacherItem->teacher_id]['courseTime'] = $teacherItem->classes->year->course_time;
         }
     }
     // 產生課表,速度、計算適應值
     $seed = self::_generateSeed($param['seedCount']);
     // 發生錯誤,回傳錯誤結果
     if ($seed[0] == 'error') {
         return $seed;
     }
     // 進行粒子最佳化計算
     $seedProgressHistory = array();
     $extinctionTimes = 1;
     while ($param['extinctionCount'] > 0) {
         $withoutProgressCount = 0;
         $bestSeed = self::_getBestSeed($seed);
         $seedProgressHistory[] = number_format($bestSeed['fitness'], 2, '.', '');
         while ($withoutProgressCount < $param['executeCount']) {
             // 更新種子速度
             self::_updateSeedV($seed, $bestSeed);
             // 依照速度更新課表排課、計算適應值
             $seed = self::_updateSeed($seed);
             // 取得新的全域最佳值
             $newBestSeed = self::_getBestSeed($seed);
             // 判斷是否改進
             if ($bestSeed['fitness'] < $newBestSeed['fitness']) {
                 $bestSeed = $newBestSeed;
                 $withoutProgressCount = 0;
                 $seedProgressHistory[] = number_format($bestSeed['fitness'], 2, '.', '') . '<sup class="progross">&nbsp;&nbsp;改進</sup>';
             } else {
                 $withoutProgressCount++;
                 $seedProgressHistory[] = number_format($bestSeed['fitness'], 2, '.', '');
             }
         }
         // 進行判斷是否改進毀滅結果
         if (!isset($historyBestSeed) || $historyBestSeed['fitness'] < $bestSeed['fitness']) {
             $historyBestSeed = $bestSeed;
         }
         $seedProgressHistory[] = '<strong>' . number_format($historyBestSeed['fitness'], 2, '.', '') . '<sup>&nbsp;&nbsp;全域最佳</sup></strong>';
         $seedProgressHistory[] = 'Extinction ' . $extinctionTimes;
         $param['extinctionCount']--;
         $extinctionTimes++;
     }
     file_put_contents(storage_path() . '\\result.json', json_encode($historyBestSeed['timetable']));
     return $seedProgressHistory;
 }
Example #2
0
 /**
  * @before _secure, _school
  */
 public function manage($grade_id)
 {
     $grade = \Grade::first(array("id = ?" => $grade_id), array("title", "id", "organization_id"));
     if (!$grade || $grade->organization_id != $this->organization->id) {
         self::redirect("/school");
     }
     $this->setSEO(array("title" => "Manage Sections | School"));
     $view = $this->getActionView();
     $classrooms = \Classroom::all(array("grade_id = ?" => $grade_id));
     $view->set("grade", $grade);
     $view->set("classrooms", $classrooms);
 }
Example #3
0
 public function getRoomSchedule()
 {
     $NOW = new DateTime();
     $EPOCH = new DateTime('1970-01-01 00:00:00');
     $room = Input::get('room');
     $startdate = Input::get('startdate', $EPOCH->format('Y-m-d H:i:s'));
     //$starttime = Input::get('starttime', $EPOCH->format('H:i:s'));
     $enddate = Input::get('enddate', $NOW->format('Y-m-d H:i:s'));
     //$endtime = Input::get('endtime', $NOW->format('H:i:s'));
     $roomNumber = Input::get('room', 'all');
     $jsonpCallback = Input::get('callback', '');
     $startTimestamp = strtotime($startdate);
     $endTimestamp = strtotime($enddate);
     if ($roomNumber == 'all') {
         $events = Classroom::all();
     } else {
         $events = $this->getEventsForRoom($roomNumber);
     }
     $returnEvents = array();
     foreach ($events as $event) {
         if ($event->RecurrenceRule !== "") {
             $instance = $this->parseEvent($event);
             $eventsArray = $this->expandEvents($instance, $startTimestamp, $endTimestamp);
             foreach ($eventsArray as $singleEvent) {
                 array_push($returnEvents, $singleEvent);
             }
         } else {
             if ($startTimestamp <= strtotime($event->Start) && $endTimestamp >= strtotime($event->End)) {
                 $nonRecurEvent = $this->formatEvent($event);
                 array_push($returnEvents, $nonRecurEvent);
             }
         }
     }
     //Check to see if the result should be jsonp
     if ($jsonpCallback !== '') {
         return Response::json($returnEvents)->setCallback($jsonpCallback);
     } else {
         return json_encode($returnEvents);
     }
 }
Example #4
0
 public function getIndex()
 {
     $theArray = Classroom::all();
     $jsonArray = $theArray->toJson();
     return $jsonArray;
 }