Podstawowe elementy modelu AMPL problemu liniowego(pl)

Podobne dokumenty
Laboratorium WDEC. Opis posługiwania się pakietem AMPL

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce.

4. Funkcje. Przykłady

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Obliczenia iteracyjne

Wstęp do programowania

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

AHDL - Język opisu projektu. Podstawowe struktury języka. Komentarz rozpoczyna znak i kończy znak %. SUBDESIGN

METODA SYMPLEKS. Maciej Patan. Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Notatki do tematu Metody poszukiwania rozwiązań jednokryterialnych problemów decyzyjnych metody dla zagadnień liniowego programowania matematycznego

Programowanie liniowe

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Mikrokontroler ATmega32. Język symboliczny

Wprowadzenie do Mathcada 1

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Rozdział 6 PROGRAMOWANIE WYPUKŁE I KWADRATOWE

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Cw.12 JAVAScript w dokumentach HTML

Rozdział 2 PROGRAMOWANIE LINIOWE CAŁKOWITOLICZBOWE

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

ZAGADNIENIE TRANSPORTOWE

AKADEMIA MORSKA W SZCZECINIE WI-ET / IIT / ZTT. Instrukcja do zajęc laboratoryjnych nr 1 AUTOMATYZACJA I ROBOTYZACJA PROCESÓW PRODUKCYJNYCH

Programowanie w Turbo Pascal

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Wstęp do informatyki- wykład 11 Funkcje

Rekurencja (rekursja)

A. Kasperski, M. Kulej Badania Operacyjne- programowanie liniowe 1

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Przykład 1 -->s="hello World!" s = Hello World! -->disp(s) Hello World!

Rozdział 3 ZADANIE TRANSPORTOWE I PROBLEM KOMIWOJAŻERA

Elementy języków programowania

Programowanie liniowe całkowitoliczbowe. Tadeusz Trzaskalik

Języki programowania zasady ich tworzenia

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Zestaw 3. - Zapis liczb binarnych ze znakiem 1

ZAGADNIENIA PROGRAMOWANIA LINIOWEGO

Wstęp do informatyki- wykład 9 Funkcje

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Podstawy Programowania

Programowanie w języku Python. Grażyna Koba

Podstawy programowania skrót z wykładów:

MATLAB - laboratorium nr 1 wektory i macierze

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

7. Pętle for. Przykłady

LibreOffice Calc VBA

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

1 Wprowadzenie do algorytmiki

Układy równań i nierówności liniowych

3. Instrukcje warunkowe

GRUPA ĆWICZENIOWA (ZAKREŚL ODPOWIEDNIĄ): MG8 MG13 MB13 MD13 BT13

JAVAScript w dokumentach HTML (1)

Ćwiczenie 1. Matlab podstawy (1) Matlab firmy MathWorks to uniwersalny pakiet do obliczeń naukowych i inżynierskich, analiz układów statycznych

WYDZIAŁ ELEKTROTECHNIKI, AUTOMATYKI I INFORMATYKI INSTYTUT AUTOMATYKI I INFORMATYKI KIERUNEK AUTOMATYKA I ROBOTYKA STUDIA STACJONARNE I STOPNIA

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Algorytmika i Programowanie VBA 1 - podstawy

Rozdział 1 PROGRAMOWANIE LINIOWE

Metoda simpleks. Gliwice

Metody i analiza danych

Rozdział 1 PROGRAMOWANIE LINIOWE

Administracja sieciowymi systemami operacyjnymi III Klasa - Linux

Polcode Code Contest PHP-10.09

Wprowadzenie do programu Mathcad 15 cz. 1

Warsztaty dla nauczycieli

Projektowanie aplikacji internetowych Pisanie skryptów wiersza poleceń - pętle

Badania operacyjne. Dr hab. inż. Adam Kasperski, prof. PWr. Pokój 509, budynek B4 Materiały do zajęć dostępne na stronie:

Podstawy Programowania C++

Metody numeryczne Laboratorium 2

PętlaforwOctave. Roman Putanowicz 13 kwietnia 2008

Pascal - wprowadzenie

Kompilator języka Basic można bezpłatnie pobrać ze strony z zakładki DOWNLOAD.

Metoda graficzna może być stosowana w przypadku gdy model zawiera dwie zmienne decyzyjne. Metoda składa się z dwóch kroków (zobacz pierwszy wykład):

Plan wykładu. Przykład. Przykład 3/19/2011. Przykład zagadnienia transportowego. Optymalizacja w procesach biznesowych Wykład 2 DECYZJA?

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

III TUTORIAL Z METOD OBLICZENIOWYCH

n, m : int; S, a, b : double. Gdy wartości sumy składowej nie można obliczyć, to przyjąć Sij = 1.03 Dla obliczenia Sij zdefiniować funkcję.

Algorytmy i struktury danych. Wykład 4

SKRYPTY. Zadanie: Wyznaczyć wartość wyrażenia arytmetycznego

//warunki początkowe m=500; T=30; c=0.4; t=linspace(0,t,m); y0=[-2.5;2.5];

Wykorzystanie programów komputerowych do obliczeń matematycznych

Zadania rachunkowe z termokinetyki w programie Maxima

Przykład wykorzystania dodatku SOLVER 1 w arkuszu Excel do rozwiązywania zadań programowania matematycznego

PASCAL. Etapy pisania programu. Analiza potrzeb i wymagań (treści zadania) Opracowanie algorytmu Kodowanie Kompilacja Testowanie Stosowanie

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

JAVASCRIPT PODSTAWY. opracowanie: by Arkadiusz Gawełek, Łódź

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

Algorytmy przeszukiwania wzorca

OPTYMALIZACJA DYSKRETNA

Lab 9 Podstawy Programowania

1. Wypisywanie danych

Zakładka Obmiar jest dostępna dla pozycji kosztorysowej w dolnym panelu. Służy do obliczania ilości robót (patrz też p ).

Transkrypt:

Wstęp Program GUSEK służy do rozwiązywania modeli programowania liniowego i dyskretnego(całkowitoliczbowego i binarnego). Do zapisu modelu zgadnienia programowania liniowego: n Max(Min)z = c j x j j=1 n a ij x j <= b i,i = 1,2,...,m j=1 x j 0,j = 1,2,...,n używa się języka programowania GNU MathProg będącego podzbiorem języka AMPL. Podstawowe elementy modelu AMPL problemu liniowego(pl) Zapis zagadnienia programowania liniowego ma w języku AMPL następujacą bazową strukturę: Reprezentacja algebraiczna 1.Deklaracje zbiorów. 2.Deklaracje parametrów. 3.Deklaracje zmiennych. 4.Reprezentacja modelu(funkcji celu i ograniczeń). Implementacja modelu 5.Rozwiązanie modelu. 6.Prezentacja wyników. 7.Dane wejsciowe. Tablica 1: Elementy modelu AMPL Zaletą tego zapisu jest, że model może być użyty do rozwiązywania liniowych problemówdowolnegorozmiarupoprzezzmianędanychwejściowych:m,n,c j,a ij,b i. W zapisie modelu AMPL muszą być stosowane następujace reguły: 1. Plik musi być zwykłym tekstem(utworzonym dowolnym edytorem). 2. Komentarz może być poprzedzony znakiem# i kończyć się znakiem końca linii(może pojawić się w dowolnym miejscu modelu) lub być dowolnym tekstem zawartym pomiędzy znakami\* Dowolny tekst\*. 3. Każda instrukcja wyłączając komentarz musi się kończyć średnikiem(;).

4. Instrukcja języka AMPL może zajmować więcej niż jedną linię, dopuszczalne są znaki przestankowe jak spacja, dwukropek, przecinek, nawiasy okrągłe, kwadratowe, klamrowe oraz operatory matematyczne. Wyjątkiem są łańcuchy(nazwy), które powinny być wzięte w cudzysłowy pojedyńcze lub podwójne, gdzie znaki przestankowe powinny być poprzedzone symbolembackslash(\). 5. Wszystkie słowa kluczowe pisane są małymi literami. 6. W nazwach stosowanych przez użytkownika rozróżnia się duże i małe litery. Nazwy muszą być alfanumeryczne(ciąg znaków zaczynający się od litery) ewentualnie rozdzielone, jeśli potrzeba, podkreśleniem(). Podamy teraz przykład problemu planowania produkcji na którym zilustrujemy budowę modelu AMPL. Przykład 1. Produkcja farb- Firma MKsa Firma MKsa produkuje z dwóch surowców M1 i M2 dwa rodzaje farb: wewnętrzne (FW) i zewnętrzne(fz). Tabela 2 zawiera podstawowe dane: Badania rynku Zużycie(t) surowca na tonę Maksymalny limit farby FZ farby FW dzienny(t) Surowiec M1 6 4 24 Surowiec M2 1 2 6 Zysk na tonę(1000pln) 5 4 Tablica 2: Dane do problemu MKsa wykazały, że dzienny popyt na farbę wewnętrzną(fw) nie może przekroczyć o więcej niż jedną tonę popytu na farbę zewnętrzną(fz). Ponadto maksymalny dzienny popyt na farbę wewnętrzną wynosi 2t. Firma MKsa chce wiedzieć ile produkować każdej z farb aby zmaksymalizować dzienny zysk. Definiując zmienne decyzyjne: x 1 -ilość(t)dziennejprodukcjifarbyzewnętrznej(fz), x 2 -ilość(t)dziennejprodukcjifarbywewnętrznej(fw) mamy następujący liniowy model tego problemu: Typyzmiennych:x 1 0, x 2 0. Funkcjacelu: maxz = 5x 1 +4x 2 (Zysk). Ograniczenia: 6x 1 +4x 2 24[SurowiecM1] x 1 +2x 2 6[SurowiecM2] x 1 +x 2 1[Wymaganierynkowe] x 2 2[Limitpopytu]

Model tego problemu zapisany w języku AMPL może być postaci(słowa kluczowe pisane są pismem półgrubym) podanej tabeli 3: Wpisując ten plik pod var x1 >= 0; var x2 >= 0; maximize z : 5 x1+4 x2; subject to c1 : 6 x1+4 x2 <= 24; c2 : x1+2 x2 <= 6; c3 : x1+x2 <= 1; c4 : x2 <= 2; solve; display 5 x1+4 x2,x1,x2; Tablica 3: Model problemu MKsa nazwą MKsa.mod(konieczne jest rozszerzenie mod po kropce) do systemu GU- SEK i klikając opcję Run na pasku głównym otrzymamy wyniki: OPTIMAL SOLUTION FOUND 21 X1 = 3 X2 = 1.5 Model has been successfully processed. W podanym powyżej modelu wiersze 1 i 2 to deklaracje zmiennych nieujemnych, funkcja celu modelu jest zadeklarowana w wierszu 3. Wiersz 4 zawiera słowo kluczowe subject to, które można opcjonalnie opuścić. Ograniczenia modelu są zapisane w wierszach 4(można opuścić),5,6,7 i 8. Wiersz 9(solve;) zawiera polecenie rozwiazania modelu a ostatni wiersz: display z, x1, x2; polecenie wydruku wyników tj. optymalnej wartości funkcji celu i optymalnych wartości zmiennych modelu(argumenty instrukcji display rozdzielone są przecinkami). W powyższym przykładzie nie wystąpiły elmenty 1,2 i 7 bazowej struktury modelu AMPL. W następnym rozdziale pokażemy w tabeli 4 inną wersję modelu wykorzystujacą te elementy.

Definiowanie zbiorów, parametrów i zmiennych #*********************Modelalgebraiczny********************* # -deklaracjezbiorów(1) set farby; set zasoby; # deklaracjeparametrów(2) param jednostkowyzysk{farby}; param limit{zasoby}; param aij{zasoby,farby}; # -deklaracjezmiennychdecyzyjnych(3) var product{farby} >=0; # -model(4) maximize zysk: sum{j in farby} jednostkowyzysk[j]*product[j]; ograniczenie{i in zasoby}: sum{j in farby} aij[i,j]*product[j] <= limit[i]; # -rozwiązanie(5) solve; # -wydrukwyników(6) display zysk,product; # -danedomodelu(7) data; setfarby:=fzfw; set zasoby:=m1 M2 Rynek Popyt; param jednostkowyzysk:=fz 5 FW 4; paramlimit:=m124m26rynek1popyt2; paramaij:fzfw:= M164 M212 Rynek-11 Popyt01; end; Tablica 4: Model AMPL problemu MKsa z indeksami nazwowymi Algebraiczna reprezentacja modelu(tablica 4) zaczyna się od deklaracji zbiorów, które definiują indeksy ogólnego modelu liniowego. Użytkownik nadaje nazwy zasoby i farby dla zbiorów indeksów odpowiadających odpowiednio zbiorom {i} oraz {j} w modelu liniowym. Konkretne elementy zbiorów zasoby i farby, które definiują problem RMsa są dostarczone w części danych wejściowych(pkt 7 ogólnego schematu) modelu.

Parametrami są nazwy nadawane przez użytkownika poprzedzone słowem kluczowym param, które definiują wspólczynniki funkcji celu i współczynniki ograniczeń jako funkcję zmiennych i zbiorów ograniczeń. Parametry: jednostkowyzysk{farby}, aij{zasoby,farby} oraz limit{zasoby} odpowiadająodpowiedniomatematycznymsymbolom c j,a ij i b i modeluliniowego. Indeksy i oraz j są reprezentowane w AMPL odpowiednio zbiorami zasoby i farby. Konkretne wartości tych parametrów są dostarczane w części danych wejściowych modelu AMPL. Zmiennemodelu, x j mająnazwęproduktisąpoprzedzonesłowemkluczowym var. Jak poprzednio produkt jest funkcją zbioru farby. W deklaracji zmiennej możemy dodać warunek nieujemności(>=). W przypadku jego opuszczenia zmienna może przymować dowolne wartości(tj. dodatnie lub ujemne). Ponadto po nazwie zmiennej może wystąpić słowo kluczowe integer lub binary, gdy zmienna ma przyjmować tylko wartości całkowite lub binarne(zero lub jeden) w problemach dyskretnych. Definiowanie funkcji celu i ograniczeń Mając zdefiniowane zbiory, parametry i zmienne modelu(pkty 1,2 i 3) następnym krokiem jest wyrażenie problemu optymalizacji za pomocą tych elementów. Deklaracja funkcji celu określa typ optymalizacji używając słów kluczowych maximize lub minimize. Funkcja celu z ma nazwę zysk, po której występuje dwukropek(:). Wyrażenie matematyczne c j x j jest reprezentowane w języku AMPL następującą instrukcją: j sum{j in farby} jednostkowyzysk[j]*produkt[j]; Indeks j jest wybierany(jego nazwa) przez użytkownika. Zwróć uwagę, że używamy nawiasów klamrowych w {j in farby} aby pokazać, że wartości indeksu j są elementami zbioru farby, a użycie nawiasów kwadratowych [j] reprezentuje indeks. Model może zawierać jedno lub więcej ograniczeń, z których każde musi mieć nazwę nadaną przez użytkownika. W rozpatrywanym modelu mamy jeden zbiór ograniczeń o nazwie limit indeksowany zbiorem zasoby: limit{i in zasoby}: sum{j in farby} aij[i,j]*produkt[j] <= ograniczenie[i];

Tainstrukcjajestbezpośrednimzapisemi-tegoograniczenia: j a i,jx j b i. AMPL dopuszcza wprowadzenie ograniczeń dolnych i górnych na wartości zmiennych decyzyjnych. Można to zrobić na etapie deklaracji zmiennych(nie trzeba wprowadzać dodatkowych ograniczeń w modelu). W tym celu deklaruje się dwa parametry o nazwach np. dolneograniczenie i gorneograniczenie jako: param dolneograniczenie{farby}; param gorneograniczenie{farby}; a następnie zmienne są definiowane jako: var produkt{j in farby}>=dolneograniczenie[j],<=gorneograniczenie[j]; UWAGA! Syntaktyka języka nie dopuszcza porównywania wektorów, zatem błędna jest deklaracja: var produkt{farby}>=dolneograniczenie{farby},<=gorneograniczenie{farby}; (Wyjątkiem od tej reguły jest sytuacja, gdy jeden z wektorów jest zerowym- tak np. deklaracja var produkt{farby} >= 0: definiująca warunek nieujemnosci zmiennych jest poprawna). Dla parametrów obowiązują te same reguły i tak deklaracja: param gorneograniczenie{j in farby}>=dolneograniczenie[j]; gwarantuje, że gorneograniczenie jest zawsze nie mniejsze niż dolneograniczenie. Specyfikacja danych wejściowych Algebraiczny model może być zastosowany do problemu o dowolnej liczbie zmiennych i ograniczeń. Zastosowanie tego modelu do problemu MKsa dokonuje się poprzez specyfikację danych, dokonywaną w części modelu po deklaracji dane;(7). Najpierw definiujemy nazwy w części deklaratywnej zbiorów a następnie wykorzystując te definicje przypisujemy numeryczne wartości różnym parametrom. Zbiór farby zawiera nazwy dwu zmiennych FZ i FW. Natomiast zbiór zasoby zawiera elementy o nazwach: M1, M2, Rynek i Popyt. Odpowiednie deklarcje w części danych wejściowych są następujące: setfarby:=fzfw; set zasoby:=m1 M2 Rynek Popyt; Elementy zbioru występujące po znaku operatora:=(symbol zarezerwowany) są oddzielone spacją(lub przecinkiem). Indeksy będące nazwami(symbolami alfanumerycznymi tj. nie będące liczbami) muszą być zawarte w podwójnych apostrofach, jeśli występują poza segmentem danych wejściowych modelu, np. odwołanie się do konkretnej wartości parametru musi mieć postać: farby[ Z ],farby[ FW ],limit[ M1 ],limit[ M2 ],limit[ Rynek ],limit[ Popyt ]. W przeciwnym przypadku indeks będzie błędnie interpretowany jako numeryczny parametr.

Można również zdefiniować zbiory w części deklaratywnej modelu algebraicznego(zamiast w części danych wejściowych) i wtedy taka deklaracja ma następująca postać: setfarby:= { FZ, FW }; setzasoby:= { M1, M2, Rynek, Popyt }; Konieczne jest tu użycie nawiasów klamrowych, podwójnych apostrofów i przecinków oddzielających poszczególne elementy zbioru. Definiowanie zbiorów liczbowych Użycie alfanumerycznych nazw dla zbiorów(np. w problemie MKsa nazw farby i zasoby) może być niewygodne dla dużych problemów. W takim przypadku wygodniejsze są indeksy numeryczne(liczbowe), np.: set farby:= 1..2; set zasoby:= 1..4; Zapis 1..4 reprezentuje zbiór(zakres wartości indeksu) {1, 2, 3, 4} i jest szczególnie użyteczny dla dużych zbiorów. Np. 1..1000 jest zbiorem 1000 kolejnych liczb od 1 do 1000. Instrukcja 1..m(lub n) ma następującą postać ogólną: start..end by krok, gdzie start,end i krok sa parametrami, których warości mogą być podane w częscidata;.jeślistart <end ikrok >0,toelementamitegozbiorusa:start, start+krok, itd. Ostatni największy element ma wartość mniejszą lub równą end. Możebyćrównieżstart >endikrok <0iwtedydeklaracja 10..3by-2 generuje zbiór o elementach 10,8,6,4. Domyślną wartością dla krok jest 1 co oznacza, że deklaracja jest identyczna z deklaracją start..end by 1 start..end. Ogólnie start,end i krok mogą być dowolnymi poprawnymi w AMPL wyrażeniami matematycznyminp.dladanychwartościparametrów minzbiór 2 n..m+n 2 by n/2 jest poprawnie zdefiniowany. Również wartość krok nie musi być liczbą całkowitąnp.dla m = 5in=13elementamizbioru m..nby m/2sąliczby 5,7.5,10,12.5.

Parametry jedno i dwu-indeksowe Można zdefiniować ogólnie zakres wartości indeksu najpierw definiując wartości minjakoparmetry: param m; param n; Wtedy zbiory 1..m, i 1..n mogą być używane bezpośrednie w całym modelu(bez potrzeby deklarowania nazw zasoby i farby). Ilustruje to model problemu MKsa podany w tabeli 5. W powyższym modelu mamy dwa jedno-indeksowe parametry: param m; param n; param jednostkowyzysk{1..n}; param limit{1..m}; paramaij{1..m,1..n}; # -zmienne var produkt{1..n}>= 0; # model maximize zysk: sum{j in 1..n}jednostkowyzysk[j]*produkt[j]; limit{i in 1..m}: sum{j in 1..n}aij[i,j]*produkt[j]; # Rozwiązanieiprezentacjawyników solve; display zysk,sum{j in 1..n}jednostkowyzysk[j]*produkt[j],produkt; # danewejściowe data; param m:=4; param n:=2; param jednostkowyzysk:=1 5 2 4; paramlimit:=124263142; paramaij:12:= 164 212 3-11 401; end; Tablica 5: Model AMPL problemu MKsa z indeksami numerycznymi jednostkowyzysk i limit i jeden dwu-indeksowy parametr aij. Dane dla pierwszego rodzaju parametrów specyfikujemy listując kolejno numer elmentu zbioru a następnie(co najmniej jedna spacja odstępu) jego wartość. W sytuacji, gdy zakres indeksu zdefiniowany jest zbiorem alfanumerycznym tak jak w modelu z tablicy 4 specyfikacja wartości parametrów jednostkowyzysk i limit jest następująca:

param jednostkowyzysk:= FZ5 FW4; param limit:= M124 M26 Rynek 1 Popyt 2; Elementy listy mogą być zapisane w jednej linii ale muszą być oddzielone co najmniej jedną spacją. Dane wejściowe dla dwu-indeksowanego parametru aij są zapisywane podobnie z tym, że kolejność kolumn musi być podana po nazwie parametru zakończonej dwukropkiem(aij:) celem eliminacji niejednoznaczności. W przypadku indeksów zadanych zbiorem alfanumerycznym tak jak w modelu 4 specyfikacja jest następujaca: paramaij:fzfw:= M164 M212 Rynek-11 Popyt01; AMPL umożliwia nadanie domyślnychych wartości wszystkim elementom danegoparemetru.załóżmy,żedlaparametru cmamyże c 1 = 11, c 8 = 22oraz c i = 0dla i = 2,3,...,7.Zwykłaspecyfikacjatychdanychbyłabynastępująca: paramc{1..8};... data; paramc:=111203040506070822; Natomiast bardziej zwartą postać daje użycie nastepujących instrukcji: param c{1..8} default 0;... data; paramc:=111822; Instrukcja display domyślnie wyświetla wyniki na ekranie. Nie jest to jedyny sposób przentacji wyników. Możliwe jest przekazywanie wyników obliczeń na zewnętrzne pliki umieszczając znak > i nazwę pliku(>nazwa), w którym chcemy mieć wyniki, bezpośrednio przed średnikiem kończącym instrukcję. W rozważanych przykładach modeli cały AMPL model znajdował się w jednym pliku, któremu użtkownik nadaje nazwę z rozszerzeniem mod po kropce, np. MKsa.mod. W wielu przypadkach algebraiczny model problemu rozwiązuje się dla kilku zbiorów danych lub dane do modelu ptrzechowywane są na zewnętrzych nośnikach.

W tym celu model AMPL może być reprezentowany przez dwa oddzielne pliki: np. dla problemu MKsa plik MKsa.mod zawierający model algebraiczny łącznie z instrukcjami solve i display oraz plik MKsa.dat zawierający dane wejściowe dla modelu. Wyrażenia matematyczne i wyliczalne parametry Język AMPL umożliwia nie tylko wprowadzenie ograniczeń dolnych i górnych na wartości parametrów ale pozwala również na bardziej elastyczne definiowanie parametrów jako złożonych wyrażeń matematycznych, ewentualnie modyfikowanych warunkowo. Dla ilustracji rozważmymy model problemu, w którym maksmalizujemy funkcję celu, której współczynniki są funkcją dwóch paramentrów(r i v). Interesująca część modelu AMPL ma postać: paramr{1..n}> 0, < 1; paramv{1..n}> 0, < 1; var x{1..n}>= 0; maximizez:sum{iin1..n}(r[i] v[i] (r[i]+1)) x[i]; (ograniczenia) Innym sposobem jest w tej sytuacji użycie nowego parametru c którego wartości są obliczane(przy definiowaniu parametru) następująco: paramr{1..n}> 0, < 1; paramv{1..n}> 0, < 1; paramc{iin1..n}=(r[i] v[i] (r[i]+1)); var x{1..n}>= 0; maximizez:sum{iin1..n }c[i] x[i]; (ograniczenia) Wyrażenia definiujące parametr mogą zawierać dowolne arytmetyczne funkcję(np. sin, max, log, sqrt, exp), których obliczana wartość jest wartością numeryczną. Do obliczenia wartości parametrów może być stosowana następująca konstrukcja warunkowa: parametr = if warunek then wyrażenie1 else wyrażenie2; Warunek porównuje arytmetyczne wielkości i symbole(strings) używając operatorów =,<,>,<=,>=,<>(równieżlogicznych / ),któreniemusząbyć funkcjami zmiennych modelu. Konstrukcja może być także używana bez else wyrażenie2 jak również może być zagnieżdzona po else. Konstrukcja if-then-else przypisuje obliczalnemu parametrowi numeryczną wartość wyrażenie1 lub wyrażenie2 zatem jest ona wyrażeniem a nie instrukcją. Zastosowanie tej konstrukcji pokażemy na następującym przykładzie. Firma produkuje pewien produkt w celu zaspokojenia popytu w nadchodzących miesiącach. Jednostkowy koszt produkcji

wynosi pzł.dlapierwszym mmiesięcyiwzrastao10%wnastępnych mmiesiącach i o 20% w następnych m miesiącach. Pominiemy ograniczenia w modelu, aby zademonstrować tylko działanie konstrukcji if. Niech x j =ilośćproduktuwytwarzanawmiesiącu j,j = 1,2,...,3m Funkcja celu jest następująca: minz = p(x 1 +x 2 + +x m )+1.1p(x m+1 +x m+2 + +x 2m ) +1.2p(x 2m+1 +x 2m+2 + +x 3m ) Model tego fragmentu w AMPL jest postaci: param p; var x{1..3*m}>= 0; minimize koszt: p*(sum{j in 1..m}x[j]+1.1* sum{j in m+1..2*m}x[j]+ 1.2*sum{j in 2*m+1..3m}x[j]); (ograniczenia) Bardziej zwartym zapisem wykorzystującym konstrukcję if-then-else do zdefiniowaniaparametru c j wfunkcjicelujestnastępującyfragment: param m; param n:=3*m; param p; paramc{jinn}:=if j <= mthenpelse if j > mand j <= 2 mthen1.1*pelse1.2*p; var x{1..n}>= 0; minimize z: sum{j in 1..n}c[j]*x[j]; (ograniczenia)

Podzbiory Załóżmy, że w pewnym modelu mamy 7 zmiennych i następujące ograniczenie: x 1 +x 2 +x 5 +x 6 +x 7 27; Takie ograniczenie można zamodelować na kilka sposobów(nowe słowa kluczowe pisane są pogrubionym drukiem): # Sposób1 var x{1..7}>= 0; ograniczenie: sum{j in 1..7:j<= 2 or j>= 5}x[j]<= 27; # Sposób2 var x{1..7}>= 0; ograniczenie: sum{j in 1..2 union 5..7}x[j]<= 27; # Sposób3 var x{1..7}>= 0; ograniczenie: sum{j in 1..7 diff 3..4}x[j]<= 27; # Sposób4 var x{1..7}>= 0; ograniczenie: sum{j in 1..7 diff(1..4 inter 3..7)}x[j]<= 27; # - Wsposobie1zezbioru {jin1..7}usuwasięelement3i4nakładającwarunki na j. Znak dwukropka oddziela zmodyfikowany zbiór od warunków. Słowo kluczowe or odpowiada symbolowi alternatywy logicznej(lub). Słowa kluczowe union, diff i inter odpowiadają operacjom na zbiorach odpowiednio sumie (A B),różnicy(A B)iiloczynowi(A B)zbiorów.