• Nie Znaleziono Wyników

4. Klasyfikacja metod rozwiązujących problem przydziału

4.4. Algorytmy heurystyczne

Metodą, która jest wykorzystana do rozwiązania problemu QAP jest symulowane wyżarzanie w pracy [Burkard i in., 2007, s. 41-42] przedstawione przez N. Metropolisa3 i współpracowników w 1953 roku i przypomniane przez S. Kirkpatricka i współpracowników w 1983 roku [Metropolis, 1953, s. 1088; Kirkpatrick i in., 1983, s. 675]. Jest rozwinięciem metod iteracyjnych, które opierały się na ciągłym ulepszaniu istniejącego rozwiązania do momentu, gdy nie udawało się dalej poprawić [Łęski, 2008, s. 242].

Metoda symulowanego wyżarzania wywodzi się z fizyki statystycznej [Łęski, 2008, s. 242]. Podstawowym wzorem wykorzystywanym w termodynamice do opisu powyższego zjawiska, który został niejako przeniesiony do opisywanego algorytmu jest:

(4.8)

3 Współtwórca komputerów MANIAC i MANIAC II oraz jeden z autorów metod Monte Carlo.

- 57- gdzie: k jest stałą Boltzmana.

Minimalizowana funkcja kryterium jest analogią do stanu energetycznego materiału.

Wielkość fizyczna temperatury jest zastępowana tzw. pseudotemperaturą. W symulowanym wyżarzaniu, kiedy materiał jest wychładzany, jego energia jest generalnie obniżana, ale dopuszczalny jest jej chwilowy wzrost w celu opuszczenia minimum lokalnego [Łęski, 2008, s. 242].

Parametrem algorytmu, który ma wpływ na prawdopodobieństwo wyboru gorszego rozwiązania, jest parametr przeniesiony bezpośrednio z podstaw termodynamicznych algorytmu, czyli temperatura. Na początku działania algorytmu temperatura jest wysoka, dzięki czemu algorytm może bardzo często zmieniać konfigurację rozwiązania, niejednokrotnie wybierając rozwiązania gorsze. Wraz z kolejnymi iteracjami algorytmu temperatura spada i częściej wybierane są rozwiązania lepsze. Pod koniec pracy algorytmu temperatura jest na tyle niska, że prawdopodobieństwo wyboru gorszego rozwiązania jest bliskie zeru. Algorytm zachowuje się wówczas jak typowy algorytm iteracyjny i stara się maksymalnie ulepszyć rozwiązanie.

Istnieje odmiana maszyny Boltzmana nazywana maszyną Cauchy’ego lub algorytmem szybkiego symulowanego wyżarzania, gdzie funkcja generacji dana jest jako:

(4.9)

W wielu praktycznych zastosowaniach użycie symulowanego wyżarzania jest nierealne ze względu na nakład obliczeniowy związany z wymaganym harmonogramem wyżarzania.

Inaczej mówiąc, aby uzyskać minimum globalne, należy bardzo wolno obniżać pseudotemperatury.

Do metod heurystycznych należy metoda Tabu Search. Metoda przeszukiwania Tabu Search została uznana przez Glovera i Hansena jako skuteczna technika rozwiązywania złożonych problemów optymalizacyjnych [Glover, 1989, s. 190-206; Glover, 1990, s. 4-32;

Hansen, 1986]. Metoda ta ma zdolność, podobnie jak algorytmy genetyczne, do naprowadzania metody przeszukiwania lokalnego, aby uniknąć słabego lokalnego optimum [Kudelska, Oleśków-Szłapka, 2012, s. 138].

Główną ideą przeszukiwania tabu jest wykorzystanie pamięci i zapamiętywanie rozwiązań lub ruchów (zmian). W trakcie przeszukiwania gromadzone są informacje o przeszukiwanej przestrzeni. Lokalne wybory są uzależnione od informacji zebranych podczas całego przeszukiwania. Na podstawie zapisanych w pamięci informacji tworzone są

- 58-

ograniczenia, które chronią algorytm przed powracaniem do przeszukanych już obszarów przestrzeni. Ograniczenia te zależą od:

1. częstotliwości wykonywania zapisu określonych danych, 2. aktualności zapisanych w pamięci danych,

3. wpływu określonych danych na jakość uzyskiwanych wyników.

