Advertisement
Nikolovska

[ВИ] Колоквиумски задачи 2018

May 22nd, 2018
3,938
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.72 KB | None | 0 0
  1. Црно - бело Problem 1 (0 / 0)
  2. Предложете соодветна репрезентација и напишете ги потребните функции во Python за да се реши следниот проблем за кој една можна почетна состојба е прикажана на Слика 1:
  3.  
  4. enter image description here
  5.  
  6. Слика 1
  7.  
  8. “Tабла со димензии N x N се состои од бели и црни полиња. Со избор (кликнување) на едно поле се прави промена на бојата на тоа поле и на сите негови непосредни соседи (горе, долу, лево и десно) во спротивната боја, како што е прикажано на Слика 2. Целта е сите полиња на таблата да бидат обоени во бела боја. Потребно е проблемот да се реши во најмал број на потези т.е. со избирање (кликнување) на најмал можен број на полиња.”
  9.  
  10. enter image description here
  11.  
  12. Слика 2
  13.  
  14. За сите тест примери обликот на таблата е ист како на примерот даден на Слика 1. За секој тест пример се менува големината N на таблата, како и распоредот на црни и бели полиња на неа, соодветно.
  15.  
  16. Во рамки на почетниот код даден за задачата се вчитуваат влезните аргументи за секој тест пример. Во променливата N ја имате големината на таблата (бројот на редици односно колони); во променливата polinja ја имате бојата на сите полиња на таблата (по редослед: одлево - надесно, редица по редица, ако таблата ја гледате како матрица), каде 1 означува дека полето е обоено во црна, а 0 означува дека полето е обоено во бела боја.
  17.  
  18. Изборот на полиња (потезите) потребно е да ги именувате на следниот начин:
  19.  
  20. x: redica, y: kolona
  21.  
  22. каде _redica_ и _kolona_ се редицата и колоната на избраното (кликнатото) поле (ако таблата ја гледате како матрица).
  23.  
  24. Вашиот код треба да има само еден повик на функција за приказ на стандарден излез (print) со кој ќе ја вратите секвенцата на потези која треба да се направи за да може сите полиња на таблата да бидат обоени во бела боја. Треба да примените неинформирано пребарување. Врз основа на тест примерите треба самите да определите кое пребарување ќе го користите.
  25.  
  26.  
  27. Почетен код:
  28.  
  29. #Vcituvanje na vleznite argumenti za test primerite
  30. N = input()
  31. polinja = map(int, input().split(','))
  32. #Vasiot kod pisuvajte go pod ovoj komentar
  33.  
  34.  
  35. =======================================================================================================================================
  36.  
  37.  
  38. Црно - бело 2 Problem 2 (0 / 0)
  39. Проблемот во оваа задача е идентичен како проблемот во претходната задача и важат истите ограничувања.
  40.  
  41. За разлика од Задача 1, овде треба да ја вратите секвенцата на потези која треба да се направи за да може сите полиња на таблата да бидат обоени во бела боја доколку се примени информирано пребарување. Врз основа на тест примерите треба самите да определите растојание за имплементација на евристичката функција.
  42.  
  43. =======================================================================================================================================
  44.  
  45. Дрва за одлучување Problem 3 (0 / 0)
  46. Да се промени функцијата за предвидување, така што при изминувањето ќе печати информации за:
  47.  
  48. со која колона и вредност се споредува
  49. за која е тековната вредност на тест примерокот за бараната колона
  50. нивото на тековниот јазол во дрвото
  51. која е следната гранка што ќе се изминува низ дрвото (True branch или False branch)
  52. преостанатиот дел од дрвото што треба да се измине
  53. празна линија
  54. Потоа да се испечати истренираното дрво, да се вчита непознат тренинг примерок од стандардниот влез и истиот да се класифицира со новата функција за предвидување.
  55.  
  56. trainingData=[['twitter','USA','yes',18,'None'],
  57.         ['google','France','yes',23,'Premium'],
  58.         ['google','France','no',26,'Basic'],
  59.         ['google','Macedonia','yes',13,'None'],
  60.         ['pinterest','USA','yes',24,'Basic'],
  61.         ['bing','France','yes',23,'Basic'],
  62.         ['google','UK','no',21,'Premium'],
  63.         ['facebook','New Zealand','no',12,'None'],
  64.         ['facebook','UK','no',21,'Basic'],
  65.         ['google','USA','no',24,'Premium'],
  66.         ['twitter','France','yes',19,'None'],
  67.         ['pinterest','USA','no',18,'None'],
  68.         ['google','UK','no',18,'None'],
  69.         ['bing','UK','yes',19,'Premium'],
  70.         ['bing','Macedonia','no',10,'None'],
  71.         ['facebook','Macedonia','no',16,'Basic'],
  72.         ['bing','UK','no',19,'Basic'],
  73.         ['pinterest','Germany','no',2,'None'],
  74.         ['pinterest','USA','yes',12,'Basic'],
  75.         ['twitter','UK','no',21,'None'],
  76.         ['twitter','UK','yes',26,'Premium'],
  77.         ['google','UK','yes',18,'Basic'],
  78.         ['bing','France','yes',19,'Basic']]
  79.  
  80.  
  81. # trainingData=[line.split('\t') for line in file('decision_tree_example.txt')]
  82.  
  83. class decisionnode:
  84.       def __init__(self,col=-1,value=None,results=None,tb=None,fb=None):
  85.          self.col=col
  86.          self.value=value
  87.          self.results=results
  88.          self.tb=tb
  89.          self.fb=fb
  90.  
  91. def sporedi_broj(row,column,value):
  92.   return row[column]>=value
  93.  
  94. def sporedi_string(row,column,value):
  95.   return row[column]==value
  96.  
  97. # Divides a set on a specific column. Can handle numeric
  98. # or nominal values
  99. def divideset(rows,column,value):
  100.     # Make a function that tells us if a row is in
  101.     # the first group (true) or the second group (false)
  102.     split_function=None
  103.     if isinstance(value,int) or isinstance(value,float): # ako vrednosta so koja sporeduvame e od tip int ili float
  104.        #split_function=lambda row:row[column]>=value # togas vrati funkcija cij argument e row i vrakja vrednost true ili false
  105.        split_function=sporedi_broj
  106.     else:
  107.        # split_function=lambda row:row[column]==value # ako vrednosta so koja sporeduvame e od drug tip (string)
  108.        split_function=sporedi_string
  109.  
  110.     # Divide the rows into two sets and return them
  111.     # set1=[row for row in rows if split_function(row)]  # za sekoj row od rows za koj split_function vrakja true
  112.     # set2=[row for row in rows if not split_function(row)] # za sekoj row od rows za koj split_function vrakja false
  113.     set1=[row for row in rows if split_function(row,column,value)]  # za sekoj row od rows za koj split_function vrakja true
  114.     set2=[row for row in rows if not split_function(row,column,value)] # za sekoj row od rows za koj split_function vrakja false
  115.    
  116.     return (set1,set2)
  117.  
  118.  
  119. # Create counts of possible results (the last column of
  120. # each row is the result)
  121. def uniquecounts(rows):
  122.   results={}
  123.   for row in rows:
  124.      # The result is the last column
  125.      r=row[len(row)-1]
  126.      if r not in results: results[r]=0
  127.      results[r]+=1
  128.   return results
  129.  
  130.  
  131. # Entropy is the sum of p(x)log(p(x)) across all
  132. # the different possible results
  133. def entropy(rows):
  134.       from math import log
  135.       log2=lambda x:log(x)/log(2)
  136.       results=uniquecounts(rows)
  137.       # Now calculate the entropy
  138.       ent=0.0
  139.       for r in results.keys():
  140.             p=float(results[r])/len(rows)
  141.             ent=ent-p*log2(p)
  142.       return ent
  143.  
  144. def buildtree(rows,scoref=entropy):
  145.       if len(rows)==0: return decisionnode()
  146.       current_score=scoref(rows)
  147.  
  148.       # Set up some variables to track the best criteria
  149.       best_gain=0.0
  150.       best_criteria=None
  151.       best_sets=None
  152.      
  153.       column_count=len(rows[0])-1
  154.       for col in range(0,column_count):
  155.             # Generate the list of different values in
  156.             # this column
  157.             column_values={}
  158.             for row in rows:
  159.                   column_values[row[col]]=1
  160.                   # print row[col]
  161.             # print
  162.             # print column_values
  163.             # Now try dividing the rows up for each value
  164.             # in this column
  165.             for value in column_values.keys():
  166.                   (set1,set2)=divideset(rows,col,value)
  167.                  
  168.                   # Information gain
  169.                   p=float(len(set1))/len(rows)
  170.                   gain=current_score-p*scoref(set1)-(1-p)*scoref(set2)
  171.                   # print set1, set2, gain
  172.                   if gain>best_gain and len(set1)>0 and len(set2)>0:
  173.                         best_gain=gain
  174.                         best_criteria=(col,value)
  175.                         best_sets=(set1,set2)
  176.      
  177.       # Create the subbranches
  178.       if best_gain>0:
  179.             trueBranch=buildtree(best_sets[0])
  180.             falseBranch=buildtree(best_sets[1])
  181.             return decisionnode(col=best_criteria[0],value=best_criteria[1],
  182.                             tb=trueBranch, fb=falseBranch)
  183.       else:
  184.             return decisionnode(results=uniquecounts(rows))
  185.  
  186. def printtree(tree,indent=''):
  187.       #level = 0
  188.       # Is this a leaf node?
  189.       if tree.results!=None:
  190.             print str(tree.results)
  191.       else:
  192.             # Print the criteria
  193.             print str(tree.col)+':'+str(tree.value)+'?'
  194.             # Print the branches
  195.             print indent+'T->',
  196.             printtree(tree.tb,indent+'  ')
  197.             print indent+'F->',
  198.             printtree(tree.fb,indent+'  ')
  199.            
  200.  
  201. def classify(observation,tree):
  202.     if tree.results!=None:
  203.         results=[(value,key) for key,value in tree.results.items()]
  204.         results.sort()
  205.         return results[0][1]
  206.     else:
  207.         vrednost=observation[tree.col]
  208.         branch=None
  209.  
  210.         if isinstance(vrednost,int) or isinstance(vrednost,float):
  211.             if vrednost>=tree.value: branch=tree.tb
  212.             else: branch=tree.fb
  213.         else:
  214.            if vrednost==tree.value: branch=tree.tb
  215.            else: branch=tree.fb
  216.  
  217.         return classify(observation,branch)
  218.  
  219.  
  220. if __name__ == "__main__":
  221.     referrer=input()
  222.     location=input()
  223.     readFAQ=input()
  224.     pagesVisited=input()
  225.     serviceChosen='Unknown'
  226.  
  227.     testCase=[referrer, location, readFAQ, pagesVisited, serviceChosen]
  228.  
  229.     # vasiot kod tuka  
  230.        
  231.     drvo = buildtree(trainingData)
  232.     printtree(drvo)
  233.     klasifikacija = classify(testCase,drvo)
  234.     print klasifikacija
  235.  
  236.  
  237. =======================================================================================================================================
  238.  
  239.  
  240. Патека во граф Problem 4 (0 / 0)
  241. На сликата е даден ненасочен граф со неговите јазли и нивните меѓусебни растојанија.
  242.  
  243. enter image description here
  244.  
  245. За јазлите во графот не се познати локациите. Во рамки на вашиот код, јазлите дефинирајте ги точно со имињата дадени на сликата.
  246.  
  247. Треба да го решите проблемот на наоѓање на должината на најкратката патека помеѓу два јазли од графот, и притоа патеката да поминува низ еден "меѓујазел".
  248.  
  249. За секој тест пример се менуваат јазлите помеѓу кои треба да се најде најкратката патека и меѓујазелот низ кој треба да се помине. Во рамки на почетниот код даден за задачата се вчитуваат влезните аргументи за секој тест пример. Во променливите Pocetok и Kraj ги имате почетниот и крајниот јазел за најкратката патека која треба да ја најдете, а во Stanica го имате меѓујазелот низ кој треба да се помине.
  250.  
  251. Вашиот код треба да има само еден повик на функција за приказ на стандарден излез (print) со кој ќе ја вратите должината на најкратката патека помеѓу почетниот и крајниот јазел.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement