Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Построение алгоритма жеребьевки, нужна помощь... : Программирование

26.04.2024 23:01


29.09.2015 22:54
MWWRuza
 
Вобщем, на текущем примере, добился того, что разводится с первого раза с 3 пересечениями команд(Алиса), и с 6-тью повторами... Раньше, такого результата мог добиться только перебором случайных вариантов, в течении пары часов... Прогресс на лицо! Спасибо Shift за идею алгоритма! Но, при попытке развести по этому алгоритму другие этапы, с другим(меньшим) количеством пилотов, сыпятся ошибки, пока не разбирался в чем... Предпологаю, что в размерности "Шага"...
29.09.2015 23:04
MWWRuza
 
Текущие результаты: Жеребьевка, Таблица повторов
Алгоритм разведения четвертой колонки, получаем список значений, согласно которому заполняем четвертую колонку по всем четырем турам:
Код:
Функция ЗаполнитьСз4тойКолонки(ТЗКолБоев,НачСЗ)
	СЗ = СоздатьОбъект("СписокЗначений");
	Для Тур = 1 По 4 Цикл  
		НачСтр 		= ПолучитьНачСтрокуТура(Тур,ТЗКолБоев);
		КонСтр 		= ПолучитьКонСтрокуТура(Тур,ТЗКолБоев) + 1; 
		СпОст 		= СоздатьОбъект("СписокЗначений");
        НачСЗ.Выгрузить(СпОст);
		Для Стр = НачСтр По КонСтр Цикл
			Для Кол = 1 По 3 Цикл 
				НачСтрТура	= ПолНачСтрТураВКолонкеДляПилота(НачСтр,Тур,ТЗКолБоев,Кол);
				КонСтрТура  = ПолКонСтрТураВКолонкеДляПилота(НачСтрТура,Тур,ТЗКолБоев,Кол); 	
				Если (Стр >= НачСтрТура) И (Стр <= КонСтрТура) Тогда
					ТекПилот 	= НачТЗ.ПолучитьЗначение(Стр,Кол);
					УдПоз		= СпОст.НайтиЗначение(ТекПилот);
					СпОст.УдалитьЗначение(УдПоз);
				КонецЕсли;	
			КонецЦикла;	
		КонецЦикла;   
		СпОст = ОтсортироватьПоРазмеруКоманды(СпОст,0);
		Для СчОст = 1 По СпОст.РазмерСписка() Цикл
			СЗ.ДобавитьЗначение(СпОст.ПолучитьЗначение(СчОст));
		КонецЦикла;	
	КонецЦикла;	
	Возврат СЗ;
КонецФункции
Функции сотировки, получения НачСтроки и КонСтроки с учетом разного количества боев в турах, и соответственно разного количества перебираемых строк в зависимости от колонки(со стыком или без), были написаны раньше, и работают и в этом алгоритме...
Интересно, 6 - это наилучший показатель при данном "раскладе", или еще что-то не развелось?
01.10.2015 02:02
MWWRuza
 
Цитата:
MWWRuza Но, при попытке развести по этому алгоритму другие этапы, с другим(меньшим) количеством пилотов, сыпятся ошибки, пока не разбирался в чем... Предпологаю, что в размерности "Шага"...
Разобрался... Размерность шага здесь не при чем... Неправильно работала функция, возвращающяя конечную строку текущего тура в зависимости от колонки. Если на конец тура нет стыка(например, когда два лишних пилота от деления количества участников на четыре, то конец второго тура будет без стыкового боя). Функция возвращала КонСтрТура на 1 больше, чем на самом деле должно быть, и соответственно, в четвертую колонку меньше пилотов попадало, на три из этой лишней строки... А ошибки сыпались на три пустх ячейки таблицы, последние из четвертой колонки, при последующем разведении команд/повторов...
Исправил, сейчас алгоритм работает при любом количестве участников...

Что касается количества повторов... Пока не понял. Для текущего примера, разводит неплохо - 6 остается повторов, и три пересечения большой команды. В других этапах, результаты почему-то хуже... Некоторые этапы крупные, разводятся в ноль... Вобщем, надо анализировать и думать дальше
Актуальная база, со всеми доработками.
Часовой пояс GMT +3, время: 23:01.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.