W kolejnych iteracjach algorytm przeszukuje sąsiedztwo aktualnie znalezionego rozwiązania w celu określenia nowego położenia rozwiązania bieżącego. W związku z tym dla zadanej przestrzeni poszukiwań musi zostać zdefiniowana relacja sąsiedztwa dla wszystkich jej elementów.

Struktura pamięci przechowuje przede wszystkim informacje o zrealizowanych przejściach. Może także zawierać inne informacje, np. o częstotliwości tych przejść lub czasie, który upłynął od wykonania każdego z przejść. W algorytmach TS wyróżniamy dwa rodzaje pamięci: krótkoterminową4 i długoterminową5. Każda z nich jest wykorzystywana przez charakterystyczne dla siebie strategie. Efekt działania obu jest widoczny jako modyfikacja sąsiedztwa N(x) aktualnego rozwiązania x. Zmodyfikowane sąsiedztwo N*(x) jest rezultatem przechowywania informacji dotyczących dotychczasowego procesu przeszukiwania [Glover i in., 1993, s. 4; Witczak, 2010, s. 60].

Algorytm Tabu Search dokonuje pełnego przeszukiwania sąsiedztwa aktualnego rozwiązania. Rozwiązanie bieżące jest zastępowane przez najlepsze rozwiązanie w sąsiedztwie, nawet jeśli powoduje to pogorszenie jakości. W procesie przeszukiwania wykorzystywany jest system ograniczeń nałożonych na zbiór należący do sąsiedztwa. Ma to na celu przeciwdziałanie możliwości zapętlenia się algorytmu i powracania do tych samych wąskich obszarów rozwiązań. Ze zdefiniowanego sąsiedztwa usuwa się rozwiązania, które wcześniej były zaakceptowane jako rozwiązania bieżące, tworząc tzw. zbiór tabu.

Ograniczenia stosowane w Tabu Search mają formę absolutnego zakazu lub pewnych restrykcji.

W procedurze tej mamy do czynienia z wyborem rozwiązania początkowego x i następnie uznaniem go za rozwiązanie najlepsze, w zbiorze kandydatów z sąsiedztwa

4 Pamięć krótkoterminowa jest wykorzystywana w każdej iteracji i służy do zapamiętywania ostatnio odwiedzonych rozwiązań; jej głównym zadaniem jest uniknięcie wyboru operatora ruchu, który może doprowadzić do zapętlenia się algorytmu w pewnym wąskim obszarze przestrzeni poszukiwań [Glover i in., 1993, s. 6-8].

5 Przechowuje informacje o przebiegu procesu poszukiwania; pozwala na zapamiętanie najlepszych rozwiązań z odwiedzonych już obszarów przestrzeni poszukiwań, a nie wyłącznie najlepszego rozwiązania z bieżącego sąsiedztwa [Glover i in., 1993, s. 6-8].

- 59-

wybiera się najlepszego, uwzględniając informację tabu. Następnie zostaje przeprowadzona aktualizacja struktur pamięci.

Kolejnym algorytmem, za pomocą którego Tate i Smith [1992, s. 73-83] rozwiązali problem QAP, jest algorytm genetyczny. Po raz pierwszy algorytm genetyczny został zaproponowany przez Hollanda w roku 1975 [Goldberg, 2003, s. 18]. Cechą charakterystyczną jest binarna reprezentacja osobników oraz rekombinacja z zastosowaniem krzyżowania jednopunktowego, mutacja bitów reprezentacji oraz reprodukcja metodą ruletkową (proporcjonalną) [Kudelska, Oleśków - Szłapka, 2012, s. 130-138; Łęski, 2008, s. 388].

Pierwotną wersję algorytmu genetycznego przyjęto obecnie nazywać kanonicznym, elementarnym lub prostym algorytmem genetycznym [Rutkowska, Piliński, Rutkowski, 1997, s. 136].

Istota działania algorytmów genetycznych polega na przeszukiwaniu przestrzeni rozwiązań problemu w celu znalezienia najlepszych rozwiązań (według określonego kryterium) [Rutkowska, Piliński, Rutkowski, 1997, s. 136; Łęski, 2008, s. 388].

