Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Срипт создания расписания


Автор: Andres 23.10.2008, 21:03
Сделал скрипт создания расписания чемпионата футбольных команд.
Код

class Controller_Rasp extends Controller_Base{ 
    private $already=array(); 
    private $checks=array('home'=>array(), 'away'=>array()); 
    private $got_ids=array(); 
    function index(){ 
        $con=''; 
        $a=$this->get_rasp('div1'); 
        foreach ($a as $t => $m){ 
            $con.="$t тур<br>"; 
            $l=1; 
            foreach ($m as $v){ 
                $con.=$l." $v[0] - $v[1]<br>"; 
                $l++; 
            } 
            $con.="<hr>"; 
        } 
        $con.=$this->m->arr($a); 
        $this->m['sm']->assign('title', 'Расписание'); 
        $this->m['sm']->assign('main_con', $con); 
        $this->m['sm']->display('index.tpl'); 
    }
    // Берем айди команд из базы 
    private function get_teams($d){ 
        $res=$this->m['db']->prepare("select id from teams where d='$d'"); 
        $res->execute(); 
        $r=$res->fetchAll(PDO::FETCH_ASSOC); 
        foreach ($r as $v){ 
            $t[]=$v['id']; 
        } 
        return $t; 
    } 
    // Составляем пары команд (должно быть 8*15 8 пар 15 туров в первом круге) 
    private function get_rasp($d){ 
        $t=$this->get_teams($d); 
        $num=0; 
        foreach ($t as $v){ 
            $this->already[]=$v; 
            foreach ($t as $v1){ 
                if (in_array($v1, $this->already)) continue; 
                $rasp[]=array($v, $v1); 
                $num++; 
            } 
            if ($num==120) break; 
        } 
        return $this->check($rasp); 
    }  
    // Команда должна играть не более 8 раз дома в течение круга 
    private function check($r){ 
        unset($this->checks['home']); 
        unset($this->checks['away']); 
        foreach($r as $k => $v){ 
            if (!isset($this->checks['home'][$v[0]])) $this->checks['home'][$v[0]]=0; 
            $this->checks['home'][$v[0]]++; 
            if ($this->checks['home'][$v[0]]>8){ 
                $r[$k]=array($v[1], $v[0]); 
            } 
        }         
        return $this->check_turs($r); 
    } 
    // разбиваем расписание на туры 
    private function check_turs($r){ 
        shuffle($r); 
        $turs=array(); 
        for ($tur=1; $tur<=30; $tur++){ 
            if ($tur==16) { 
                shuffle($r);  
                $this->got_ids=array(); 
            } 
            $turs[$tur]=$this->get_tur($r, $tur); 
        } 
        return $turs; 
    } 
    // Получаем пары определенного тура 
    private function get_tur($r, $t){ 
        $checked_ids=array(); 
        $tur=array(); 
        foreach ($r as $k=>$v){ 
            if (in_array($k, $this->got_ids) || in_array($v[0], $checked_ids) || in_array($v[1], $checked_ids)){ 
                continue; 
            }  
            $this->got_ids[]=$k; 
            $checked_ids[]=$v[1]; 
            $checked_ids[]=$v[0]; 
            if ($t<16){ 
                $tur[]=$v;     
            } 
            else $tur[]=array_reverse($v); 
            if (count($tur)==8) break; 
        } 
        return $tur; 
    } 
}  

Вроде все нормально, но в некоторых турах получается 7 пар вместо 8, а иногда меньше. Может я не правильно алгоритм придумал?

PS И может кто подскажет как сделать так чтоб одна команда не играла больше 2 раз подряд дома...

Автор: Andres 23.10.2008, 22:39
Немного сокращу задачу.
Проверил вот эти функции.
get_teams - возвращает 16 команд (ок)
get_rasp - возвращает 120 пар (ок)
check - возвращает 120 измененных пар (ок)
Соответственно засада где-то в функциях разбивки на туры. Думаю это get_tur... Но что там не так не пойму...

Автор: awers 23.10.2008, 23:12
А как тебе вариант дебага при помощи Zend? Все наглядно увидеш )

Автор: Andres 23.10.2008, 23:22
Цитата(awers @ 23.10.2008,  23:12)
А как тебе вариант дебага при помощи Zend? Все наглядно увидеш )

Ща поставлю и посмотрим smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)