[Описание проекта] [Описание программы] [ ИТОГ и загрузка]

Проект улучшения любых плохих видеофайлов

ОПИСАНИЕ ПРОГРАММЫ


Для создания алгоритма я сделал программу, которая представляла из себя:

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

Как программа работает:

1. После запуска программа генерирует список "случайных" алгоритмов. Т.е. использую функцию random() и набор правил генерируются алгоритмы. После этого для каждого алгоритма узнается целевая функция. В моем случае целевая функция это средняя ошибка на каждый пиксель + среднее число команд, которое потребовалось алгоритму до завершения обработки картинки.

2. Производится попытка синхронизации работы с основным сервером. Для этого вызывается стандартная программа ftp.exe, которая должна находится в каталоге windows\system32 (Довольно подробное описание здесь). Программа берет последние результаты рассчетов алгоритма с моего ftp-сервера (сейчас это будет сервер ftp://yo.lv), т.е. по ftp протоколу перекачивается из интернета файл wvideo.rar который и распаковывается (автоматически). Имеется возможность настроить адреса ftp-серверов так, что суточный внешний трафик любой группы компьютеров (например 100 компов в общаге) будет не больше 500 килобайт! А остальной трафик будет внутригрупповой (для этого должен быть установлен ftp-сервер)

После этого все результаты сортируются по целевой функции (целевая функция, в данном случае, вычисляется как разница между полученным изображением и желаемым изображением. Чем меньше эта сумма, тем, естественно, лучше). Те алгоритмы, которые обладают наименьшей целевой функцией записываются на диск, сжимаются программой rar.exe и пересылаются обратно на мой ftp сервер.

3. Генерятся новые порции случайных алгоритмов, но уже на основе наиболее лучших из существующих. К этим новым "особям" "природа" добавляет мутации. Таким образом появляются версии алгоритмов, которые могут быть лучше своих родителей, а могут быть и хуже. Как правило - хуже.

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

Результат работы программы (т.е. алгоритм) выглядит таким образом:

0 if k[k[175]]<k[4] then goto 7;
1 k[k[208]]:=b.rgb[k[181]];
2 if k[k[100]]<k[3] then goto 17;
3 dec(k[k[202]],b.rgb[k[250]]);
4 if k[k[71]]<k[1] then goto 255;
5 k[k[39]]:=k[k[39]] div a.rgb[k[71]];
6 dec(k[k[84]],a.rgb[k[117]]);
7 if k[k[141]]<k[2] then goto 322;
8 k[k[206]]:=a.rgb[k[204]];
9 if k[k[39]]<k[136] then goto 111;
10 k[k[23]]:=k[k[23]] div b.rgb[k[148]];
11 k[k[205]]:=k[k[205]] div a.rgb[k[7]];
12 dec(k[k[146]],a.rgb[k[47]]);
13 k[k[228]]:=k[k[228]] div 135;
14 k[k[160]]:=k[k[150]];
15 k[k[165]]:=k[k[165]] div b.rgb[k[11]];
16 if k[k[161]]<k[0] then goto 257;
17 k[k[236]]:=k[k[6]];
18 k[k[160]]:=83;
19 k[k[111]]:=k[k[111]]*b.rgb[k[32]];
20 k[k[189]]:=k[k[189]] div k[k[193]];
21 k[k[20]]:=k[k[20]] div a.rgb[k[210]];
22 k[k[151]]:=k[k[151]]*a.rgb[k[254]];
23 dec(k[k[219]],b.rgb[k[134]]);
24 k[k[112]]:=k[k[112]]*b.rgb[k[92]];
25 k[k[239]]:=k[k[152]];
26 inc(k[k[105]],b.rgb[k[229]]);
27 k[k[237]]:=k[k[237]] div a.rgb[k[43]];
28 k[k[97]]:=k[k[97]]*b.rgb[k[0]];
29 inc(k[k[29]],a.rgb[k[223]]);
30 k[k[23]]:=b.rgb[k[38]];
31 k[k[30]]:=a.rgb[k[130]];
32 dec(k[k[177]],k[k[183]]);
33 dec(k[k[114]],b.rgb[k[54]]);
34 dec(k[k[243]],b.rgb[k[0]]);
35 inc(k[k[55]],191);
36 dec(k[k[192]],b.rgb[k[38]]);
37 dec(k[k[15]],b.rgb[k[117]]);
38 if k[k[98]]<k[1] then goto 164;
39 inc(k[k[107]],k[k[44]]);
40 if k[k[244]]<k[21] then goto 447;
41 inc(k[k[67]],k[k[61]]);
42 k[158]:=4;
43 if k[k[76]]<k[3] then goto 185;
44 if k[k[233]]<k[4] then goto 119;
45 inc(k[k[25]],k[k[136]]);
46 k[k[75]]:=k[k[75]]*a.rgb[k[3]];
47 k[4]:=1;
48 dec(k[k[112]],k[k[67]]);
49 inc(k[k[172]],b.rgb[k[198]]);
50 k[4]:=1;
51 dec(k[k[57]],a.rgb[k[50]]);
52 k[k[19]]:=k[k[19]]*32;
53 inc(k[k[32]],a.rgb[k[83]]);
54 inc(k[k[218]],b.rgb[k[198]]);
55 k[k[125]]:=k[k[125]] div b.rgb[k[141]];
56 dec(k[k[57]],b.rgb[k[50]]);
[пропущено]
4981 k[4]:=4;
4982 k[k[51]]:=k[k[51]] div c.rgb[k[94]];
4983 k[4]:=88;
4984 k[k[59]]:=k[k[59]] div c.rgb[k[161]];
4985 k[k[26]]:=k[k[26]]*b.rgb[k[158]];
4986 inc(k[k[149]],k[k[232]]);
4987 k[k[49]]:=k[k[49]] div c.rgb[k[94]];
4988 k[4]:=88;
4989 k[k[59]]:=k[k[59]] div c.rgb[k[161]];
4990 c.rgb[k[26]]:=c.rgb[k[26]]*b.rgb[k[32]];
4991 dec(k[k[119]],b.rgb[k[238]]);
4992 k[k[160]]:=k[k[160]] div c.rgb[k[135]];
4993 k[k[206]]:=k[k[206]] div 57;
4994 if c.rgb[k[40]]>k[3] then goto 4875;
4995 if k[k[203]]>k[229] then goto 4956;
4996 c.rgb[k[26]]:=c.rgb[k[26]]*b.rgb[k[32]];
4997 k[4]:=4;
4998 c.rgb[k[51]]:=c.rgb[k[51]]*c.rgb[k[94]];
4999 k[4]:=88;
5000 k[k[59]]:=k[k[59]] div c.rgb[k[161]];

Программа работает в скрытом режиме. Вызвать на экран ее можно нажав ShiftF12 (Win9x) или Alt-Shift (WinNT) при этом указатель мыши должен находится в левом-верхнем углу.

Старый вид программы-генератора алгоритмов. Первая строчка - статус на момент последней синхронизации: общее число иттераций, лучшая (минимальная) ошибка, время (в командах) которое затратил лучший вариант алгоритма и относительная ошибка.

Серые буквы (если они есть) - следы работы программы ftp.exe. Желтые числа - записанные на диск варианты.

Темно-синие - текущие варианты. Так сказать: "рабочий процесс". (Наиболее плохие варианты не отображаются).

При запуске программы (а это может происходить и из StartUp) я внешней утилитой (MyRun) запускаю программу в свернутом виде с минимальным приоритетом (Idle). Правда это не спасает от некоторого притормаживания системы - памяти программа берет под себя около 22 мегов.

Мною также разработана методика управления программой по ftp при помощи автоматической загрузки обновлений (как файлов данных, так и исполняемых модулей). Благодаря этому пользователям не придется вручную делать обновления файлов - это произойдет автоматически во время следующего запуска программы.

Возможна ли синхронизация по электронной почте? Да, но в полуавтоматическом режиме. Если будет больше 3-х желающих, то сделаю в автоматическом (пока только один желающий).

Краткая история:

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

Спустя неделю были выявлены 2-3 грубые ошибки и 3-4 мелкие.

Февраль 2001 года. Добавлена возможность работы через интернет (синхронизация идет через ftp-сервера). 16 числа был изменен алгоритм отсеивания плохих вариантов, в результате чего скорость перебора возросла в 10 раз, но все равно остается недостаточной.

Ищется последняя ошибка :-). Как в том анекдоте: Ламер у Хакера спрашивает: "А где у меня ошибка?" На что Хакер отвечает:

- В ДНК!!!

21 марта 2001- подозрение на ошибку при синхронизации.

26 марта 2001- подозрение на ошибку не снято, думаю перевести прогу на дельфи (сейчас прога написана под FreePascal 32 bit). На данный момент абсолютная ошибка снизилась до 62,65 (вместо 64,60), а относительная ошибка 0,948.

28 апреля 2001- получена первая работоспособная версия, написанная на Delphi. Соответсвенно существенно поменялся интерфейс и несколько изменились возможности (в частности не так заметна пользователю - в идеале она вообще не видна и не ощущается). Абсолютная ошибка снизилась до 57,886.

8 мая 2001- доделал программу под Винды. Выложил в разделе [ ИТОГ и загрузка]. Абсолютная ошибка снизилась до 57,864.

9 мая 2001- сделал всплытие в Win95/98. Мелкие доработки (несколько изменен загрузчик). Абсолютная ошибка 57,861.

6-may-02 - ошибка 28.33. Уже довольно долго.... Видимо нужно добовлять новые файлы для обучения (пока обучение ведется всего на 18 фотографиях маленького размера).

 

Минимальная конфигурация: 64 мегабайта памяти и постоянная связь с интернетом (скоро будет: "хотя бы раз в сутки связь с интернетом"). Если на компьютере будет меньше памяти, то программа будет притормаживать систему.

Желательная конфигурация: 96 мегабайт памяти и больше, процессор на уровне Intel Pentium II 450 MHz, операционная система WinNT (но сойдет и Win9x), постоянный доступ в интернет.

Суточный траффик около 800 килобайт (при желании может быть уменьшен до 400 килобайт и меньше). Траффик латвийский (скоро будет российский). Возможны варианты.

Сейчас ищутся бескорыстные люди, которые могут погонять мою программу на как можно большем числе компьютеров.

Писать imageman@inbox.lv

 

Другие страницы Владимира Чаплинского

Сайт создан в системе uCoz