Przy rozpoczęciu pracy algorytmu genetycznego jest zawsze tworzona populacja początkowa ciągów kodowych – pierwsze pokolenie. Zbiór tych ciągów może być utworzony w sposób zupełnie losowy lub jego tworzenie może podlegać określonym regułom. Każdy ciąg kodowy to odpowiednio zakodowane dane dotyczące poszukiwanych wartości zmiennych, dla których wartość zmiennych powinna osiągać ekstremum. Zazwyczaj tuż przed utworzeniem pierwszego pokolenia są wprowadzane do programu parametry pracy algorytmu genetycznego: liczba pokoleń, prawdopodobieństwo mutacji i krzyżowania. Po utworzeniu pierwszego pokolenia dla każdego ciągu kodowego oblicza się za pomocą funkcji celu wartość tego ciągu. Po określeniu wartości dla wszystkich ciągów następuje ich losowanie (selekcja) do tzw. pokolenia pośredniego. Ciągi uznane za lepsze mają więcej szans na znalezienie się w tym pokoleniu i mogą być do niego skopiowane. Selekcja chromosomów polega na wybraniu, na podstawie obliczonych wartości funkcji przystosowania tych chromosomów, które będą brały udział w tworzeniu potomków do następnego pokolenia. Istnieje wiele metod selekcji. Najbardziej popularna jest tzw. metoda ruletki. Kiedy jest już utworzone pokolenie pośrednie, ciągi w tym pokoleniu podlegają operacji krzyżowania. W najprostszym przypadku polega ona na losowym wyborze pary ciągów, losowym wyborze punktu krzyżowania wewnątrz ciągów i zamianie fragmentów ciągów miejscami [Knosala, 2002, s. 401; Goldberg, 2003, s. 18; Rutkowska, Piliński, Rutkowski, 1997, s. 130-140].

- 60-

W literaturze opisano wiele operatorów krzyżowania [Michalewicz, 1996; Sarker, Newton, 2002, s. 189-198]. Zawsze jednak głównym ich celem jest wymiana informacji między ciągami, tak aby wykorzystując najlepsze cechy ciągów – rodziców, można było utworzyć jeszcze lepsze ciągi – potomstwo [Knosala, 2002, s. 402; Rutkowska, Piliński, Rutkowski, 1997, s. 132-142; Michalewicz, 1996, s. 42].

Po utworzeniu żądanej liczby potomstwa jest wykonana mutacja. Polega ona na losowej zmianie bitów reprezentacji z małym prawdopodobieństwem. Mutacja podobnie jak reprodukcja działa na pojedynczym osobniku rodzicielskim. Podobnie jak w krzyżowaniu istnieje wiele rodzajów operatorów mutacji, jednak cel stosowania operatora jest zawsze taki sam, tj. wprowadzenie modyfikacji w ciągach, powodującej rozpoczęcie przeszukiwania przestrzeni rozwiązań przez algorytm genetyczny w nowych, do tej pory niebadanych obszarach [Knosala, 2002, s. 402; Kudelska, Ponikierska, 2008, s. 163-173].

Prócz tych dwóch podstawowych operatorów genetycznych istnieje duża liczba innych operatorów, np. ścisku. Kiedy są wykonywane wszystkie potrzebne operacje na ciągach kodowych, zbiór nowo powstałych ciągów tworzy nowe następne pokolenie. Pracę algorytmu genetycznego można zakończyć, kiedy kolejne pokolenia nie różnią się od siebie średnią wartością funkcji celu [Knosala, 2002, s. 402].

W ostatnich latach intensywnie rozwijają się algorytmy, które naśladują zachowania istniejące w przyrodzie i jednocześnie dostosowują się do ograniczeń niezależnie od rozmiarów przestrzeni rozmiarów, a także pozwalają skrócić czas obliczeń. Problem QAP, który należy do problemów optymalizacyjnych, wymaga efektywnych algorytmów, które w rozsądnym czasie znajdą rozwiązanie [Tasgetiren i in., 2013, s. 131].

Wyróżnia się wiele metod oraz technik uznawanych za metody sztucznej inteligencji.

Do tej grupy metod zaliczono między innymi Sztuczne Sieci Neuronowe (SSN), powstałe na podstawie wiedzy o działaniu systemu nerwowego istot żywych i chęci naśladowania tego systemu. Ich wykorzystanie do rozwiązania QAP podał Xia [1996, s. 1544-1547]. Metody te cechują się „samouczącymi się procedurami”, które umożliwiają ciągłe automatyczne uwzględnianie stale zmieniających się danych w przedsiębiorstwie [Kutschenreiter-Praszkiewicz, 2003, s. 23].

Początek rozwoju sztucznych sieci neuronowych nastąpił w 1943 roku wraz z opracowaniem przez McCullocha i Pittsa matematycznego modelu sztucznego neuronu.

W kolejnych latach przeprowadzone zostały przez Hebba badania wyjaśniające mechanizm pamiętania informacji oraz badania prowadzone przez Rosenblatta związane z perceptronem [Korbicz, Obumowicz, Uciński, 1994, s. 18-20; si6].

- 61-

Te eksperymenty wywołały ogromne zainteresowanie na całym świecie. Dużym wkładem do badań nad SSN było opracowanie przez Hopfielda sieci ze sprzężeniem zwrotnym.

Sztuczne sieci neuronowe oparte są na bardzo prostym modelu przedstawiającym wyłącznie podstawową istotę działania biologicznego systemu nerwowego [Kosiński, 2007, s. 19-20; Flasiński, 2011, s. 159-161; Korbicz, Obumowicz, Uciński, 1994, s. 22; Łęski, 2008, s. 198-200].

W sztucznej sieci neuronowej sygnały wejściowe x0, x1, …, xn odpowiadają impulsom nerwowym przesyłanym przez inne neurony, przy czym przyjmujemy że x0 = 1. Tworzą one wektor wejściowy x = (x0, x1, …, xn) [Flasiński, 2011, s. 161; Kudelska, 2008].

Sygnały wejściowe są mnożone przez odpowiednie współczynniki wag (w1, w2, …, wn). Wagi synaptyczne odgrywają rolę transmisyjną synaps neuronu biologicznego, sprawiając, że jedne z wejść do sztucznego neuronu odpowiadają synapsom pobudzającym, a inne synapsom hamującym. Samo mnożenie sygnałów wejściowych przez wagi synaptyczne odpowiada wzmacnianiu lub osłabianiu sygnałów napływających do neuronu [Flasiński, 2011, s. 161; Parol, Piotrowski, 2008; Krawiec, Stefanowski, 2004, s. 83-84;

Jastriebow, 2006, s. 31]. „Ważone” sygnały wejściowe są sumowane i na tej podstawie wyznacza się aktywność neuronu. Neuron składa się z dwóch bloków: bloku sumowania oraz bloku aktywacji. W pewnym sensie blok sumowania odpowiada biologicznemu ciału komórki, w której realizowane jest algebraiczne sumowanie ważonych sygnałów wejściowych oraz generowany jest sygnał wyjściowy [Osowski, 2006, s. 12].

Sztuczna sieć neuronowa jest systemem wzajemnie połączonych prostych elementów przetwarzających informacje [Perzyńska, 2010, s. 133]. Trudno jest określić, z ilu neuronów powinna się składać sztuczna sieć neuronowa, ponieważ zbyt mała ich liczba powoduje szybkie przetwarzanie informacji, jednakże jakość odpowiedzi sieci może być dla użytkownika niezadowalająca. Natomiast większa liczba neuronów to zbyt długi czas przetwarzania informacji [Pająk, 2006, s. 292-293].

W przypadku systemu neuronowego istotną rolę odgrywa proces uczenia sieci. Polega on na modyfikacji współczynników wagowych połączeń jej elementów [Zieliński, 2000, s. 142].

Do dziedzin, w których najczęściej stosuje się sieci neuronowe, należą:

1. analiza np.: problemów produkcyjnych, 2. badania psychiatryczne,

3. diagnostyka,

- 62-

4. dobieranie pracowników lub materiałów wejściowych, 5. prognozowanie,

6. rozpoznawanie, klasyfikacja [Gania, Kudelska, 2008; Partovi, Anandarajan, 2002, s. 389-404].

To tylko niektóre obszary zastosowań sztucznych sieci neuronowych. Analiza literaturowa ukazała algorytmy rozwiązujące również problemy optymalizacyjne [Hopfield, Tank, 1985; Hopfield, 1984, s. 3088-3092; Xia, 1996, s. 1544-1547; Tada, Uwate, Nishio, 2008, s. 105-108].

Kolejną grupą algorytmów, których rozwój przypada na lata dziewięćdziesiąte XX wieku, są algorytmy rojowe. Należą one do algorytmów, które naśladują zachowania populacyjne zwierząt, np.: sposób poszukiwania pożywienia [Filipowicz, Kwiecień, 2011, s. 160].

Przykładem tej grupy algorytmów są algorytmy pszczele (Bees Algorithm), a ich rozwój datuje się na lata 2004 - 2005. Algorytm ten został zainspirowany poprzez proces poszukiwania pożywienia, jaki stasują roje pszczół miodnych [Chmiel, Kadłuczka, Packanik, 2011, s. 119]. Pszczoły są owadami, które żyją w dużych społecznościach składających się nawet z 80 000 osobników [Bakier, 2007, s. 15].

Proces zdobywania nektaru przez rój pszczół, które wykształciły różne techniki usprawniające komunikację miedzy sobą dotyczącą lokalizacji i zasobności źródeł pożywienia, stanowi główną ideę algorytmu [Kwiecień, Filipowicz, 2014, s. 195; Gerhardt, Gomes, 2012].

Organizacja roju pszczół chcących zdobyć optymalną ilość kwiatostanów polega na rozsyłaniu we wszystkie strony zwiadowców, które przeszukują w odległości kilkunastu kilometrów od ula obszary zasobne w nektar. Początkowe szukanie nektaru odbywa się w sposób losowy. Po powrocie do ula zwiadowca powiadamia pozostałe pszczoły o najlepszym swoim odkryciu, wykonując tzw. taniec pszczeli, w trakcie którego następuje wymiana informacji o jakości, kierunku i odległości pożywienia od punktu bazowego, dzięki czemu pszczoły rozpoczynają zbiór nektaru. Im obfitsze źródło pokarmu, tym więcej pszczół dowiaduje się o tym miejscu. Pszczoły powracające do ula z pyłkiem przekazują informację pozostałym osobnikom. Pszczoła zbierająca nektar może również powiadomić pozostałe o miejscu występowania nektaru [Filipowicz, Kwiecień, 2011, s. 161].

Algorytm pszczeli jest algorytmem iteracyjnym, który można zrealizować w kilku etapach [Filipowicz, Kwiecień, 2011, s. 164]. Są to:

1. Losowa inicjalizacja populacji początkowej (permutacji).

- 63-

2. Obliczenie funkcji celu dla całej populacji początkowej pszczół i przejście do kolejnego etapu części rozwiązań.

3. Dopóki niespełnione jest kryterium, należy przeprowadzić:

 wybór miejsc do przeszukiwania sąsiedztwa – zdefiniowanie sąsiedztwa rozwiązania,

 rekrutację pszczół do najlepszych miejsc – proporcjonalnie do jakości miejsca,

 wyliczenie funkcji celu – posortowanie rozwiązań populacji według funkcji celu,

 wybranie najlepszej pszczoły w danym miejscu – każde z przeszukiwań lokalnych generuje lokalne rozwiązanie,

 przeszukiwanie przestrzeni rozwiązań przez niezatrudnione pszczoły – przypisanie pozostałych pszczół do losowych poszukiwań i wyliczenie ich funkcji dopasowania.

4. Spełnione kryterium (np. zadana liczba iteracji) – wyznaczenie najlepszego rozwiązania

Rozwiązanie zadania optymalizacyjnego rozpoczyna się od wprowadzenia liczby iteracji, która ma zostać wykonana oraz od utworzenia odpowiedniej liczby rozwiązań początkowych. Dla każdego rozwiązania obliczana jest wartość wskaźnika oceny jakości rozwiązania. Następnie wybierana jest określona liczba rozwiązań najlepszych i przeszukiwane są ich sąsiedztwa o zadeklarowanej wielkości.

Określana jest liczba rozwiązań, która ma być skupiona w przestrzeni rozwiązań charakteryzowanej danym sąsiedztwem. Dla każdej przestrzeni generowane są nowe rozwiązania i wyznaczana wartość funkcji celu. Z każdego sąsiedztwa wybierane jest najlepsze rozwiązanie (na podstawie najwyższej wartości funkcji kryterium). Dla pozostałych miejsc, które nie zostały zakwalifikowane do obszarów poszczególnych sąsiedztw, także wyznacza się wartość rozwiązania. Jeśli wykonana została określona liczba iteracji, uzyskano rozwiązanie suboptymalne. W przeciwnym razie należy powtórzyć czynności od momentu wyboru nowych lokalizacji sąsiedztwa.

Omówione metody mają rozmaitego rodzaju rozszerzenia, modyfikacje i mogłyby stanowić przedmiot osobnych rozważań. Informacje o wspomnianych wcześniej metodach mają tylko ogólny charakter w celu ich przybliżenia. Zalety tych metod powodują ich wykorzystanie w rozwiązywaniu problemów NP - trudnych, których przykładem jest QAP.

