Оптимизация алгоритмов. - страница 3

 
joo:

Ширина секторов не может соответствовать значениям в массиве, иначе не для любых чисел будет работать алгоритм.

Важно расстояние, на котором находятся числа между собой. Чем дальше все числа отстоят от первого, тем меньше вероятность их выпадения. По сути мы откладываем на числовой прямой отрезки, пропорциональные расстояниям между числами с поправкой на коэффициент 0,01 что бы у последнего числа вероятность выпадения не равнялась 0 как самого дальнего от первого. Чем больше коэффициент, тем более равные получаются сектора. Файл экселя в прикрепе, поэкспериментируй.

1. Расчет теоретических вероятностей приведён в экселе. Первое число - наибольшая вероятность, последнее число - наименьшая вероятность но не равная 0.

2. Отрицательных размеров секторов не бывает никогда для любого набора числел, при условии что набор отсортирован по убыванию - первое число самое большое (будет работать и с самым большим в наборе но отрицательным числом).

Я не понял, но мне уже нравится Ваш подход к теории вероятности, выраженый в ключевой фразе:"Важно расстояние, на котором находятся числа между собой. Чем дальше все числа отстоят от первого, тем меньше вероятность их выпадения..." и дубль два(контрольный выстрел):"Вы предлагаете просто выбрать элемент массива случайным образом? - так не учитывается расстояния между числами массива, а поэтому Ваш вариант никуда негодный.".! Закономерный вопрос: вынос мозга - обязательное упражнение для оттачивания логики написания програм? Пожалуй, останусь лучше кодером-дилетантом, для здоровья полезней.

А если дружить с теорией вероятности, то логика работы рулетки - это генератор случайных чисел в диапазоне от 0 до 36 (если рулетка обычная, европейская, без америкосовских заморочек типа двойного зеро и пр...).

 
Wangelys:

Я не понял, но мне уже нравится Ваш подход к теории вероятности, выраженый в ключевой фразе:"Важно расстояние, на котором находятся числа между собой. Чем дальше все числа отстоят от первого, тем меньше вероятность их выпадения..." и дубль два(контрольный выстрел):"Вы предлагаете просто выбрать элемент массива случайным образом? - так не учитывается расстояния между числами массива, а поэтому Ваш вариант никуда негодный.".! Закономерный вопрос: вынос мозга - обязательное упражнение для оттачивания логики написания програм? Пожалуй, останусь лучше кодером-дилетантом, для здоровья полезней.

А если дружить с теорией вероятности, то логика работы рулетки - это генератор случайных чисел в диапазоне от 0 до 36 (если рулетка обычная, европейская, без америкосовских заморочек типа двойного зеро и пр...).

Собственно, казиношная рулетка ничто иное, как метафора, на которую уже попались минимум трое в этой ветке.

 
joo:

Собственно, казиношная рулетка ничто иное, как метафора, на которую уже попались минимум трое в этой ветке.

- Да, да, я всё понял! Эзопов язык!

- Простите не расслышал, откуда?

 
Wangelys:

- Да, да, я всё понял! Эзопов язык!

- Простите не расслышал, откуда?

Роберт Шекли?
 
joo:

Ширина секторов не может соответствовать значениям в массиве, иначе не для любых чисел будет работать алгоритм.

Важно расстояние, на котором находятся числа между собой. Чем дальше все числа отстоят от первого, тем меньше вероятность их выпадения. По сути мы откладываем на числовой прямой отрезки, пропорциональные расстояниям между числами с поправкой на коэффициент 0,01 что бы у последнего числа вероятность выпадения не равнялась 0 как самого дальнего от первого. Чем больше коэффициент, тем более равные получаются сектора. Файл экселя в прикрепе, поэкспериментируй.

1. Расчет теоретических вероятностей приведён в экселе. Первое число - наибольшая вероятность, последнее число - наименьшая вероятность но не равная 0.

2. Отрицательных размеров секторов не бывает никогда для любого набора числел, при условии что набор отсортирован по убыванию - первое число самое большое (будет работать и с самым большим в наборе но отрицательным числом).

Это не верное утверждение ИМХО.

имеем массив
 double a[10]={1,2,3,4,5,6,7,8,9,10};
какова вероятность выпадения каждого?
 55=1+2+3+4+5+6+7+8+9+10;
 double b[10]={1/55,2/55,3/55,4/55,5/55,6/55,7/55,8/55,9/55,10/55};
те вероятность выпадения [0] в 10 раз меньше чем [9].
теперь разметим массив где эти вероятности будут отображены
 double с[10]={1,3,6,10,15,21,28,36,45,55};
теперь при выпадении чисел от 1 до 55, если ранд55 <= c[x], то имеем нужный индекс.
для того чтоб работало и для отрицательных чисел нужно сдвинуть значения на 1-с[0].

теперь посмотрим изменяться ли вероятности при изменении чисел...
 double a[10]={2,4,6,8,10,12,14,16,18,20};
какова вероятность выпадения каждого?
 110=2+4+6+8+10+12+14+16+18+20;
 2/110==1/55
 double b[10]={1/55,2/55,3/55,4/55,5/55,6/55,7/55,8/55,9/55,10/55};
те вероятность выпадения [0] в 10 раз меньше чем [9], 
вероятность выпадения не изменилась, 
т.к. она измеряется относительно среднего рассчитанного по всему массиву.

 

Второе, расчёт вероятностного массива с[] нужен один раз на эпоху, а значит следует разделить функцию на RoletteEpoh() и RoletteRand().

хотя Joo говорил об этом в начале.

но само ускорение можно получить лишь на поиске выпавшего значения в массиве c[].

Тут может помочь стандартная библа, а именно методы быстрого поиска.

А лучше взять её переработанные методы из статьи Электронные таблицы на MQL5

ЗЫ суть в том что в статье есть адаптация методов для поиска в отсортированных массивах по убыванию, тогда как в стандартной только по возрастанию (возможно ошибаюсь давно в стандартную библу не лазил).

 
joo:
Роберт Шекли?
Нет, чуть проще - Привоз в Одессе, хотя Шекли (чуть не написал шекели) я тоже люблю. А вот на следующую Вашу метафору "попались" все участники в этой ветке:
joo:
Предлагаю здесь обсуждать проблемы оптимального построения логики алгоритмов
-потому, что то, что здесь происходит, врядли подпадает под формулировку задачи "оптимального построения логики алгоритмов" - это больше похоже на совершенствование методов и приёмов кодирования... или я не прав?
 
Wangelys:
задачи "оптимального построения логики алгоритмов" - это больше похоже на совершенствование методов и приёмов кодирования... или я не прав?

Ветка общего характера:

"Если кто то сомневается, что его алгоритм имеет оптимальную по быстродействию (или по наглядности) логику, то добро пожаловать."

А конкретно моя задача заключалась в "...предложите, пожалуйста, более быстрый вариант...". Более быстрый! Я же не спрашивал, верно или нет считает мой алгоритм, в данном случае нужно просто быстрее, то есть если кто предложет другой вариант алгоритма, то он должен давать результат именно такой как у меня и ни какой другой. А все почему то начали размышлять о чем то своём.


Ладно, мою задачу по ускорению решили. :)

 
Wangelys:

- Да, да, я всё понял! Эзопов язык!

- Простите не расслышал, откуда?

Это из генетически алгоритмов.
Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • 2010.05.25
  • Andrey Dik
  • www.mql5.com
В статье автор расскажет об эволюционных вычислениях с использованием генетического алгоритма собственной реализации. Будет показано на примерах функционирование алгоритма, даны практические рекомендации по его использованию.
 
Теперь у меня задачка.  Нужно сделать эффективную сортировку массивов с большой "стоимостью" копирования элементов (т.е. элементы которого - объёмистые, "тяжелые" структуры, объекты классов, длинные строки и т.п.).  Здравый смысл подсказывает, что нужно оставлять их на месте, а сортировать вместо них своего рода указатели - индексы ячеек их оригинального расположения.  Далее цитата отсюда :https://www.mql5.com/ru/forum/6476#comment_178318
Если прямо тут перевести в подобие "техзадания", то нужна функция, на вход берущая массив и возвращающая 
второй массив (int), элементы которого являются индексами элементов входного массива, расположенными 
по убыванию (возрастанию).

В идеальном случае сделать перегрузки для всех стандартных типов + CObject (при обязательном требовании
к реализации функции Compare() у наследников CObject).  Хотелось бы и для структур, но похоже на стороне
разработчика никак не решаемо - виртуальных функций у структур нет (и не надо!), т.е. юзерскую функцию
Compare() не пришить, а "стандартное" отношение порядка для структур, естественно, не определено.  
Оставим пока уважаемых разработчиков терминала с их многочисленными текущими задачами, и реализуем это на mql5.
Причина обращения: