Egészértékű programozás
Egészértékű programozás (Integer Programming, IP)
Definíció
Az egészértékű programozás az optimalizálási problémák egy speciális esete, ahol a döntési változók csak egész számok lehetnek. Ez különbözik a lineáris programozástól, amely lehetővé teszi a folyamatos értékeket.
Alapfogalmak
- Célfüggvény (Objective Function):
Egy függvény, amelyet maximalizálni vagy minimalizálni szeretnénk:
- Korlátok (Constraints):
A változók értékét korlátozó lineáris egyenletek vagy egyenlőtlenségek:
- Egészértékűségi feltétel:
Minden döntési változó () egész szám:
Típusai
- Tiszta egészértékű programozás (Pure Integer Programming):
Minden változó egész szám.
- Vegyes egészértékű programozás (Mixed Integer Programming, MIP):
Csak néhány változó egész, mások folyamatosak lehetnek.
- Bináris programozás (Binary Programming):
A változók értéke csak vagy lehet.
Egészértékű programozási probléma
Példa: Gyártási optimalizáció
Egy gyár kétféle terméket gyárt: és . Minden termék értéket és időt igényel a gyártáshoz. A cél a profit maximalizálása az alábbi korlátok mellett:
- Célfüggvény:
- Korlátok:
- Gyártási idő korlát:
- Anyaghasználat:
- Nemnegativitási és egészértékűségi feltétel:
Python Implementáció a PuLP Könyvtárral
from pulp import LpMaximize, LpProblem, LpVariable, lpSum
# Probléma definiálása
problem = LpProblem("Gyártási_Optimalizáció", LpMaximize)
# Döntési változók definiálása
x1 = LpVariable("x1", lowBound=0, cat="Integer") # Egészértékű változó
x2 = LpVariable("x2", lowBound=0, cat="Integer") # Egészértékű változó
# Célfüggvény hozzáadása
problem += 40 * x1 + 30 * x2, "Profit"
# Korlátok hozzáadása
problem += 2 * x1 + x2 <= 100, "Gyártási_idő_korlát"
problem += x1 + 2 * x2 <= 80, "Anyaghasználati_korlát"
# Probléma megoldása
status = problem.solve()
# Eredmények kiíratása
print("Optimalizáció állapota:", problem.status)
print("Maximális profit:", problem.objective.value())
print(f"x1 (Termék 1): {x1.value()}")
print(f"x2 (Termék 2): {x2.value()}")
Példa Kimenet
Adott bemenet mellett:
Optimalizáció állapota: Optimal Maximális profit: 1600.0 x1 (Termék 1): 20.0 x2 (Termék 2): 30.0
Bináris Programozás Példa
Ha egy probléma bináris döntési változókat igényel, például egy adott termék gyártása történjen-e vagy sem (), azt a PuLP könyvtárban egyszerűen implementálhatjuk.
# Döntési változók definiálása (bináris változók)
x1 = LpVariable("x1", cat="Binary")
x2 = LpVariable("x2", cat="Binary")
# Célfüggvény és korlátok hasonlóak a korábbi példához
problem += 40 * x1 + 30 * x2, "Profit"
problem += 2 * x1 + x2 <= 1, "Korlát"
# Probléma megoldása
status = problem.solve()
# Kimenet
print("Optimalizáció állapota:", problem.status)
print("Maximális profit:", problem.objective.value())
print(f"x1: {x1.value()}")
print(f"x2: {x2.value()}")
Alkalmazások
- Gyártási és logisztikai problémák:
- Erőforrás-elosztás, gyártási ütemezés.
- Pénzügyi tervezés:
- Befektetési portfólió optimalizálása.
- Ellátási lánc problémák:
- Szállítási útvonalak tervezése.
- Projektmenedzsment:
- Feladatok ütemezése korlátok mellett.
Előnyök és Hátrányok
Előnyök
- Pontos megoldásokat nyújt, ha egyértelműen definiált célfüggvénnyel és korlátokkal rendelkezünk.
- Kezeli az egészértékűségi és bináris feltételeket.
Hátrányok
- Az egészértékűség kikényszerítése NP-teljes problémát eredményez, ami nagy számítási idővel járhat.
- Nagy méretű problémák esetén gyakran szükséges heurisztikus vagy közelítő módszerek használata.
Összegzés
Az egészértékű programozás hatékony eszköz az optimalizálási problémák széles skálájának megoldására, ahol a döntési változók egész vagy bináris értékűek. Pythonban a PuLP könyvtár egyszerűen használható, és számos alkalmazási területen hasznosítható.