Każda z tych metod ma również wady, które mają wpływ na rozwiązanie danego problemu, co jest ukazane w tabeli 4.1.

- 64-

Tabela 4.1. Wady omówionych algorytmów

Wady algorytmów dokładnych Wady algorytmów heurystycznych

Dedykowane dla specyficznych problemów

Przy większych rozmiarach są czasochłonne

Kończą działanie w optimum lokalnym

Jakość końcowego rozwiązania w dużej mierze zależy od wyboru rozwiązania startowego

Znajdują optimum lokalne bez gwarancji jego jakości

Źródło: Opracowanie własne

W algorytmach dokładnych każda wykorzystywana metoda jest zaprojektowana wyłącznie do danego rodzaju problemu i tylko dla tego problemu jest ona efektywna. Po zmianie problemu metody tradycyjne zaczynają się „uginać”. Powyższe metody albo gwarantują znalezienie globalnego rozwiązania, ale są zbyt czasochłonne przy rozwiązywaniu rzeczywistych problemów, albo mają tendencję do zatrzymywania się i szukania w lokalnych optimach [Michalewicz, Fogel, 2006, s. 139].

Rozwiązywany problem rozmieszczenia towaru w magazynie wymaga zastosowania algorytmów heurystycznych, zwłaszcza dla większego zbioru poszukiwań rozwiązań, dla których algorytmy dokładne stają się zbyt wolne.

- 65-

Tabela 4.2. Wady wybranych metod heurystycznych

Nazwa heurystyki Wady

 operuje tzw. pojęciami rozmytymi,

 brak wnioskowania wieloetapowego

Symulowane wyżarzanie z góry określony czas działania, Tabu Search do rozwiązania problemu potrzebne są

umiejętności zdefiniowania relacji sąsiedztwa

powoduje zbieżność do ekstremum już na samym początku działania algorytmu

Algorytm genetyczny rozwiązanie jest możliwe przy prawidłowym zakodowaniu problemu,

nie ma pewności co do rozwiązania optymalnego,

 metoda jest wolna Źródło: Opracowanie własne

Użytkownik korzystając z powyższych narzędzi, będzie potrzebował wiedzy dotyczącej przygotowania danych, co nie zawsze może być łatwe. Zbieranie danych i ich analizowanie oraz analizowanie korelacji między danymi wymaga czasu. W zależności od rozwiązywanego problemu niektóre z wymienionych wad z tabeli 4.2 mogą być również zaletami. Dlatego bardzo często tworzone są systemy hybrydowe w celu eliminacji wad poszczególnych heurystyk.

W pracy został wykorzystany algorytm należący do grupy algorytmów rojowych, ponieważ algorytm pszczeli charakteryzuje się łatwością implementacji i ma szerokie możliwości zastosowania, nawet w złożonych problemach a wysoka elastyczność umożliwia regulację algorytmu.

Ponadto zaletą algorytmu pszczelego jest również to, że wynik działania jest w mniejszym stopniu zależny od równomiernego rozłożenia populacji początkowej w przestrzeni rozwiązań, co udowodnili w pracy Chmiel, Kadłuczka i Packanik [2011, s. 117-127; ]. Natomiast struktura algorytmu według Gerhardta i Gomesa [2012] jest korzystna dla przetwarzania równoległego, co pozwala zaoszczędzić czas.

W chwili obecnej przedsiębiorstwa, bez względu na wielkość, wykorzystują zasoby informatyczne. Zasoby te stanowią sprzęt komputerowy, infrastrukturę sieci lokalnej

- 66-

i systemy informatyczne np. klasy ERP lub WMS (np. SAP, Microsoft Dynamics AX) lub standardowe programy, które obsługują wybrane moduły, np. finanse, magazyn [Kiełtyka, Kobis, 2013, s. 13-19; Kudelska, Hadaś, 2009]. Dostosowywanie tych programów do wymagań użytkownika wiąże się z dużym nakładem finansowym, gdyż wdrożenie systemu informatycznego jest zmianą. Jest ona uważana za inwestycję i stąd zwykle związana jest z nakładem finansowym [Fertsch, 2006]. Ponadto czas implementacji bywa bardzo długi, co jest spowodowane trudnością we wprowadzeniu zmian.

- 67-