Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Срипт создания расписания, Вроде рабочий скрипт, но результат стран 
:(
    Опции темы
Andres
Дата 23.10.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



Сделал скрипт создания расписания чемпионата футбольных команд.
Код

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:52
PM MAIL   Вверх
Andres
Дата 23.10.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



Немного сокращу задачу.
Проверил вот эти функции.
get_teams - возвращает 16 команд (ок)
get_rasp - возвращает 120 пар (ок)
check - возвращает 120 измененных пар (ок)
Соответственно засада где-то в функциях разбивки на туры. Думаю это get_tur... Но что там не так не пойму...
PM MAIL   Вверх
awers
Дата 23.10.2008, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



А как тебе вариант дебага при помощи Zend? Все наглядно увидеш )
PM MAIL WWW ICQ Skype   Вверх
Andres
Дата 23.10.2008, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 30.8.2006

Репутация: нет
Всего: нет



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

Ща поставлю и посмотрим smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.