Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2013, 04:16   #1
VitalD
Новичок
Джуниор
 
Регистрация: 26.10.2013
Сообщений: 5
По умолчанию случайное ветвление

Здравствуйте все!
Возникла вот проблема, к решению которой не знаю как подступиться. Может быть, кто сталкивался, подскажет, что и как. Так вот, представьте себе, что есть некая программа, в начале выполнения которой пользователь может указать желаемые вероятности исполнения трех различных ветвей внутри содержащегося в теле программы цикла. Например, что-то типа этого:

объявление массива М[0..99] каких-то констант;
объявление какой-то процедуры № 1;
объявление какой-то процедуры № 2;
объявление какой-то процедуры № 3;

ввод параметра Р1 (матожидание для ветви № 1);
ввод параметра Р2 (то же для ветви № 2);
ввод параметра Р3 (то же для № 3);

for і:=0 то 99 do
begin
if <какое-то условие>
then
вызов процедуры № 1 (М[i]) //первая ветвь
еlse
if <еще какое-то условие>
then
вызов процедуры № 2 (М[i]) //вторая ветвь
еlse
вызов процедуры № 3 (М[i]); //третья ветвь
end;

Как видим, отдельные константы из массива М обрабатываются не только по-разному в зависимости от условий, но еще и с вероятностью, не обязательно равной 1 (то есть некоторые могут и вообще остаться нетронутыми, если пользователь установит значение параметра , например, Р2, равным нулю, а другие могут иногда подвергнуться какой-то обработке, а могут и не подвергнуться - случай определяет). Надеюсь, что понятно объяснил задачу.

Заранее огромное спасибо тому или тем, кто хотя бы направление укажет, КАК это можно реализовать.
VitalD вне форума Ответить с цитированием
Старый 26.10.2013, 04:27   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не уверен, но можно попробовать:
Код:
randomize;
...
a := random();
if a < p1 / (p1 + p2 + p3) then
...
else if a < (p1 + p2) / (p1 + p2 + p3) then
...
else
Мог напутать
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 26.10.2013 в 04:29.
BDA вне форума Ответить с цитированием
Старый 26.10.2013, 04:39   #3
VitalD
Новичок
Джуниор
 
Регистрация: 26.10.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Не уверен, но можно попробовать:
Код:
randomize;
...
a := random();
if a < p1 / (p1 + p2 + p3) then
...
else if a < (p1 + p2) / (p1 + p2 + p3) then
...
else
Мог напутать
При выполнении а получит значение либо 0, либо 1. Параметры Р1, Р2, Р3 - матожидания выполнения 1-й..3-й ветвей соответственно, могут лежать в ДИАПАЗОНЕ от 0 до 1, например, Р1=0,09, Р2=0,56, Р3=0,88 (не зависят друг от друга совершенно). Если последовать вашему коду, то в величинах <р1/(р1+р2+р3)> и <(p1 + p2)/(p1 + p2 + p3)> не вижу никакого смысла, т.к. условиями выбора той или иной ветви могут быть совершенно другие потребности, например, величина константы из массива М. Да дело и не в этих условиях, вообще-то. Просто выбрали при каком-то условии (каком-то), что для данной константы МОЖЕТ (!) быть вызвана процедура № 2 (например). И вероятность ее вызова = параметру Р2 (например). Пытаюсь вот нарыть что-то в генетических алгоритмах, но пока - глухо.
VitalD вне форума Ответить с цитированием
Старый 26.10.2013, 05:03   #4
VitalD
Новичок
Джуниор
 
Регистрация: 26.10.2013
Сообщений: 5
По умолчанию

Попробую чуток конкретизировать. Предположим, что ВСЕ константы, содержащиеся в массиве М, вполне соответствуют условию, при котором происходит выбор вызова ВТОРОЙ процедуры. Но вызов, не взирая на это, происходит (должен происходить, если точнее) НЕ ВСЕГДА, а согласно матожиданию, равному параметру Р2. Вот, может, так будет более ясным описание проблемы.))
VitalD вне форума Ответить с цитированием
Старый 26.10.2013, 10:05   #5
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Итак, Вы перебираете все константы
Код:
for (i:=1;i<n,i++)
Далее, для каждой константы вы перебираете все возможные процедуры
Код:
for (j:=1;j<n,j++)
В каждой из итераций выполняете что-то вроде следующего:
Код:
if (rand()%100 > *заданная вероятность выполнения действия j*) then 
...
break;
Т.е. последовательно прогоняете все функции, генерируете случайный % от 100% и сравниваете с заданным % выполнения для этой функции. Если полученный % превышает заданный - функция выполняется, цикл прерывается.

Примеры приведены на С++, но, думаю, алгоритм из этого вывести можно.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 26.10.2013, 12:09   #6
VitalD
Новичок
Джуниор
 
Регистрация: 26.10.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Vanta11a Посмотреть сообщение
Код:
if (rand()%100 > *заданная вероятность выполнения действия j*) then 
...
break;
Т.е. последовательно прогоняете все функции, генерируете случайный % от 100% и сравниваете с заданным % выполнения для этой функции. Если полученный % превышает заданный - функция выполняется, цикл прерывается.
Кажется, что-то в этом есть... спасибо, подумаю-попробую и отпишусь сегодня или завтра.
VitalD вне форума Ответить с цитированием
Старый 26.10.2013, 16:01   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

1) random() вернет вещественное число 0<=a<1
2) Приведенный вариант вызывает одну из трех процедур с заданными вероятностями (обязательно будет вызвана одна), но я не учел, что Вы хотите вызвать каждую процедуру с какой-либо вероятностью.
Тогда, можно:
Код:
randomize;
...
a := random();
if a < p1 then
...
if a < p2 then
...
if a < p3 then
Что уже и предложил Vanta11a.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.10.2013, 14:19   #8
VitalD
Новичок
Джуниор
 
Регистрация: 26.10.2013
Сообщений: 5
По умолчанию

Код:
for i2 := -WSY to WSY  do
  for i1 := -WSX to WSX  do
     case C[i1, i2] of
       1: if (Random(100) > 100-StrToFloat(ShanceM.Text)*100)
            then
              ….
       2: if (Random(100) > 100-StrToFloat(ShanceF.Text)*100)
            then
              ….
       3: if (Random(100) > 100-StrToFloat(ShanceC.Text)*100)
            then
              ….
      end
Опробовал - работает. Спасибо за помощь.
VitalD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ветвление Rfn.if Помощь студентам 4 13.10.2010 14:26
Ветвление Woxx Паскаль, Turbo Pascal, PascalABC.NET 6 07.09.2010 17:26
ветвление beygul Помощь студентам 11 25.08.2010 13:20
Ветвление cerega87 Паскаль, Turbo Pascal, PascalABC.NET 5 07.06.2010 22:43
ветвление felmor Помощь студентам 1 28.02.2009 13:42