You are on page 1of 7

4/5/2022 2_Linear_Programming_Intro - Jupyter Notebook

Μάθημα 2ο:

Εισαγωγή στον Γραμμικό Προγραμματισμό (Linear


Programming)

Δυσδιάστατοι πίνακες στο numpy


Eίδαμε πως εισάγουμε διανύσματα στο numpy. Τώρα θα δουλέψουμε με δυσδιάστατους πίνακες

In [1]:

import numpy as np

In [2]:

np.array([[],[],[]])

Out[2]:

array([], shape=(3, 0), dtype=float64)

In [3]:

np.array([[1,2,3],[4,5,6],[7,8,9]])

Out[3]:

array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

Για αρχικοποίηση πινάκων χρησιμοποιούμε την εντολή np.zeros((m,n)), όπου m: αριθμός γραμμών, και n:
αριθμός στηλών

In [21]:

np.zeros((3,3),dtype='int')

Out[21]:

array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])

Γραμμικές εξισώσεις
'Εχουμε την γραμμική εξίσωση:

5𝑥1 + 3𝑥2 + 4𝑥3 + 2𝑥4 + 2𝑥5 + 3𝑥3 = 42

http://localhost:8889/notebooks/python%20projects/optimization/2_Linear_Programming_Intro.ipynb 1/7
4/5/2022 2_Linear_Programming_Intro - Jupyter Notebook

Για να χρησιμοποιήσουμε τέτου είδους εξισώσεις προγραμματιστικά, οι συντελεστές δίνονται με την μορφή
διανύσματος. Ας τους ορίσουμε ως διάνυσμα 𝑐
In [4]:

c = np.array([5,3,4,2,2,3])
c

Out[4]:

array([5, 3, 4, 2, 2, 3])

Έστω ότι οι λύσεις 𝑥 είναι το διάνυσμα 𝑥 = [ 1 2 2 1 6 3 ]


In [5]:

x = np.array([1,2,2,1,6,3])
x

Out[5]:

array([1, 2, 2, 1, 6, 3])

H 𝑓(𝑥) δίνεται απ'το εσωτερικό γινόμενο 𝑐 ∗ 𝑥.


Αυτό γίνεται με την εντολή np.dot(c,x)

In [6]:

np.dot(c,x)

Out[6]:

42

Συστήματα Γραμμικών Εξισώσεων


'Εστω το σύστημα

3𝑥1 + 4𝑥2 = 33
7𝑥1 − 5𝑥2 = 34
Σ'αυτή την περίπτωση, οι συντελεστές ορίζονται με έναν δυσδιάστατο πίνακα 𝐴 και οι εκάστοτε 𝑓(𝑥), δηλαδή οι
αριθμοί 33 και 34, από ένα διάνυσμα . 𝑏
𝐴 = [ 37 −54 ]
𝑏 = [ 33 34 ]

http://localhost:8889/notebooks/python%20projects/optimization/2_Linear_Programming_Intro.ipynb 2/7
4/5/2022 2_Linear_Programming_Intro - Jupyter Notebook

In [7]:

a = np.array([[3,4],
[7,-5]])
a

Out[7]:

array([[ 3, 4],
[ 7, -5]])

In [9]:

b = np.array([33,34])
b

Out[9]:

array([33, 34])

Έστω ότι μας δίνονται οι λύσεις 𝑥 = [ 𝑥1 𝑥2 ] = [ 7 3 ]


In [10]:

x = np.array([7,3])
x

Out[10]:

array([7, 3])

Θα ισχύει η σχέση:

𝐴𝑥 = 𝑏
Δηλαδή:

𝐴 = [ 37 −54 ] ∗ [ 𝑥1 𝑥2 ] = [ 33 34 ]
In [11]:

np.dot(a,x)

Out[11]:

array([33, 34])

Στο παραπάνω σύστημα προστίθεται και η εξίσωση

3𝑥1 + 9𝑥2 = 48
Τώρα το σύστημα γίνεται

3𝑥1 + 4𝑥2 = 33
7𝑥1 − 5𝑥2 = 34
http://localhost:8889/notebooks/python%20projects/optimization/2_Linear_Programming_Intro.ipynb 3/7
4/5/2022 2_Linear_Programming_Intro - Jupyter Notebook

3𝑥1 + 9𝑥2 = 48
3 4 
𝐴 =  7 −5 
3 9 
𝑏 = [ 33 34 48 ]
Για να προσθέσουμε γραμμές σ'έναν πίνακα, χρησιμοποιούμε την εντολή np.vstack((array1,array2)), όπου
array1 είναι ο αρχικός πίνακας, και array2 ο πίνακας ή διάνυσμα που θα προστεθεί.

Η εντολή vstack σημαίνει vertical stack, δηλαδή στοιβάζει πίνακες ή διανύσματα το ένα πάνω από το άλλο.

In [12]:

a = np.vstack((a,np.array([3,9])))
a

Out[12]:

array([[ 3, 4],
[ 7, -5],
[ 3, 9]])

𝑏
Θα προσθέσουμε ένα στοιχείο στο διάνυσμα χρησιμοποιώντας την εντολή np.hstack((array1,array2)), όπου
array1 είναι το αρχικό διάνυσμα, και array2 το διάνυσμα που θα προστεθεί.

Η εντολή hstack σημαίνει horizontal stack, δηλαδή στοιβάζει πίνακες ή διανύσματα το ένα δίπλα από το άλλο.

In [13]:

b = np.hstack((b,48))
b

Out[13]:

array([33, 34, 48])

Σύμφωνα με την σχέση 𝐴𝑥 = 𝑏, τώρα που προσθέσαμε επιπλέον στοιχεία στο σύστημα, αναμένουμε να ισχύει
η σχέση:

3 4 
𝐴 =  7 −5  ∗ [ 𝑥1 𝑥2 ] = [ 33 34 48 ]
3 9 
Παρατηρήστε ότι δεν κάνουμε καμία αλλαγή στο διάνυσμα 𝑥 = [ 𝑥1 𝑥2 ] = [ 7 3 ], αλλά το αφήνουμε ως
έχει.

In [14]:

np.dot(a,x)

Out[14]:

array([33, 34, 48])

http://localhost:8889/notebooks/python%20projects/optimization/2_Linear_Programming_Intro.ipynb 4/7
4/5/2022 2_Linear_Programming_Intro - Jupyter Notebook

Σύνοψη λειτουργιών του numpy που είδαμε

Operator Description

np.zeros((m,n)) Πίνακας από μηδενικά m γραμμών και n στηλών

np.dot(c,x) Εσωτερικό γινόμενο πινάκων 𝑐 και 𝑥


np.vstack((a1,a2)) vertical stack πινάκων α1 και α2

np.hstack((a1,a2)) horizontal stack πινάκων α1 και α2

Εφαρμογή

Μια κατασκευάστρια εταιρία ηλεκτρονικών ειδών σχεδιάζει να επεκτείνει την γκάμα προιώντων της, και
προσθέτοντας routers και webcams στα προιόντα που θα παράγει. Ισχύουν τα παρκάτω στοιχεία:

Το κέρδος θα είναι £20 για κάθε router και £18 για κάθε webcam που θα κατασκευάζει και θα πουλάει.
Το κόστος ανά μονάδα για την κατασκευή κάθε router και webcam είναι £5 και £4 αντίστοιχα.
Το μηνιαίο κόστος κατασκευής δεν πρέπει να ξεπερνάει τα £27000 το μήνα.
Για την κατασκευή κάθε router απαιτούνται 5 λεπτά, και για κάθε webcam 15 λεπτά. ('Ενας μήνας, δηλαδή
30 εικοσιτετράωρα, έχουν συνολικά 43200 λεπτά)

Μιας και το ζητούμενο είναι η μεγιστοποίηση των κερδών, δηλαδή ψάχνουμε πόσα routers και webcams πρέπει
να κατασκευαστούν για να επιτευχθεί το μέγιστο μηνιαίο κέρδος, το πρόβλημα διατυπώνεται ως εξής:

𝑚𝑎𝑥 : 𝑧 = 20𝑥1 + 18𝑥2


𝑠.𝑡.
5𝑥1 + 4𝑥2 ≤ 27000
5𝑥1 + 15𝑥2 ≤ 43200
𝑥1 , 𝑥2 ≥ 0
http://localhost:8889/notebooks/python%20projects/optimization/2_Linear_Programming_Intro.ipynb 5/7
4/5/2022 2_Linear_Programming_Intro - Jupyter Notebook

In [7]:

A = np.array([[5,4],[5,15]])
b = np.array([2700,43200])
print(A)
print(b)

[[ 5 4]
[ 5 15]]
[ 2700 43200]

Στο επόμενο μάθημα θα δούμε πως λύνεται το πρόβλημα, αλλά για την ώρα έστω ότι η λύση είναι x = [4222,
1472]

Φτιάξτε ένα διάνυσμα με τις λύσεις και πάρτε το εσωτερικό γινόμενο: Ax = ?

Τα αποτελέσματα ικανοποιούν τις ανισότητες;

In [11]:

x = np.array([4222,1472])
np.dot(A,x)

Out[11]:

array([26998, 43190])

Δοκιμάστε να αυξήσετε κατά μια μονάδα είτε την μία τιμή του x, είτε την άλλη. Πληρούνται τώρα οι ανισότητες;

In [12]:

x = np.array([4223,1472])
np.dot(A,x)

Out[12]:

array([27003, 43195])

In [13]:

x = np.array([4222,1473])
np.dot(A,x)

Out[13]:

array([27002, 43205])

Η συνάρτηση προς μεγιστοποίηση είναι η:

𝑚𝑎𝑥 : 𝑧 = 20𝑥1 + 18𝑥2


𝑥
Τώρα που έχουμε τις λύσεις , βρείτε το μέγιστο κέρδος . 𝑧
Για να το κάνετε, αποθηκεύστε σε ένα διάνυσμα 𝑐 τις τιμές των συντελεστών, και πάρτε το εσωτερικό γινόμενο
𝑐
μεταξύ συντελεστών και λύσεων . 𝑥

http://localhost:8889/notebooks/python%20projects/optimization/2_Linear_Programming_Intro.ipynb 6/7
4/5/2022 2_Linear_Programming_Intro - Jupyter Notebook

In [16]:

c = np.array([20,18])
np.dot(c,x)

Out[16]:

110954

http://localhost:8889/notebooks/python%20projects/optimization/2_Linear_Programming_Intro.ipynb 7/7

You might also like