You are on page 1of 20

4/5/2022 1_Intro_to_Python - Jupyter Notebook

Μάθημα 1

Εισαγωγή στο Jupyter Lab και στην Python


Γράφουμε κώδικα εντός των κελλιών. Το τρέχουμε πατώντας είτε Ctrl+Enter ή Shft+Enter, και εμφανίζεται η
έξοδος.

In [3]:

print ("Hello world!")

Hello world!

Στο Jupyter έχουμε δύο καταστάσεις:

Κατάσταση πληκτρολόγησης, όπου ο κέρσορας είναι σε κάποιο κελί και πληκτρολογούμε κώδικα
Κατάσταση περιήγησης, όπου δεν εμφανίζεται κέρσορας πουθενά, αλλά κάποιο κελί είναι επιλεγμένο

Για να βγούμε από την κατάσταση πληκτρολόγησης στην κατάσταση περιήγησης, έχουμε τρεις τρόπους:

Πατάμε το Esc
Κάνουμε κλικ οπουδήποτε στον κενό χώρο εκτός των κελιών
Τρέχουμε το κελί στο οποίο βρισκόμαστε.

Για να μεταβούμε από κατάσταση περιήγησης σε κατάσταση πληκτρολόγησης, έχουμε δύο τρόπους:

Κάνουμε κλικ εντός του κελιού που θέλουμε να δουλέψουμε


Χρησιμοποιούμε τα βελάκια του πληκτρολογίου για να επιλέξουμε το κελί που μας ενδιαφέρει, και πιέζουμε
Enter.

Δημιουργούμε νέα κελιά είτε πιέζοντας τα πλήκτρα Α ή Β από κατάσταση περιήγησης, ή μέσω της γραμμής
εργαλείων (το σηματάκι +).

Παρακάτω βλέπυμε πώς αποθηκεύουμε κείμενο σε μια μεταβλητή, και γράφοντας το όνομα της μεταβλητής και
εκτελώντας το κελί, εμφανίζονται τα περιεχόμενά της.

In [4]:

text = 'this is'

text

Out[4]:

'this is'

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

In [5]:

text = 'this is'


text2 = 'a text'
text3 = 'to print'

print(text)
print(text2)
print(text3)

this is
a text
to print

Όταν γράφουμε τα ονόματα πολλών μεταβλητών σε διαφορετικές γραμμές, εμφανίζονται τα περιεχόμενα μόνο
της τελευταίας

In [6]:

text
text2
text3

Out[6]:

'to print'

Εμφανίζονται όλες όταν τις γράφουμε στην ίδια σειρά και τις χωρίζουμε με κόμμα.

In [7]:

text,text2,text3

Out[7]:

('this is', 'a text', 'to print')

Αριθμητικές πράξεις, είτε κατευθείαν με αριθμούς, ή σε συνδυασμό με μεταβλητές

In [8]:

3 + 4

Out[8]:

In [9]:

x = 5

x * 8

Out[9]:

40

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

In [10]:

x = 5

y = x ** 2

Out[10]:

25

Μερικοί τελεστές που χρησιμοποιούνται στην Python:

Operator Description

+ Addition (e.g., 1 + 1 = 2 )

- Subtraction (e.g., 3 - 2 = 1 )

- Unary negation (e.g., -2 )

* Multiplication (e.g., 2 * 3 = 6 )

/ Division (e.g., 3 / 2 = 1.5 )

// Floor division (e.g., 3 // 2 = 1 )

** Exponentiation (e.g., 2 ** 3 = 8 )

% Modulus/remainder (e.g., 9 % 4 = 1 )

Mεταβλητές
In [18]:

price = 10 # integer variable


rating = 4.5 # float type variable
name = 'John Smith' # string type variable

In [17]:

price *= rating
price

Out[17]:

4100.625

Λίστες
In [33]:

n = [2,4,6,8,10]
n

Out[33]:

[2, 4, 6, 8, 10]

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

Η εντολή len(όνομα λίστας) μας δίνει τον αριθμό των στοιχείων της λίστας.

In [20]:

len(n)

Out[20]:

Μπορούμε να διαλέγουμε ποια στοιχεία της λίστας θέλουμε, χρησιμοποιώντας indexing. To index ξεκινάει απ'το
0, δηλαδή το πρώτο στοιχείο της λίστας βρίσκεται στην θέση 0.

In [21]:

n[0]

Out[21]:

In [22]:

n[1:3]

Out[22]:

[4, 6]

In [6]:

a = [0,1,2,3,4,5,6,7,8,9,10,11]
print ("a is ", a)
print ("first two elements of a are ", a[0:2])
print ("all elements are ", a[0:])
print ("equivalently ", a[:])
print ("all elements but the first are", a[1:])
print ("all elements up to the fifth are ", a[:5]) # the last is NOT included
print ("all elements but the last two are ", a[:-2])

print (" all elements but the fifth are ", a[:5] + a[6:])

a is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]


first two elements of a are [0, 1]
all elements are [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
equivalently [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
all elements but the first are [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
all elements up to the fifth are [0, 1, 2, 3, 4]
all elements but the last two are [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
all elements but the fifth are [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11]

Η εντολή append(στοιχείο) προσθέτει ένα στοιχείο στην λίστα.

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

In [34]:

n.append(12)
n

Out[34]:

[2, 4, 6, 8, 10, 12]

Συνθήκες if
In [31]:

if n[0] == 5:
print('five')
else:
print('not five')

not 5

For loops

Η εντολή range(αριθμός) χρησιμοποιείται στις for loops για να μας δώσει ένα βρόχο επαναλήψεων ίσο με τον
αριθμό εντός παρενθέσεως της range.

In [38]:

for i in range(3):
print(i)

0
1
2

Για να προσπελάσουμε τα στοιχεία μιας λίστας μέσω βρόχου, έχουμε δύο τρόπους:

In [37]:

for i in range(len(n)):
print(n[i])

2
4
6
8
10
12

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

In [36]:

for element in n:
print(element)

2
4
6
8
10
12

In [35]:

greater = 0

for element in n:
if element > 5: greater += 1

greater

Out[35]:

Ανακεφαλαίωση.
Είδαμε:

αριθμητικές πράξεις
μεταβλητές, και πράξεις με μεταβλητές
λίστες
μήκος λίστας
χρησιμοποιώντας το index για τις λίστες
εντολή append για προσθήκη στοιχείων στις λίστες
συνθήκη if
for loop

Εφαρμογή 1

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

Σε ένα meeting στην εταιρία όπου δουλεύεις, κοιτάτε τα έσοδα και τα έξοδα της εταιρίας τους τελευταίους 6
μήνες.

In [39]:

costs = [6.4, 5.2, 7.9, 2.4, 3.3]


profits = [5.4, 6.8, 7.6, 5.3, 1.7]

Γράψε ένα κώδικα που να υπολογίζει:

Πόσους μήνες είχαμε κέρδος, και πόσους ζημία.


Ποιους μήνες είχαμε κέρδος (πχ. 1ος, 4ος).

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

In [42]:

gain = 0
loss = 0
good_months = []

for i in range(len(costs)):

if costs[i] < profits[i]:


gain += 1
good_months.append(i)

else:
loss += 1

gain, loss, good_months

Out[42]:

(2, 3, [1, 3])

'Aσκηση
Έχουμε μηνιαία έσοδα και έξοδα.

In [43]:

costs = [6.4, 5.2, 7.9, 2.4, 3.3, 7.7, 4.6, 2.3, 6.8, 6.2, 1.4]
profits = [5.4, 6.8, 7.6, 5.3, 1.7, 6.3, 8.3, 6.9, 8.6, 7.7, 6.7]

Θέλουμε μηνιαίο απολογισμό (monthly balance), δηλαδή μια λίστα που δείχνει τί κέρδος ή ζημία είχαμε ανά
μήνα. (Ξεκινάμε με μια άδεια λίστα και κάνουμε append την διαφορά μεταξύ των εσόδων και εξόδων του
κάθε μήνα)
Θέλουμε το τελικο κέρδος, αφού αφαιρεθεί ο φόρος ΦΠΑ 18%. (Δηλαδή μια μεταβλητή με τιμή μηδέν, όπου
θα προστίθεται είτε η ζημία (όταν έχουμε ζημία), είτε το κερδος * 82/100 (όταν έχουμε κέρδος)

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

In [46]:

monthly_balance = []
summa = 0

for i in range(len(costs)):

monthly_balance.append(profits[i] - costs[i])

if monthly_balance[i] > 0:
summa += monthly_balance[i]*82/100
else: summa += monthly_balance[i]

monthly_balance, summa

Out[46]:

([-1.0,
1.5999999999999996,
-0.3000000000000007,
2.9,
-1.5999999999999999,
-1.4000000000000004,
3.700000000000001,
4.6000000000000005,
1.7999999999999998,
1.5,
5.300000000000001],
13.248000000000001)

Συναρτήσεις
In [7]:

def square(number):
return number**2

In [9]:

a = 5
square(a)

Out[9]:

25

Ο κώδικας της πρώτης εφαρμογής σε μορφή συνάρτησης δίνεται ως εξής

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

In [10]:

def accounting(costs, profits):

gain = 0
loss = 0
good_months = []

for i in range(len(costs)):

if costs[i] < profits[i]:


gain += 1
good_months.append(i)

else:
loss += 1

return gain, loss, good_months

In [11]:

c = [3.8 , 6.81, 3.65, 6.62, 5.9]


p = [5.32, 4.56, 5.75, 8.44, 6.95]

accounting(c,p)

Out[11]:

(4, 1, [0, 2, 3, 4])

In [12]:

gain, loss, good_months = accounting(c,p)

In [15]:

good_months

Out[15]:

[0, 2, 3, 4]

'Aσκηση
Μετατρέψτε σε συνάρτηση τον κώδικα που γράψατε προηγουμένως. Ορίσματα: έσοδα, έξοδα, ΦΠΑ.

Ο ΦΠΑ θα είναι ένας αριθμός από 0 έως 1, πχ για ΦΠΑ 18%, θα δίνουμε στο όρισμα τιμή 0.18. Άρα, σε μήνες
που σημειώθηκε κέρδος, το κερδος μετά τον φόρο θα υπολογίζεται ως: κέρδος ∗ (1 − ΦΠΑ)
Τρέξτε την συνάρτηση χρησιμοποιώντας ως ορίσματα τις παρακάτω τιμές. Κάνετε copy-paste τον κώδικα και τα
αποτελέσματα στο αρχειάκι notepad.

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

In [20]:

costs = [3.8 , 6.81, 3.65, 6.62, 5.9]


profits = [5.32, 4.56, 5.75, 8.44, 6.95]
fpa = 0.05

In [21]:

def accounting2(profits, costs, fpa):

monthly_balance = []
summa = 0

for i in range(len(costs)):

monthly_balance.append(profits[i] - costs[i])

if monthly_balance[i] > 0:
summa += monthly_balance[i]*(1-fpa)
else: summa += monthly_balance[i]

return monthly_balance, summa

In [22]:

accounting2(profits,costs, fpa)

Out[22]:

([1.5200000000000005, -2.25, 2.1, 1.8199999999999994, 1.0499999999999998],


3.9154999999999998)

Numpy
Η βιβλιοθήκη που χρησιμοποιούμε για μαθηματικές πράξεις και για πράξεις με πίνακες και διανύσματα.

Το εισάγουμε ως εξής

In [4]:

import numpy as np

Η δομή δεδομένων που χρησιμοποιεί είναι το numpy array. Σε αρχική φάση, τα arrays που θα
χρησιμοποιήσουμε θα είναι μονοδιάστατα, δηλαδή διανύσματα και όχι πίνακες, και μοιάζουν με τις λίστες που
έχουμε ήδη δει.

In [17]:

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

Out[17]:

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

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

Ισχύουν κάποιες λειτουργίες που είδαμε στις λίστες, όπως το indexing και η εντολή len.

In [5]:

x[0:3]

Out[5]:

array([0, 1, 2])

In [3]:

len(x)

Out[3]:

Κάποιες επιπλέον λειτουργίες

In [6]:

np.sum(x)

Out[6]:

36

In [7]:

np.mean(x)

Out[7]:

4.0

In [9]:

np.max(x), np.min(x)

Out[9]:

(8, 0)

Μετατροπή λίστας σε numpy array.

In [11]:

l = [9,8,7,6,5,4,3,2,1,0]
l

Out[11]:

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

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

In [13]:

l = np.array(l)
l

Out[13]:

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

Μπορούμε να προσθέσουμε, ή να αφαιρέσουμε, κλπ, arrays μεταξύ τους, αρκεί να έχουν το ίδιο μήκος.

In [18]:

x+l

Out[18]:

array([9, 9, 9, 9, 9, 9, 9, 9, 9, 9])

In [22]:

Out[22]:

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

Μπορούμε να προσ΄θεσουμε όλα τα στοιχεία του array με έναν αριθμό, ή να πολλπλασιάσουμε array με τον
εαυτό του (δηλαδή κάθε στοιχείο εις το τετράγωνο)

In [22]:

x+3

Out[22]:

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

In [23]:

x**2

Out[23]:

array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81], dtype=int32)

Η εντολή np.zeros(χ) μας δίνει ένα array από χ μηδενικά.

In [69]:

a = np.zeros(3)
a

Out[69]:

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

Η array.copy() χρησιμοποιείται όταν αντιγράφουμε arrays και δεν θέλουμε οι μετατροπές που θα κάνουμε στο
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 13/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook

αντίγραφο να επηρεάσουν το αρχικό.

In [69]:

a = np.zeros(3)
a

Out[69]:

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

In [71]:

b = a
b += 3
b

Out[71]:

array([3., 3., 3.])

In [72]:

Out[72]:

array([3., 3., 3.])

In [74]:

a = np.zeros(3)
b = a.copy()
b += 3
a

Out[74]:

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

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

Operator Description

np.array Δημιουργία λίστας τύπου numpy array

np.zeros Λίστα από μηδενικά

np.ones Λίστα από άσους

np.sum 'Αθροισμα στοιχείων λίστας

np.max Μέγιστη τιμή λίστας

np.min Ελάχιστη τιμή λίστας

np.mean Μέσος όρος

array.copy() Αντιγραφή λίστας, αλλαγές δεν επηρεάζουν το πρωτότυπο

τελεστές Μαθηματικές πράξεις σε όλα τα στοιχεία

Εφαρμογή
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 14/20
φ ρμ γή
4/5/2022 1_Intro_to_Python - Jupyter Notebook

Αεροδρόμιο, αριθμός εντός δεν πρέπει, για λόγους ασφαλείας, να υπερβεί κάποιο όριο, σε σχέση με το πόσοι
υπάλληλοι ασφαλείας βρίσκονται εκεί.

Φωτοκύτταρο ενεργοποιείται όταν κάποιος μπαίνει ή βγαίνει, κρατώντας κατάλογο πόσοι άνθρωποι υπάρχουν
μέσα ανά πάσα στιγμή.

Παρακάτω καταγράφονται, για 12 στιγμές κατά την διάρκεια της ημέρας, πόσοι άνθρωποι βρίσκονταν εντός, και
πόσοι υπάλληλοι ασφαλείας.

In [5]:

people = [56, 11, 89, 59, 106, 50, 58, 28, 83, 22, 22, 27]
security = [3, 5, 11, 11, 6, 10, 9, 3, 11, 6, 7, 7]

Είσαι operations manager, και σε καλεί το αεροδρόμιο ως εξωτερικό συνεργάτη, να αξιολογήσεις κατά πόσον η
κίνηση των πελατών αντιστοιχεί με τον αριθμό των υπαλλήλων ασφαλείας.

Σκοπός είναι το ελάχιστο κόστος μισθοδοσίας, δηλαδή να απασχολούνται όσο το δυνατόν λιγοτεροι υπάλληλοι,
αλλά και να καλύπτονται πάντα οι ανάγκες του αεροδρομίου, δηλαδή ποτέ να μην απασχολούνται λιγότεροι
υπάλληλοι από όσο πρέπει.

Η απαιτούμενη σχέση μεταξύ πελατών και υπαλλήλων ασφαλείας, διέπεται από δύο κανόνες:

Πάντα πρέπει να υπάρχουν τουλάχιστον τρεις υπάλληλοι ασφαλείας.


Επιπλέον αυτών των τριών, θα πρέπει για κάθε 10 ανθρώπους να προστεθεί ένας υπάλληλος.

Πρέπει να τους δώσεις:

μια λίστα με το πόσοι υπάλληλοι θα χρειαζόντουσαν κατά την διάρκεια της ημέρας
μια λίστα με το πόσους υπαλλήλους είχε περισσότερο ή λιγότερο από όσο ήταν απολύτως αναγκαίο

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

έναν αριθμό που εκφράζει πόσους, κατά μέσο όρο, υπαλλήλους απασχολούσε λιγότερο ή περισσότερο
από το απολύτως αναγκαίο.

Στην λίστα με το πόσοι υπάλληλοι θα χρειαζόντουσαν κατά την διάρκεια της ημέρας, θα διαιρέσουμε τον αριθμό
των ανθρώπων δια του 10 ή του 15, ανάλογα την περίσταση. Το πρόβλημα είναι ότι θέλουμε ακέραιο
αποτέλεσμα, αλλά η διαίρεση μας δίνει αποτελέσματα του στυλ:

In [2]:

45/10

Out[2]:

4.5

Εδώ είναι που θα χρησιμοποιήσουμε την διπλή διαγώνιο:

In [33]:

45//10

Out[33]:

In [6]:

needed = np.zeros(12, dtype='int')


needed

Out[6]:

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

In [7]:

for i in range(len(people)):
if people[i] < 50: needed[i] = people[i]//10
if people[i] > 50: needed[i] = 2*people[i]//15

print(people)
print(needed)

[56, 11, 89, 59, 106, 50, 58, 28, 83, 22, 22, 27]
[ 7 1 11 7 14 0 7 2 11 2 2 2]

Προσθέτουμε και τους 3 που είναι επιπλέον και απαραίτητοι, και το πρώτο ερώτημα είναι έτοιμο.

In [8]:

needed += 3
needed

Out[8]:

array([10, 4, 14, 10, 17, 3, 10, 5, 14, 5, 5, 5])

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

Τώρα θέλουμε μια λίστα με το πόσους υπαλλήλους είχε περισσότερο ή λιγότερο από όσο ήταν απολύτως
αναγκαίο.

In [9]:

deviation = security - needed


deviation

Out[9]:

array([ -7, 1, -3, 1, -11, 7, -1, -2, -3, 1, 2, 2])

Τέλος, θέλουμε έναν αριθμό που εκφράζει πόσους, κατά μέσο όρο, υπαλλήλους απασχολούσε λιγότερο ή
περισσότερο από το απολύτως αναγκαίο.

In [10]:

mean = np.mean(deviation)
np.around(mean)

Out[10]:

-1.0

Αντί για την εντολή np.around(mean), μπορούμε να το κάνουμε κι έτσι

In [64]:

int(mean)

Out[64]:

-1

'Ασκηση

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

Σε ένα γεωγραφικό διαμέρισμα υπάρχουν πλήθος δασικές εκτάσεις, που το ερχόμενο καλοκαίρι αντιμετωπίζουν
κίνδυνο πυρκαγιάς. Οι αρχές ζητούν την συμβουλή σου, ως operations manager, στο πως να κάνουν
αποδοτικότερη πρόληψη. Έχεις στην διάθεσή σου τα εξής δεδομένα:

Κατάλογο με τις εκτάσεις (σε εκτάρια) της κάθε δασικής περιοχής


Κατάλογο που δείχνει πόσα χιλιόμετρα απέχει από κάθε δασική έκταση η κοντινότερη πυροσβεστική βάση
Κατάλογο που δείχνει πόσα πυροσβεστικά οχήματα διαθέτει η κοντινότερη βάση της κάθε περιοχής

In [25]:

areas = np.array([191.54, 130.94, 32.99, 80. , 189.87, 134.3 , 81.2 , 204.41, 162.01, 1
distances = np.array([ 6.7, 29.8, 18. , 6.5, 15.4, 29.9, 27.8, 18.7, 14.6, 25.1])#km
firetrucks = np.array([6, 8, 6, 4, 2, 2, 7, 9, 3, 3])

Είναι επίσης γνωστές οι εξής πληροφορίες:

κάθε όχημα χωράει 5700 λίτρα νερό


ένα εκτάριο φωτιάς χρειάζεται 188 λιτρα νερό για να σβηστεί
κάθε όχημα καίει 0.475 λίτρα πετρέλαιο ανά χιλιόμετρο
το πετρέλαιο στοιχίζει 1.2 ευρώ το λίτρο
νερό στοιχίζει 0.1 ευρώ το λίτρο

Θα προβούμε σε μια μικρή εξερεύνηση των δεδομένων, απαντώντας σε μερικά απλά ερωτήματα:

Πόσα εκτάρια είναι η μικρότερη και η μεγαλύτερη σε έκταση δασική περιοχή;

In [16]:

np.min(areas), np.max(areas)

Out[16]:

(32.99, 204.41)

Πόσο νερό θα χρειαζόταν για να σβήσουμε τη φωτιά σε κάθε περιοχή;

In [19]:

water_needed = areas*188
water_needed

Out[19]:

array([36009.52, 24616.72, 6202.12, 15040. , 35695.56, 25248.4 ,


15265.6 , 38429.08, 30457.88, 18901.52])

Πόσα οχήματα θα χρειαζόταν για να σβήσει η φωτιά κάθε περιοχής; (Κάθε όχημα χωράει 5700 λίτρα νερό)

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

In [20]:

water_needed/5700

Out[20]:

array([6.31745965, 4.31872281, 1.08809123, 2.63859649, 6.26237895,


4.42954386, 2.67817544, 6.74194386, 5.34348772, 3.31605614])

H παραπάνω απάντηση δεν είναι αποδεκτή. Δεν γίνεται μια βάση να έχει 6,31 οχήματα. Αν η διαίρεση
επιστρέψει πχ 6,31 αυτό σημαίνει πως 6 οχήματα δεν φθάνουν και θα χρειαστεί και έβδομο. Οπότε η
στρογγυλοποίση θα είναι πάντοτε προς τα πάνω.

Αυτό γίνεται ως εξής

In [27]:

trucks_needed = ((water_needed/5700)+1).astype('int')
trucks_needed

Out[27]:

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

Πόσο θα κοστίσει το απαιτούμενο νερό για το σβήσιμο της φωτιάς?

In [31]:

water_cost = water_needed * 0.1


water_cost

Out[31]:

array([3600.952, 2461.672, 620.212, 1504. , 3569.556, 2524.84 ,


1526.56 , 3842.908, 3045.788, 1890.152])

Πόσο θα κοστίσoυν τα απαιτούμενα καύσιμα για το σβήσιμο της φωτιάς?

Για κάθε ένα από τα απαιτούμενα δρομολόγια το κόστος θα είναι 2 ∗ 𝑑𝑖𝑠𝑡𝑎𝑛𝑐𝑒 ∗ 𝑔𝑎𝑠𝑝𝑟𝑖𝑐𝑒. (Πολλαπλασιάζουμε
επί δύο γιατί το όχημα θα κάψει καύσιμα όταν θα επιστρέφει στην βάση)

H τιμή πετρελαίου ανά χιλιόμετρο βρίσκεται πολλαπλασιάζοντας την τιμή πετρελαίου ανά λίτρο (1.2 ευρώ) επί
πόσα λίτρα καίει το όχημα ανά χιλιόμετρο (0.475 λίτρα).

'Επειτα πολλαπλασιάζουμε τον απαιτούμενο αριθμό δρομολογίων (ή απαιτούμενο αριθμό οχημάτων) με το


κόστος ανά δρομολόγιο.

In [36]:

gas_price_per_km = 1.2 * 0.475


route_prices = 2 * distances * gas_price_per_km
trucks_needed*route_prices

Out[36]:

array([ 7.638, 33.972, 20.52 , 7.41 , 17.556, 34.086, 31.692, 21.318,


16.644, 28.614])

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

Καλό είναι οι πυρκαγιές να σβηστούν όσο το δυνατόν γρήγορα. Πρέπει να ξέρουμε ποιες περιοχές έχουν
αρκετά διαθέσιμα πυροσβεστικά οχήματα για να σβηστεί η πυρκαγία με ένα μόνο δρομολόγιο.

Γράψτε κώδικα που να δίνει μια δυαδική λίστα, δηλαδή μια λίστα που τα στοιχεία της θα είναι είτε 0 είτε 1, όπου
το 0 θα συμβολίζει ότι αυτή η περιοχή δεν έχει έλλειψη σε οχήματα, και 1 να συμβολίζει ότι η περιοχή έχει
έλλειψη.

In [43]:

shortages = np.zeros(len(areas),dtype='int')

for i in range(len(trucks_needed)):
if firetrucks[i] < trucks_needed[i]:
shortages[i] = 1

shortages

Out[43]:

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

Περισσότερα
Τα παρακάτω δύο links αναπέμπουν σε δύο διαλέξεις στο youtube, που αφορούν το προγραμματιστικό
υπόβαθρο που θα χρειαστούμε σε αυτό το μάθημα.

Οι δύο διαλέξεις αυτές είναι επιλεγμένες με κριτήριο το ότι είναι ευκολοκατανόητες, ιδανικές για αρχαρίους,
μικρής χρονικής διάρκειας, πολύ ενδιαφέρουσες, και καλύπτουν ακριβώς την ύλη που θέλουμε χωρίς
παραπανίσια πράγματα.

Python-based scientific computing I (https://www.youtube.com/watch?


v=2JIafdzwt74&ab_channel=ICTPCondensedMatterandStatisticalPhysics)

Python NumPy Tutorial for Beginners (https://www.youtube.com/watch?


v=QUT1VHiLmmI&t=1392s&ab_channel=freeCodeCamp.org)

http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 20/20

You might also like