Professional Documents
Culture Documents
Μάθημα 2ο:
In [1]:
import numpy as np
In [2]:
np.array([[],[],[]])
Out[2]:
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]])
Γραμμικές εξισώσεις
'Εχουμε την γραμμική εξίσωση:
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])
x = np.array([1,2,2,1,6,3])
x
Out[5]:
array([1, 2, 2, 1, 6, 3])
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])
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]:
Σύμφωνα με την σχέση 𝐴𝑥 = 𝑏, τώρα που προσθέσαμε επιπλέον στοιχεία στο σύστημα, αναμένουμε να ισχύει
η σχέση:
3 4
𝐴 = 7 −5 ∗ [ 𝑥1 𝑥2 ] = [ 33 34 48 ]
3 9
Παρατηρήστε ότι δεν κάνουμε καμία αλλαγή στο διάνυσμα 𝑥 = [ 𝑥1 𝑥2 ] = [ 7 3 ], αλλά το αφήνουμε ως
έχει.
In [14]:
np.dot(a,x)
Out[14]:
http://localhost:8889/notebooks/python%20projects/optimization/2_Linear_Programming_Intro.ipynb 4/7
4/5/2022 2_Linear_Programming_Intro - Jupyter Notebook
Operator Description
Εφαρμογή
Μια κατασκευάστρια εταιρία ηλεκτρονικών ειδών σχεδιάζει να επεκτείνει την γκάμα προιώντων της, και
προσθέτοντας routers και webcams στα προιόντα που θα παράγει. Ισχύουν τα παρκάτω στοιχεία:
Το κέρδος θα είναι £20 για κάθε router και £18 για κάθε webcam που θα κατασκευάζει και θα πουλάει.
Το κόστος ανά μονάδα για την κατασκευή κάθε router και webcam είναι £5 και £4 αντίστοιχα.
Το μηνιαίο κόστος κατασκευής δεν πρέπει να ξεπερνάει τα £27000 το μήνα.
Για την κατασκευή κάθε router απαιτούνται 5 λεπτά, και για κάθε webcam 15 λεπτά. ('Ενας μήνας, δηλαδή
30 εικοσιτετράωρα, έχουν συνολικά 43200 λεπτά)
Μιας και το ζητούμενο είναι η μεγιστοποίηση των κερδών, δηλαδή ψάχνουμε πόσα routers και webcams πρέπει
να κατασκευαστούν για να επιτευχθεί το μέγιστο μηνιαίο κέρδος, το πρόβλημα διατυπώνεται ως εξής:
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]
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])
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