Простой генетический алгоритм в 1С 8




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

18 Comments

  1. CheBurator

    ну, насколько я себе представляю — ГА отличаются быстрой работой в оптимизационных задачах. В чем дает выигрыш данная разработка?

    Reply
  2. detro

    Прежде всего это учебная задача, практической пользы нет, мне интересен опыт реализации ГА на 1С. может кто захочет поделиться мыслями, данный вариант моё видение.

    Я вижу использование ГА в поиске решений с множеством ограничений. Сейчас не ставил задачу, скорость работы.

    Reply
  3. fedor40

    1. Всегда разный результат будет. Клиенту может не понравится.

    2. Надо бы сравнить этот метод с методами линейного прог.

    Reply
  4. detro

    fedor40 06.04.2009 14:26:25

    1) Результат очень сильно зависит от начальной популяции, в чем легко убедиться при работе с текущей обработкой.

    Для практического применения просто нужно указывать критерии проходимости, если относительно задачи описанной выше, это может быть % дохода на вложенные средства не меньше чем 20% и пока данный результат не достигнут происходит работа ГА.

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

    2) Этого добра много в инете, но как правило задачи в которых параметров большое количество решаются с помощью ГА

    Reply
  5. Anything

    Самое сложное в генетических алгоритмах — найти задачу, решение которой требовало бы их использование. 😉

    Reply
  6. fedor40

    Задачи:

    1) закупка товара по количеству, сумме, весу, объему

    2) создание цепочки доставки товара

    3) загрузка производственного оборудования

    Reply
  7. detro

    (5)

    Задачи, которые можно решить с помощью ГА: транспортная логистика – параметры вес, объём машины, вес, объём точки развоза, ограничение по времени работы, как точки так и машины, продолжительность маршрута, стоимость маршрута и т.д.

    Если взять задачу описанную выше:

    «N заказов поставщику, Х денег — какие заказы необходимо оплатить для получения макс. прибыли за мин. срок времени», добавим сюда важные параметры как дата поступления на склад, планируемые даты отгрузки, ограничение по кол-ву одного вида товаров и т.д., то сразу видно насколько усложняется задача для реализации.

    Reply
  8. Anything

    (6) (7) Да, наверное, эти задачи можно решать с помощью ГА.

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

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

    Но чего-то я распессимизничался…

    Целиком и полностью поддерживаю это благое начинание! Надеюсь, автору (а возможно и нам вместе) удастся создать универсальный механизм, позволяющий искать решения с помощью ГА по заданным входящим параметрам на платформе 1С.

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

    Reply
  9. ArtemK

    В любом случае реализация методов ИИ на базе 1С — достойное дело. Тем более, что поле применения — широкое, а вот каких-то наработок — как кот наплакал.

    Reply
  10. Crag

    Алгоритм хороший, осмелюсь внести предложение по модернизации):

    Отбирать пары для скрещивания можно исходя не только из оценки, но еще методом турнирного отбора. Это позволит избежать появление доминируещего генотипа. Так же можно скрещивать всех со всеми, а потом уже отбирать.

    Успехов в реализации!

    Reply
  11. inse0f

    любопытно

    жаль только математику 1С считать будет очень медленно в любом случае

    поэтому только через ВК, иначе производительность ни к черту

    я тестал, надо было обработать 2ух мерный массив размером 640на480

    1с один обход делает около 10 секунд,

    dll-ка же обработала его за 0.1 секунды с учетом обращении к самой компоненте

    Reply
  12. inse0f

    когда скорость отличается на 2 порядка, это уже о чем то говорит..

    Reply
  13. ulen

    Для увеличения скорости лучше использовать внешнюю компоненту

    Reply
  14. CheBurator

    почитал.. освежил в памяти… особенно прикололо то, что из бессмысленного набора букв можно быстро получить нужную фразу (нэсэ галя воду)! офигеть! т.е. критерием является «разность» между тем что есть и ответом, который знаем…???? что-то я не втыкнул… что будет является критерием сходимости, когда конечный ожидаемый результат — неизвестен…? например: парименить ГА к задаче дефрагментации — для начала — например дефрагментация диска…

    ????

    Reply
  15. Crag

    Для этого существует так называемая Фитнес-функция. Которая по заранее определенному алгоритму делает оценку хромосомы. В данном случае — все очевидно, считаем количество совпадений. В более сложных задачах(например в классической задачи про комивояжера) оценивается длина пути и выбирается наименьшая.

    Про дефрагментацию, откровенно говоря, не понял.

    Reply
  16. CheBurator

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

    ..

    как вариант — дефрагментация размещения товара на 3D-складе…

    ..хотя, возможно, я ахинею несу…

    Reply
  17. Crag

    Здесь сложность будет — каким образом определить является ли это расположение оптимальным. Если это известно, то встанет вопрос с производительностью. Вряд ли на складе лежит три коробки, ведь так?

    К примеру мой ГА, написанный на Дельфи решал задачу комивояжера. Если надо было найти путь между, скажем, 100 городами, при большом размере популяции( больше 100) решение задачи занимало не одну минуту. В случае со складом и дефрагментацией — там и хромосомы огромными будут, и математика не малая. Лучше, по-моему, подобные задачи решать тривиально)

    Reply
  18. Ivan1874

    Интересное решение!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *