3.17 Algorithmic Efficiency

Vocabulary

  • Problem: a general description of a task that can or cannot be solved algorithmically
  • Decision Problem: A problem with a yes or no answer
  • Organization Problem: a problem with a goal of finding the best answer
  • Instance: a problem with a specific input
  • Efficiency: amount of computing needed to solve a problem
  • Polynomial Efficiency (Good): more work takes a proportional amount of time (1 job is +2 time)
  • Exponential Efficiency (Bad): more work takes an exponential amount more time (1 job is 2x time)
  • Heuristic Approach: When optimal solutions are inefficient, look for a possibly optimal solution that is more efficient
  • Decidable Problem: A decision problem that has a clear solution that will always make a correct output
  • Undecidable Problem: A decision problem with no solution that is not guaranteed to produce the correct output

Notes

  • unnecessary code can be removed or simplified
  • shorter code = higher efficiency
  • polynomial efficiency = time increase linearly
  • exponential efficiency = time increase exponentially

Challenge

Try and fix this ineficcient code! Only change the code between the two commented lines. Fully programmed solution will improve your grade, at a minimum show that you tried.

import time
numlist = [1,3,5,7,9,11,13,15,17,19]
valuelist = [0,3,6,9,12,15,18,21]
def isvalue(value,array):
    #--------------------
    exists = False
    min = 0
    tmax = 0
    max = int(len(numlist) - 1)
    while (max - min) > 1:
        if numlist[max] > value:
            tmax = max
            max = int((min + max) / 2)
            if max % 1 != 0:
                max += .5
        else:
            min = max
            max = tmax

    for R in range (int(min), int(tmax)):
        if numlist[R] == value:
            exists = "True"
            return(exists)
    #--------------------
starttime = time.time()
for i in range(100000):
    for i in range(len(valuelist)):
        x = isvalue(valuelist[i],numlist)
endtime = time.time()
print(endtime-starttime,'seconds') 
0.5974593830108643 seconds

3.18 Undecidable Problems

Notes

  • paradoxes are created by contradicting statements
  • comptuers cannot solve every problem
  • computers will time out after a certain amount of time
  • paradoxes will keep going by deafult as computers do not know when to end

Homework!

Make an algorithm that finds the fastest route that hits every location once starting and ending at Del Norte. Make sure to show your thinking. If you are strugling, try using a huristic approach. Remember, what matters more than having perfectly functioning code is that you tried your hardest.

dataset = {
    'DelNorte':{
        'Westview':15,
        'MtCarmel':20,
        'Poway':35,
        'RanchoBernardo':50
    },
    'Westview':{
        'DelNorte':15,
        'MtCarmel':35,
        'Poway':25,
        'RanchoBernardo': 45
    },
    'MtCarmel':{
        'Westview':35,
        'DelNorte':20,
        'Poway':40,
        'RanchoBernardo':30
    },
    'Poway':{
        'Westview':25,
        'MtCarmel':40,
        'DelNorte':35,
        'RanchoBernardo':15
    },
    'RanchoBernardo':{
        'Westview':45,
        'MtCarmel':30,
        'Poway':15,
        'DelNorte':50
    }
}
def fastestroute(start,data):
    path = []
    unused = ['DelNorte','Westview','MtCarmel','Poway','RanchoBernardo']
    cd = {} #current dictionary, sub dictionary of current school
    current = start #current school
    plen = 0 #path length

    for a in unused: # set first school
        if start == a:
            path.append(a)
            unused.remove(a)
    
    while len(unused) > 0: # find next school with smallest path that hasnt been visited yet.\
        min = 60
        mname = ''
        cd = data[current]
        for b in unused:
            if cd[b] < min:
                min = cd[b]
                mname = b
        plen += min
        path.append(mname)
        unused.remove(mname)
        current = mname
    
    plen += data[path[4]][path[0]] # add starting school to the end
    path.append(path[0])
    print(path)
    print("path length: " + str(plen))

        


fastestroute('DelNorte',dataset)
['DelNorte', 'Westview', 'Poway', 'RanchoBernardo', 'MtCarmel', 'DelNorte']
path length: 105

Grading:

Challenge Homework
.15 pts for attempt .65 for attempt
.20 pts for complete .70 for complete
.25 pts for above and beyond .75 pts for above and beyond