gifts2017

Внешняя компонента Симплекс-метод

Опубликовал lavrik (lavrik) в раздел Программирование - Внешние компоненты

Внешняя компонента 1С для решения задач оптимизации (задачи линейного программирования) с помощью симплекс-метода.
Представим себе такую задачу.
Фирма, производящая некоторую продукцию осуществляет её рекламу двумя способами через радиосеть и через телевидение. Стоимость рекламы на радио обходится фирме в 5$, а стоимость телерекламы - в 100$ за минуту.
Фирма готова тратить на рекламу по 1000$ в месяц. Так же известно, что фирма готова рекламировать свою продукцию по радио по крайней мере в 2 раза чаще, чем по телевидению.
Опыт предыдущих лет показал, что телереклама приносит в 25 раз больший сбыт продукции, нежели радиореклама.
Задача заключается в правильном распределении финансовых средств фирмы.
Это и есть пример задачи оптимизации. В данном случае в задаче всего две неизвестных и она может быть решена с помощью, например, графического метода. В общем случае решаются такие задачи с помощью методов линейного программирования. Симплекс-метод – наиболее популярный среди них.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
vk_simplex.zip
.1169038007 76,01Kb
25.09.09
143
.1169038007 76,01Kb 143 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Игорь (IgorMgn) 09.03.07 12:58
Реальная компонента. Конечно совсем уж "Поиск решения" Excel не заменит, но кое-что можно сделать без выгрузки данных в Excel! +1, несомненно!
2. oleg (gelotus) 01.06.07 17:29
А можно исходный код компоненты?
3. Игорь Савонов (savonov) 01.06.07 19:08
5. Валерий Павловский (Pavlovsky) 28.09.10 16:54
Чего то у меня возникли проблемы с ВК.
Вот такая задача:
36 17
0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 -9 = 4
1 1 0 0 -1 0 1 1 1 0 0 0 0 1 1 0 -5 >= 22
-2 -1 0 0 1 -1 -2 -1 0 1 -1 -1 -1 -1 0 1 9 >= 22
1 0 0 0 -1 0 0 -1 -1 -1 1 0 -1 -1 -1 -1 7 >= 22
-1 -1 -1 0 1 0 -1 -1 -1 0 -1 0 0 -1 -1 0 9 >= 58
1 1 0 -1 -1 1 2 1 0 -1 1 1 1 1 0 -1 -5 >= 58
-1 -1 -1 0 0 0 -1 -2 -1 0 0 0 -1 -1 -1 0 11 >= 58
0 -1 -1 -1 0 0 0 -1 -2 -1 0 0 0 -1 -1 -1 11 >= 22
1 1 0 0 0 1 1 1 0 -1 1 1 1 1 0 0 -7 >= 22
1 1 1 0 0 1 2 2 2 1 0 0 1 1 1 0 -13 >= 22
0 1 1 1 0 -1 0 1 1 1 0 0 0 1 1 1 -7 >= 58
-1 -1 0 0 0 -1 -2 -1 0 0 -1 -1 -1 -1 0 0 11 >= 58
2 2 1 0 -1 1 2 2 1 0 1 1 1 1 1 0 -14 >= 58
-1 0 1 1 1 -1 -1 0 1 1 -1 -1 0 0 0 1 0 >= 58
0 0 0 0 -1 0 0 0 0 0 0 0 -1 0 0 -1 4 >= 22
-2 -2 -1 0 1 -1 -2 -2 -1 0 -1 0 0 -1 0 1 12 >= 22
1 0 -1 -1 -1 1 1 0 -1 -1 1 0 0 0 -1 -1 4 >= 58
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 >= 58
-1 -1 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0 6 >= 58
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 >= 58
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >= 58
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >= 22
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >= 58
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 >= 58
0 0 0 0 0 -1 -1 -1 -1 -1 0 0 0 0 0 0 6 >= 58
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 >= 58
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 >= 58
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 >= 58
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 >= 58
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 >= 58
0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 6 >= 58
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 >= 58
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 >= 58
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 >= 58
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 >= 58
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 >= 58
min
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

решение у нее есть стопудово

58, 197/2, 58, 58, 58, 58, 259/4, 58, 259/4, 58, 58, 58, 58, 58, 58, 58, 259/4

А ВК отказывается решать эту задачу выдает результат 0 и все.
6. lavrik (lavrik) 29.09.10 09:50
Pavlovsky: пришлите, пожалуйста, Вашу реализацию в 1с на эл. адрес, указанный в описании к компоненте, постараюсь рассмотреть Ваш пример.
7. Валерий Павловский (Pavlovsky) 29.09.10 11:00
Спасибо за оперативный ответ. В прикрепленном файле обработка, где все команды прописаны в явном виде. Дело может в том, что для заданных ограничений существует бесконечно много решений где достигается минимум.
Прикрепленные файлы:
симплекс.ert
8. Валерий Павловский (Pavlovsky) 29.09.10 11:43
максимально локализовал баг

Попытка
ЗагрузитьВнешнююКомпоненту("vk_simplex.dll");
Исключение
Сообщить("Не удалось загрузить внешнюю компоненту vk_simplex", "!");
СтатусВозврата(0);
Возврат;
КонецПопытки;
// создаем объект Симплекс
Симплекс = СоздатьОбъект("AddIn.vk_simplex");
// можно на всякий случай очистить исходные данные и результаты предыдущих расчетов
Симплекс.Очистить();
//целевая функция
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(1);
//формирование ограничений
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(6);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
// выполняем расчет
Симплекс.ВыполнитьРасчет(0);
// вывод результатов
Симплекс.ВыбратьРезультаты();
Инд=0;
Пока Симплекс.ПолучитьРезультат() = 1 Цикл
Сообщить(Окр(Симплекс.Результат,0));
КонецЦикла;
Сообщить("Сумма " + Окр(Симплекс.РезультатФункции,0));

Решение очевидно 58, а выдает 0
9. Валерий Павловский (Pavlovsky) 29.09.10 11:45
Хм. Если убрать еще одну переменную, то выдает правльный ответ

//целевая функция
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(0);
Симплекс.ДобавитьКоэффициентФункции(1);
//формирование ограничений
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(-1);
Симплекс.ДобавитьКоэффициентОграничения(5);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.НовоеОграничение(1, 58);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(0);
Симплекс.ДобавитьКоэффициентОграничения(1);
10. Stepan Shipitsyn (Stepan_1c) 27.09.11 15:02
11. Алексей Горнеев (gorneev) 12.11.11 18:32
Огромное спасибо за компоненту!!! Помогло в конфигурации по комбикормам!!!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа