Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Моделирование и оптимизация в LINGO

..pdf
Скачиваний:
10
Добавлен:
12.11.2023
Размер:
2.55 Mб
Скачать

Она целесообразна, если требуется экспортировать только те данные, которые удовлетворяют условиям.

Примеры использования 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

Соседние файлы в папке книги