книги / Моделирование и оптимизация в LINGO
..pdfОна целесообразна, если требуется экспортировать только те данные, которые удовлетворяют условиям.
Примеры использования 2-й формы:
@OLE( 'RESULTS.XLS', 'WORKERS') = @WRITEFOR( DAYS( D) | START( DAYS) #GT# 0: DAYS( D), START( D));
Здесь экспортируются в диапазон WORKERS день и число работников, начинающих работать в этот день при условии, что оно не равно нулю. При этом WORKERS определяет 2 столбца.
Другой вариант:
@OLE( 'RESULTS.XLS', 'DAYS', 'START') = @WRITEFOR( DAYS( D) | START( DAYS) #GT# 0: DAYS( D), START( D));
В приведенном примере для каждого экспортируемого объекта определен свой диапазон.
Применим функцию @OLE в задаче Production для получения данных из Excel и экспорта решения в таблицу Excel. Модель исходной задачи с измененным разделом DATA приведена ниже:
MODEL: sets:
PRODUCT: order;
EQUIPMENT /1..3/: TWORK, K; PR_EQ (PRODUCT, EQUIPMENT): T, X; endsets
data:
!Импорт элементов множества, матрицы времен и значений заказов
PRODUCT, T, order= @OLE('C:\LINGO16\Samples\Production.xls');
K = 2 1 3;
!Экспорт решения
@OLE('C:\LINGO16\Samples\Production.xls')=X, TWORK; enddata
MIN = TIME;
@FOR(PRODUCT(I)|order #NE# 0: @SUM(EQUIPMENT(J): X(I,J))=order);
@FOR(EQUIPMENT(J): @SUM(PRODUCT(I)|order #NE# 0: T(I,J)*X(I,J))- TWORK(J)=0);
TIME = @MAX(EQUIPMENT: TWORK); @FOR(PR_EQ(I,J)|order(I) #NE# 0: @GIN(X));
@FOR( EQUIPMENT(J): @CARD( 'name'+ EQUIPMENT(J), K);
81
@FOR( PRODUCT(I)|order #NE# 0: @CARD('name'+ EQUIPMENT(J), X(I,J))
)
); END
До запуска решения сначала необходимо в Excel представить модель данных с поименованными диапазонами. Для нашей задачи модель данных (источник данных) представим следующей таблицей:
Модель данных |
|
EQUIPMENT |
|
ORDER |
||
PRODUCT |
1 |
|
2 |
|
3 |
|
|
|
|
||||
pr1 |
7 |
|
11 |
|
9 |
73 |
pr2 |
14 |
|
8 |
|
10 |
123 |
pr3 |
12 |
|
7 |
|
13 |
0 |
pr4 |
10 |
|
9 |
|
11 |
62 |
Для присвоения имен диапазонам выделяется соответствующий диапазон и командой Вставить/Имя/Присвоить заносится имя. В приведенной таблице выделены и поименованы 3 диапазона: PRODUCT, T (матрица времен) и ORDER.
Для записи экспортируемого решения создаем в Excel таблицу с выделенными диапазонами X (матрица решений) и TWORK (строка):
Решение |
|
EQUIPMENT |
|
ORDER |
||
PRODUCT |
1 |
|
2 |
|
3 |
|
|
|
|
||||
pr1 |
|
|
|
|
|
73 |
pr2 |
|
|
|
|
|
123 |
pr3 |
|
|
|
|
|
0 |
pr4 |
|
|
|
|
|
62 |
TWORK |
|
|
|
|
|
|
TIME |
|
0 |
|
|
|
В строке TIME для вычисления оптимального значения критерия записана функция Excel =МАКС(TWORK), так как TIME не переменная и ее значение экспортироваться не может. Кроме того, добавлен необязательный столбец ORDER для сопоставления выпуска продукции с заказом.
82
Как только решатель LINGO найдет оптимальное решение, оно будет отправлено в заготовленную таблицу Excel в диапазоны X и TWORK. В результате таблица решения принимает вид:
Решение |
|
EQUIPMENT |
|
ORDER |
|
PRODUCT |
1 |
2 |
|
3 |
|
|
|
||||
pr1 |
62 |
0 |
|
11 |
73 |
pr2 |
25 |
98 |
|
0 |
123 |
pr3 |
0 |
0 |
|
0 |
0 |
pr4 |
0 |
0 |
|
62 |
62 |
TWORK |
784 |
784 |
|
781 |
|
TIME |
|
784 |
|
|
|
При этом в окне отчетов LINGO получим:
Local optimal solution found.
Objective value: |
784.0000 |
Objective bound: |
784.0000 |
Infeasibilities: |
0.000000 |
Extended solver steps: |
2 |
Total solver iterations: |
654 |
Elapsed runtime seconds: |
0.64 |
Export Summary Report
---------------------
Transfer Method: OLE BASED
Workbook: |
C:\LINGO16\Samples\Production.xls |
|
Ranges Specified: |
|
2 |
X |
|
|
TWORK |
|
2 |
Ranges Found: |
|
|
Range Size Mismatches: |
0 |
|
Values Transferred: |
15 |
|
Model Class: |
|
PINLP |
Total variables: |
|
16 |
Nonlinear variables: |
3 |
|
Integer variables: |
|
18 |
Total constraints: |
|
8 |
Nonlinear constraints: |
1 |
|
Total nonzeros: |
26 |
|
Nonlinear nonzeros: |
3 |
83
Variable |
Value |
Reduced Cost |
TIME |
784.0000 |
0.000000 |
ORDER( PR1) |
73.00000 |
0.000000 |
ORDER( PR2) |
123.0000 |
0.000000 |
ORDER( PR3) |
0.000000 |
0.000000 |
ORDER( PR4) |
62.00000 |
0.000000 |
TWORK( 1) |
784.0000 |
0.000000 |
TWORK( 2) |
784.0000 |
0.000000 |
TWORK( 3) |
781.0000 |
0.000000 |
K( 1) |
2.000000 |
0.000000 |
K( 2) |
1.000000 |
0.000000 |
K( 3) |
3.000000 |
0.000000 |
T( PR1, 1) |
7.000000 |
0.000000 |
T( PR1, 2) |
11.00000 |
0.000000 |
T( PR1, 3) |
9.000000 |
0.000000 |
T( PR2, 1) |
14.00000 |
0.000000 |
T( PR2, 2) |
8.000000 |
0.000000 |
T( PR2, 3) |
10.00000 |
0.000000 |
T( PR3, 1) |
12.00000 |
0.000000 |
T( PR3, 2) |
7.000000 |
0.000000 |
T( PR3, 3) |
13.00000 |
0.000000 |
T( PR4, 1) |
10.00000 |
0.000000 |
T( PR4, 2) |
9.000000 |
0.000000 |
T( PR4, 3) |
11.00000 |
0.000000 |
X( PR1, 1) |
62.00000 |
0.000000 |
X( PR1, 2) |
0.000000 |
11.00000 |
X( PR1, 3) |
11.00000 |
0.000000 |
X( PR2, 1) |
25.00000 |
0.000000 |
X( PR2, 2) |
98.00000 |
8.000000 |
X( PR2, 3) |
0.000000 |
0.000000 |
X( PR3, 1) |
0.000000 |
0.000000 |
X( PR3, 2) |
0.000000 |
0.000000 |
X( PR3, 3) |
0.000000 |
0.000000 |
X( PR4, 1) |
0.000000 |
0.000000 |
X( PR4, 2) |
0.000000 |
9.000000 |
X( PR4, 3) |
62.00000 |
0.000000 |
Row |
Slack or Surplus |
Dual Price |
1 |
784.0000 |
-1.000000 |
2 |
0.000000 |
0.000000 |
3 |
0.000000 |
0.000000 |
4 |
0.000000 |
0.000000 |
5 |
0.000000 |
0.000000 |
6 |
0.000000 |
1.000000 |
7 |
0.000000 |
0.000000 |
8 |
0.000000 |
1.000000 |
84
Данный отчет отличается от стандартного только вставкой Export Summary Report, в которой приводятся данные о выполненном экспорте (метод, место файла-приемника, специфицированное и найденное число диапазонов и количество экспортированных переменных).
Интересно заметить, что это решение привело к локальному минимуму, который отличается от ранее найденных минимумов, что еще раз свидетельствует о многоэкстремальности исходной (нелинейной) модели.
8.2.2. Встраивание моделей LINGO в Excel
Модель LINGO может встраиваться (внедряться) в Excel в качестве объекта. Как и выше, на листе Excel представляем исходные данные и таблицу-приемник решения. Командой Excel Вставка/Объект получаем перечень доступных объектов и в нем выбира-
ем объект LINGO Document (рис. 5).
Рис. 5
В результате на листе Excel появляется выделенная область модели, которую можно перемещать, и изменять ее размеры (рис. 6).
85
Рис. 6
При этом под заголовком окна Excel появляется меню и панель инструментов LINGO, предоставляя тем самым все функции LINGO в работе с моделью. Теперь вводим (или вставляем копию) модель в выделенную область и нажимаем кнопку Решить (имеет вид мишени для стрельбы). В итоге получаем решение, представленное во второй таблице (рис. 7).
Рис. 7
86
Когда модель становится неактивной, восстанавливаются меню и панель инструментов Excel.
Заметим, что если на листе данных поместить диаграмму, отражающую результаты решения, то она также будет обновляться при каждом новом решении.
8.2.3. Встраивание листов Excel в LINGO
Наряду с встраиванием LINGO в Excel возможен и обратный вариант: встраивание листа Excel в LINGO. Рассмотрим это на примере той же модели Production. Сначала откроем ее в LINGO (рис. 8).
Рис. 8
Затем командой Edit|Insert New Object открывается окно «Вставка объекта», в котором выбирается вариант создания объекта из файла, записывается имя файла Excel и устанавливается флажок «Связь» (рис. 9).
После нажатия кнопки OK увидим наш лист Excel, встроенный в окно модели LINGO (рис. 10).
87
Рис. 9
Рис. 10
88
Для доступа к редактированию таблицы достаточно дважды кликнуть по ней. В результате откроется Excel с нашим листом. При сохранении модели сохраняется и связь с Excel.
После решения модели результаты отразятся на встроенном листе Excel. В нашем случае согласно модели появится и текстовый отчет, аналогичный тому, что получен при экспорте решения с помощью функции @OLE.
8.2.4. OLE автоматизация в LINGO
Еще один вариант взаимодействия Excel и LINGO позволяет осуществить OLE автоматизация. Она устанавливает между ними кли- ент-серверное отношение. При этом все данные и модель располагаются в Excel, а для связи с LINGO используются макросы Excel VBA. Как это реализуется, покажем на примере решения задачи PRODUCTION.
На первом листе книги Excel размещаем, как и ранее, таблицу с данными и таблицу для решения, а также для наглядности добавляем диаграмму (рис. 11).
Диапазонам ячеек в обеих таблицах присваиваем соответствующие модели имена. Например, в таблице данных диапазону B4:D7 присвоено имя T, а E4:E7 – ORDER, в таблице Решение диа-
пазон B13:D16 имеет имя X, а B17:D17 – TWORK.
На втором листе записываем командный скрипт решения нашей модели, и соответствующему диапазону ячеек присваиваем имя
MODEL (рис. 12).
Для связи с LINGO добавляем к первому листу макросы Auto_Open и LingoSolve:
Dim LINGO As Object Sub Auto_Open()
Set LINGO = CreateObject("LINGO.Document.4") End Sub
Sub LINGOSolve() Dim iErr As Integer
iErr = LINGO.RunScriptRange("MODEL") If (iErr > 0) Then
MsgBox ("Unable to solve model") End If
End Sub
89
Выпуск продукции
Рис. 11
В первом макросе функцией CreateObject LINGO декларируется как объект и присоединяется к приложению LINGO. Этот макрос выполняется всегда при открытии листа.
Второй макрос реализует OLE Automation, обеспечивая вызов метода экспорта LINGO RunScriptRange и передачу ему имени диапазона MODEL. Процедура RunScriptRange вызывает Excel для получения содержимого диапазона MODEL и начинает обработку содержащихся в нем команд. Если задача не решается (код ошибки больше 0), выдается соответствующее сообщение.
Наконец, на первый лист Excel помещаем кнопку Решение и назначаем ей макросы. Теперь, нажав эту кнопку, получаем результаты, представленные на скриншоте в таблице Решение и на столбиковой диаграмме (рис. 13).
90