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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2012, 21:15   #1
Мисс Зло
 
Регистрация: 10.01.2011
Сообщений: 8
Восклицание Диофантово уравнение

Помогите пожалуйста....это просто ужас какой то....
Разработать программу для решения Диофантова уравнения вида: a+2b+3c+4d=30, где a,b,c,d - некоторые положительные целые числа. Нахождение коэффициентов a,b,c,d осуществить с помощью генетического алгоритма.
Мисс Зло вне форума Ответить с цитированием
Старый 27.04.2012, 23:29   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Мисс Зло Посмотреть сообщение
это просто ужас какой то....
А почему ужас-то?
Сама ченть сделала уже? показывай, поможем ))
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 28.04.2012, 00:09   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
uses
  crt;

type
  tarray = array[1..4] of integer;
  tmatrix = array[1..20] of tarray;

var
  a: tmatrix;
  i, j: integer;

function f(var a: tarray): integer;
begin
  f := a[1] + 2 * a[2] + 3 * a[3] + 4 * a[4] - 30;
end;

procedure scresh(var a: tmatrix);
var
  i, j, count, j1, j2: integer;
begin
  count := random(20) + 1;
  for i := 1 to count do
  begin
    j1 := random(20) + 1;
    repeat
      j2 := random(20) + 1;
    until j1 <> j2;
    for j := 1 to 4 do
      a[j1, j] := abs((a[j1, j] - a[j2, j]) div 2) + 1;
  end;
end;

procedure mutac(var a: tmatrix);
var
  i, j, count, j1: integer;
begin
  count := random(20) + 1;
  for i := 1 to count do
  begin
    j1 := random(20) + 1;    
    for j := 1 to 4 do
      a[j1, j] := abs(a[j1, j] +  random(10) - 5) + 1;
  end;
end;

procedure selec(var a: tmatrix);
var
  i, j: integer;
  b: tarray;
begin
  for i := 1 to 19 do
    for j := i + 1 to 20 do
      if abs(f(a[i])) > abs(f(a[j])) then
      begin
        b := a[i];
        a[i] := a[j];
        a[j] := b;
      end; 
end;

begin
  randomize;
  for i := 1 to 20 do
    for j := 1 to 4 do
      a[i, j] := random(100) + 1;
  writeln('Search...');
  repeat
    scresh(a);
    mutac(a);
    selec(a); 
    writeln(a[1, 1], ' ', a[1, 2], ' ', a[1, 3], ' ', a[1, 4], ' f=', f(a[1]));
  until abs(f(a[1])) = 0;
  writeln('----------------');
  writeln('Answer: a=', a[1, 1], '; b=', a[1, 2], '; c=', a[1, 3], '; d=', a[1, 4]);
  readln;
end.
Пришлось поломать голову
Да, никаких гарантий 100% работы не даю
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 28.04.2012 в 00:16.
BDA вне форума Ответить с цитированием
Старый 30.04.2012, 20:03   #4
Мисс Зло
 
Регистрация: 10.01.2011
Сообщений: 8
По умолчанию

Ой спасибочки)))) вот если бы еще с пояснением, то моей благодарности вообще бы не было предела...)))
Мисс Зло вне форума Ответить с цитированием
Старый 30.04.2012, 20:40   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Открываем статью на википедии про генетические алгоритмы - http://ru.wikipedia.org/wiki/Генетический_алгоритм.
Смотрим, какие шаги нужно осуществить.
Цитата:
Таким образом, можно выделить следующие этапы генетического алгоритма:
1) Задать целевую функцию (приспособленности) для особей популяции
2) Создать начальную популяцию
(Начало цикла)
1) Размножение (скрещивание)
2) Мутирование
3) Вычислить значение целевой функции для всех особей
4) Формирование нового поколения (селекция)
5) Если выполняются условия остановки, то (конец цикла), иначе (начало цикла).
Примерно то же и осуществляем.
Процедура scresh скрещивает случайное количество случайных особей (строк массива).
Процедура mutac изменяет свойства случайного количества случайных особей.
Процедура selec сортирует всех особей-строк по возрастанию расстояния до требуемого значения.
На первой строке массива будет самая приспособленная особь.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.05.2012, 19:43   #6
Мисс Зло
 
Регистрация: 10.01.2011
Сообщений: 8
По умолчанию

а почему мы всегда берем 20 особей? или это не имеет значения?
Мисс Зло вне форума Ответить с цитированием
Старый 01.05.2012, 20:18   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Генетический алгоритм такая вещь, что с параметрами можно "играться" бесконечно. Мне приглянулось число 20
Любой шаг можно сделать многими путями (это я про способы скрещивания и мутирования).
Цитата:
это не имеет значения?
Да, можно сказать, что это не имеет значения, но есть несколько ограничений:
Особей не должно быть слишком мало, иначе они могут "выродиться" (при решении более сложных задач мы можем упереться в локальный минимум или максимум);
Особей не должно быть слишком много, иначе операции с ними будут слишком долгими.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.05.2012, 08:39   #8
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Пришлось поломать голову
BDA, респект! ))
+1
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 02.05.2012, 17:16   #9
Мисс Зло
 
Регистрация: 10.01.2011
Сообщений: 8
По умолчанию

а еще вопросы))) a[j1, j] := abs((a[j1, j] - a[j2, j]) div 2) + 1 вот эта формула откуда...? и последующие в процедурах)))
Мисс Зло вне форума Ответить с цитированием
Старый 02.05.2012, 17:26   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Так я говорю, что это широкий простор для творчества)
Формулы взяты "от балды".
a[j1, j] := abs((a[j1, j] - a[j2, j]) div 2) + 1; - заменяет 1 особь на гибрид из 1 и 2 особи
Главное - чтобы числа оставались в области определения, т.е. целые положительные.
a[j1, j] := abs(a[j1, j] + random(10) - 5) + 1; - особь 1 мутирует случайным образом.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уравнение Katrina* Паскаль, Turbo Pascal, PascalABC.NET 20 24.12.2011 14:50
уравнение Poma][a Паскаль, Turbo Pascal, PascalABC.NET 4 13.10.2011 20:30
уравнение Екатерина Воробей Паскаль, Turbo Pascal, PascalABC.NET 2 03.10.2011 18:42
Задача на VBA Диофантово уравнение Maxs Помощь студентам 6 11.06.2009 14:05
Уравнение Paul_AG Общие вопросы C/C++ 19 10.05.2009 22:50