In [3]:
import pulp
print( pulp.listSolvers() ) # tieto solvery vie tvoja verzia PuLPu použiť
print( pulp.listSolvers(onlyAvailable = True) ) # tieto má naozaj dostupné
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[3], line 1
----> 1 import pulp
      2 print( pulp.listSolvers() ) # tieto solvery vie tvoja verzia PuLPu použiť
      3 print( pulp.listSolvers(onlyAvailable = True) )

ModuleNotFoundError: No module named 'pulp'
In [4]:
!pip install pulp
Defaulting to user installation because normal site-packages is not writeable
Collecting pulp
  Obtaining dependency information for pulp from https://files.pythonhosted.org/packages/99/6c/64cafaceea3f99927e84b38a362ec6a8f24f33061c90bda77dfe1cd4c3c6/pulp-3.3.0-py3-none-any.whl.metadata
  Downloading pulp-3.3.0-py3-none-any.whl.metadata (8.4 kB)
Downloading pulp-3.3.0-py3-none-any.whl (16.4 MB)
   ---------------------------------------- 0.0/16.4 MB ? eta -:--:--
   ---------------------------------------- 0.0/16.4 MB ? eta -:--:--
   ---------------------------------------- 0.1/16.4 MB 825.8 kB/s eta 0:00:20
    --------------------------------------- 0.4/16.4 MB 3.2 MB/s eta 0:00:06
   -- ------------------------------------- 0.9/16.4 MB 5.7 MB/s eta 0:00:03
   --- ------------------------------------ 1.6/16.4 MB 7.1 MB/s eta 0:00:03
   ----- ---------------------------------- 2.3/16.4 MB 9.1 MB/s eta 0:00:02
   ------- -------------------------------- 3.2/16.4 MB 10.8 MB/s eta 0:00:02
   ---------- ----------------------------- 4.2/16.4 MB 11.7 MB/s eta 0:00:02
   ------------- -------------------------- 5.5/16.4 MB 14.0 MB/s eta 0:00:01
   ---------------- ----------------------- 6.9/16.4 MB 15.3 MB/s eta 0:00:01
   --------------------- ------------------ 8.7/16.4 MB 18.0 MB/s eta 0:00:01
   -------------------------- ------------- 10.8/16.4 MB 25.2 MB/s eta 0:00:01
   -------------------------------- ------- 13.3/16.4 MB 34.4 MB/s eta 0:00:01
   ---------------------------------------  16.3/16.4 MB 50.4 MB/s eta 0:00:01
   ---------------------------------------  16.4/16.4 MB 46.9 MB/s eta 0:00:01
   ---------------------------------------- 16.4/16.4 MB 38.6 MB/s eta 0:00:00
Installing collected packages: pulp
Successfully installed pulp-3.3.0
DEPRECATION: Loading egg at c:\programdata\anaconda3\lib\site-packages\vboxapi-1.0-py3.11.egg is deprecated. pip 23.3 will enforce this behaviour change. A possible replacement is to use pip for package installation..
  WARNING: The script pulptest.exe is installed in 'C:\Users\Katedra\AppData\Roaming\Python\Python311\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
In [5]:
import pulp
print( pulp.listSolvers() ) # tieto solvery vie tvoja verzia PuLPu použiť
print( pulp.listSolvers(onlyAvailable = True) ) # tieto má naozaj dostupné
['CyLP', 'GLPK_CMD', 'PYGLPK', 'CPLEX_CMD', 'CPLEX_PY', 'GUROBI', 'GUROBI_CMD', 'MOSEK', 'XPRESS', 'XPRESS', 'XPRESS_PY', 'PULP_CBC_CMD', 'COIN_CMD', 'COINMP_DLL', 'CHOCO_CMD', 'MIPCL_CMD', 'SCIP_CMD', 'FSCIP_CMD', 'SCIP_PY', 'HiGHS', 'HiGHS_CMD', 'COPT', 'COPT_DLL', 'COPT_CMD', 'SAS94', 'SASCAS', 'CUOPT']
['PULP_CBC_CMD']
In [6]:
import pulp

# vyrobíme si nový optimalizačný problém, v ktorom chceme maximalizovať

problem = pulp.LpProblem('Nugetky', pulp.LpMaximize)

# zadefinujeme si premenné, ktoré chceme používať
# cat ("category") je typ premennej, my budeme používať 'Integer' a 'Binary'

x1 = pulp.LpVariable('x1', cat='Integer', lowBound=0)
x2 = pulp.LpVariable('x2', cat='Integer', lowBound=0)
x3 = pulp.LpVariable('x3', cat='Integer', lowBound=0)

# do problému vieme pridávať nové informácie pomocou +=
# ak takto pridáme lineárny výraz z premenných a konštánt, pochopí ho ako cieľ
# ak pridáme podmienku, pochopí ju ako obmedzenie

problem += 6*x1 + 9*x2 + 20*x3 # cieľ

problem += 200*x1 + 290*x2 + 610*x3 <= 3200 # obmedzenie

# ak chceme, môžeme si problém dať vypísať a skontrolovať si ho
# print(problem)

# ak chceme, môžeme si problém dať uložiť do súboru vo formáte, ktorému rozumie viacero solverov
# problem.writeMPS('nugetky.mps')

# spustíme solver

status = problem.solve()

# alternatíva: použitie iného solveru
# status = problem.solve( pulp.GLPK_CMD(msg=False) ) # msg=False vypne tomuto solveru výstup na stdout

# skontrolujeme, že solver našiel optimálne riešenie

assert pulp.LpStatus[status] == 'Optimal'

# vypíšeme si hodnotu riešenia a následne hodnoty jednotlivých premenných

# pulp nám interne vráti floaty, my vieme, že naše odpovede sú celé čísla, pre istotu ich pri konverzii zaokrúhlime

def to_int(x): return int(round(x))

# pulp.value nám vypočíta hodnotu výrazu obsahujúceho premenné, napr. cieľu, ktorý sme optimalizovali

print( 'optimálny počet nugetiek:', to_int( pulp.value( problem.objective ) ) )

# premenné aj samé poznajú svoju hodnotu, ale rovnako sme mohli použiť pulp.value(premenna)

for premenna in [x1, x2, x3]: print( premenna.name, '=', to_int(premenna.varValue) )
optimálny počet nugetiek: 102
x1 = 1
x2 = 4
x3 = 3
In [7]:
import pulp

# vyrobíme si nový optimalizačný problém, v ktorom chceme maximalizovať

problem = pulp.LpProblem('Nugetky', pulp.LpMaximize)

# zadefinujeme si premenné, ktoré chceme používať
# cat ("category") je typ premennej, my budeme používať 'Integer' a 'Binary'

x1 = pulp.LpVariable('x1', cat='Integer', lowBound=0)
x2 = pulp.LpVariable('x2', cat='Bin')

# do problému vieme pridávať nové informácie pomocou +=
# ak takto pridáme lineárny výraz z premenných a konštánt, pochopí ho ako cieľ
# ak pridáme podmienku, pochopí ju ako obmedzenie

problem += 6*x1 + 9*x2 # cieľ

problem += 200*x1 + x1*x2 <= 3200 # obmedzenie

# ak chceme, môžeme si problém dať vypísať a skontrolovať si ho
# print(problem)

# ak chceme, môžeme si problém dať uložiť do súboru vo formáte, ktorému rozumie viacero solverov
# problem.writeMPS('nugetky.mps')

# spustíme solver

status = problem.solve()

# alternatíva: použitie iného solveru
# status = problem.solve( pulp.GLPK_CMD(msg=False) ) # msg=False vypne tomuto solveru výstup na stdout

# skontrolujeme, že solver našiel optimálne riešenie

assert pulp.LpStatus[status] == 'Optimal'

# vypíšeme si hodnotu riešenia a následne hodnoty jednotlivých premenných

# pulp nám interne vráti floaty, my vieme, že naše odpovede sú celé čísla, pre istotu ich pri konverzii zaokrúhlime

def to_int(x): return int(round(x))

# pulp.value nám vypočíta hodnotu výrazu obsahujúceho premenné, napr. cieľu, ktorý sme optimalizovali

print( 'optimálny počet nugetiek:', to_int( pulp.value( problem.objective ) ) )

# premenné aj samé poznajú svoju hodnotu, ale rovnako sme mohli použiť pulp.value(premenna)

for premenna in [x1, x2, x3]: print( premenna.name, '=', to_int(premenna.varValue) )
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[7], line 19
     13 # do problému vieme pridávať nové informácie pomocou +=
     14 # ak takto pridáme lineárny výraz z premenných a konštánt, pochopí ho ako cieľ
     15 # ak pridáme podmienku, pochopí ju ako obmedzenie
     17 problem += 6*x1 + 9*x2 # cieľ
---> 19 problem += 200*x1 + x1*x2 <= 3200 # obmedzenie
     21 # ak chceme, môžeme si problém dať vypísať a skontrolovať si ho
     22 # print(problem)
     23 
   (...)
     26 
     27 # spustíme solver
     29 status = problem.solve()

File ~\AppData\Roaming\Python\Python311\site-packages\pulp\pulp.py:218, in LpElement.__mul__(self, other)
    217 def __mul__(self, other):
--> 218     return LpAffineExpression(self) * other

File ~\AppData\Roaming\Python\Python311\site-packages\pulp\pulp.py:1028, in LpAffineExpression.__mul__(self, other)
   1026                 e[v] = c * x
   1027 elif isinstance(other, LpVariable):
-> 1028     return self * LpAffineExpression(other)
   1029 else:
   1030     if not math.isfinite(other):

File ~\AppData\Roaming\Python\Python311\site-packages\pulp\pulp.py:1016, in LpAffineExpression.__mul__(self, other)
   1014 if len(other):
   1015     if len(self):
-> 1016         raise TypeError("Non-constant expressions cannot be multiplied")
   1017     else:
   1018         c = self.constant

TypeError: Non-constant expressions cannot be multiplied

Chybajuci 1 paket, 2 pakety¶

In [8]:
16*33
Out[8]:
528
In [9]:
from math import log
In [12]:
log(528, 2) #10 bitov na sucet
Out[12]:
9.044394119358454

$1+2+3+4+...+n = \frac{n.(n+1)}{2}$

LOGSPACE

https://oi.sk/archiv/2012/sl-2012-1-zad.pdf

image.png

In [ ]: