# HW 8 Ivan Christian # 1 ```java public static void foo() { float yesterday =readNumber() float today = readNumber() if (yesterday > today) { // debug here doSomething1(); } else { if (yesterday != today) { // debug here doSomething2(); } else { // debug here dosomething3(); } } } ``` For statement coverage, all the statements are covered if the debug is done at each junction of the if statement. If we know that the 1st branch is visited more often than the 2nd and the 2nd more often than the 3rd branch, then 2 statements are enough. This is because if no debug is generated, 1st branch is assumed to be run without issues. This will reduce the overhead as by process of elimination we know what is being checked. Any lower number of debug checks will not cover all the statements ```java public static void foo() { float yesterday = readNumber(); float today = readNumber(); if (yesterday > today) { // debug here doSomething1(); } else { if (yesterday != today) { doSomething2(); } else { // debug here dosomething3(); } } } ``` # 2 ```python from numpy.random import randint from numpy.random import rand import string import random # objective function def palindrome_fitness(x): score = 0 midpoint = int(len(x)/2) left_side = x[:midpoint] right_side = x[midpoint:] for i in range(midpoint): if left_side[::-1][i] == right_side[i]: score -= 1 return score # tournament selection def selection(pop, scores, k=3): # first random selection selection_ix = randint(len(pop)) # creates 2 random integer and compare the scores of the 3 for ix in randint(0, len(pop), k-1): # check if better (e.g. perform a tournament) if scores[ix] < scores[selection_ix]: selection_ix = ix return pop[selection_ix] # crossover two parents to create two children def crossover(p1, p2, r_cross): # children are copies of parents by default c1, c2 = p1, p2 # check for recombination if rand() < r_cross: # select crossover point that is not on the end of the string pt = randint(1, len(p1)-2) # perform crossover c1 = p1[:pt] + p2[pt:] c2 = p2[:pt] + p1[pt:] return [c1, c2] # mutation operator def mutation_char(charstring, r_mut): mutated_char = "" for i in range(len(charstring)): # check for a mutation if rand() < r_mut: mutated_char += random.choice(char_space) else: mutated_char += charstring[i] return mutated_char # function to generate random string of characters def generate_char(n_bits): gen_char = '' for i in range(n_bits): gen_char += random.choice(char_space) return gen_char # genetic algorithm def genetic_algorithm(objective, n_bits, n_iter, n_pop, r_cross, r_mut): # initial population of random character strings pop = [generate_char(n_bits) for _ in range(n_pop)] # keep track of best solution best, best_eval = 0, objective(pop[0]) # enumerate generations for gen in range(n_iter): # evaluate all candidates in the population scores = [objective(c) for c in pop] #print(f"scores at iteration {gen}: {scores}") # check for new best solution for i in range(n_pop): if scores[i] < best_eval: best, best_eval = pop[i], scores[i] print(">%d, new best f(%s) = %.3f" % (gen, pop[i], scores[i])) # select parents from the random selection function selected = [selection(pop, scores) for _ in range(n_pop)] # create the next generation children = list() for i in range(0, n_pop, 2): # get selected parents in pairs p1, p2 = selected[i], selected[i+1] # crossover and mutation for c in crossover(p1, p2, r_cross): # mutation c = mutation_char(c, r_mut) # store for next generation children.append(c) # replace population pop = children return [best, best_eval] char_space = string.ascii_lowercase # define the total iterations n_iter = 200 # bits n_bits = 64 # define the population size n_pop = 100 # crossover rate r_cross = 0.9 # mutation rate r_mut = 1.0 / float(n_bits) # perform the genetic algorithm search best, score = genetic_algorithm(palindrome_fitness, n_bits, n_iter, n_pop, r_cross, r_mut) print('Done!') print('f(%s) = %f' % (best, score)) ``` Result ``` >0, new best f(slprdyiqiuozyygvojxvqwlutqcqelknwfhvaclnykzbnlmensfdnqlpppxmruwz) = -2.000 >0, new best f(jkywbbanggkfscfrpqdbojmctkzwmxphhazthrxjaqzsqdlzriehdrzygggdslni) = -3.000 >0, new best f(qiqcixsehoyhczyhlksnuwnrsbmhpsgacxwuhavlmpwizakomvyrwvzduvcawqtw) = -4.000 >1, new best f(xvgnfvokaybpvwvdyuauulfllmyhubgilmcaxkalleljjmrzdgvcjskaanogmdrv) = -5.000 >2, new best f(irzyzdbiwcndznixzljhmkuhhifullrtvlslfdhuenzsqdlzrieydrzygggdslni) = -6.000 >9, new best f(jtmoaieucledgiqvamcdmbdlmbfuoixhlelswfsmarzmdaeakmiwgpbieglblutg) = -7.000 >10, new best f(jtmoaieucledgiqvamcdmbdmvoaszqhjfyfasywqndbmdaeakmiwvpbieglblutg) = -8.000 >12, new best f(jtmoajqewlekgiqvamcdmbdmvoaszqhjfyfasywqndbmdaeakmiwvpbieglblutg) = -9.000 >14, new best f(btulpjmewueogiqvamcdmydddocqelkcwphvqclnyqwmdtuakmiwgpbieglblutg) = -10.000 >14, new best f(btuebjqewqbhbiqvamcdmyddvooszqhjfyqasywqndbmdaeakmiwrpbieglbjutg) = -11.000 >16, new best f(btuepjqewsengiquamcdmqddvoaszqhjfyqascuqddbmdaeakmiwrpbieglpjutg) = -12.000 >18, new best f(btulpjmegbkdwiquamcdmyddvooszqhjfwqasywqndbmdaeakmiwgpbieglblutg) = -13.000 >19, new best f(btulpjqegbkdwiqvamcdmbdkvooszqhjfyqasywqndbmdaeakmiwgpbieglblutg) = -14.000 >21, new best f(btulpjqegbkdwiqvamcdmbddvoaszqhjfhqmsywqndbmdaeakbiwrpbieglblutg) = -15.000 >23, new best f(btulpjmegbkdwiqvamcdmbddvooszqhjfyqzseubddbmdtuakbiwwpbieglblutg) = -16.000 >24, new best f(btulpnmegbkdwiqvamcdmbddvooszqhjfyqzscuqddbmdteakmiwgpbiemlblutg) = -17.000 >28, new best f(ftulpjmegbkdwiqvaucdmbddvooszqhjfyqzschbddbmdtuakmiwrpbiemlblutg) = -18.000 >31, new best f(btulpjmegbkdwiqvaucdmbddvuoszqmjuyqzscuqddbmdtuakbiwwpbiemlblutg) = -19.000 >35, new best f(btulylsegbkdwixvaucdmbddvuoszqmjuyqzsruqddbmdtuakniwdpbieglrlutj) = -20.000 >38, new best f(btulylgegbkdwiqvaucdmbddvtoszqhjuqqzschbddbmdcuakniwdpbieglrlutj) = -21.000 >40, new best f(utulylgegbkdwikvaucdmbddbuoszqhjfyqzscubddbmdtuakniwdpbieglrluta) = -22.000 >42, new best f(utulylgegbkdwikvaucdmbddbuoszqhjfyqzscubddbmdtuakniwdpbgeglrluta) = -23.000 >46, new best f(btulylgegbpdwiqvaucdmbddbuoszqhjfyqzscubddbmdeuakniwdpbgeglrlutj) = -24.000 >52, new best f(btulylgegbpdwiqvaucdmbddbuoszqqjfqqzstubddbmdsuakhiwdpbgeglrlutj) = -25.000 >56, new best f(btulylgegbpdwiqvaucdmbddbuaszqqjfqqzstubddbmdsuakhiwdpbgeglrlutb) = -26.000 >59, new best f(btulylgegbpdwikpaucdmbddbucszqhjfyqzscubddbmdcuakoiwdpbgeglrlutb) = -27.000 >64, new best f(btulylgegbpdwiqpaucdmbddbucszqhjfyqzscubddbmdcuapoiwdpbgeglrlutb) = -28.000 >75, new best f(btulylgegbpdwiqvaucdmbddbucszqqqqqqzscubddbmdcuakhiwdpbgeglrlutb) = -29.000 >87, new best f(btultlgegbpdwitpaucdmbddbucszqqqqqqzscubddbmdcuakoiwdpbgegltlutb) = -30.000 >88, new best f(btultlgegbpdwihpaucdmbddbucszqqqqqqzscubddbmdcuavhiwdpbgegltlutb) = -31.000 >105, new best f(btultlgegbpdwiokaucdmbddbucszqqqqqqzscubddbmdcuakoiwdpbgegltlutb) = -32.000 Done! f(btultlgegbpdwiokaucdmbddbucszqqqqqqzscubddbmdcuakoiwdpbgegltlutb) = -32.000000 ``` In order to get the fitness function for a palindrome, we need to make sure that the end goal is to get the firsthalf (index 0 until midpoint) the same as the reversed secondhalf (midpoint to end) substring. the maxFitness score that we want is -32 (since if each element in the first and secondhalf substrings are the same then the maxFitness score would be half of 64). # 3 ```python from numpy.random import randint from numpy.random import rand import string import random desired_url = "http://www.ietf.org/rfc/rfc1738.txt" # objective function def URL_fitness(x, target = desired_url): score = 0 for i in range(len(x)): score += abs(ord(x[i]) - ord(target[i])) return score # tournament selection def selection(pop, scores, k=3): # first random selection selection_ix = randint(len(pop)) # creates 2 random integer and compare the scores of the 3 for ix in randint(0, len(pop), k-1): # check if better (e.g. perform a tournament) if scores[ix] < scores[selection_ix]: selection_ix = ix return pop[selection_ix] # crossover two parents to create two children def crossover(p1, p2, r_cross): # children are copies of parents by default c1, c2 = p1, p2 # check for recombination if rand() < r_cross: # select crossover point that is not on the end of the string pt = randint(1, len(p1)-2) # perform crossover c1 = p1[:pt] + p2[pt:] c2 = p2[:pt] + p1[pt:] return [c1, c2] # mutation operator def mutation_char(charstring, r_mut): mutated_char = "" for i in range(len(charstring)): # check for a mutation if rand() < r_mut: mutated_char += random.choice(char_space) else: mutated_char += charstring[i] return mutated_char # function to generate random string of characters def generate_char(n_bits): gen_char = '' for i in range(n_bits): gen_char += random.choice(char_space) return gen_char # genetic algorithm def genetic_algorithm(objective, n_bits, n_iter, n_pop, r_cross, r_mut): # initial population of random character strings pop = [generate_char(n_bits) for _ in range(n_pop)] # keep track of best solution best, best_eval = 0, objective(pop[0]) # enumerate generations for gen in range(n_iter): # evaluate all candidates in the population scores = [objective(c) for c in pop] #print(f"scores at iteration {gen}: {scores}") # check for new best solution for i in range(n_pop): if scores[i] < best_eval: best, best_eval = pop[i], scores[i] print(">%d, new best f(%s) = %.3f" % (gen, pop[i], scores[i])) # select parents from the random selection function selected = [selection(pop, scores) for _ in range(n_pop)] # create the next generation children = list() for i in range(0, n_pop, 2): # get selected parents in pairs p1, p2 = selected[i], selected[i+1] # crossover and mutation for c in crossover(p1, p2, r_cross): # mutation c = mutation_char(c, r_mut) # store for next generation children.append(c) # replace population pop = children return [best, best_eval] char_space = string.ascii_lowercase + string.digits + string.punctuation # define the total iterations n_iter = 500 # bits n_bits = len(desired_url) # define the population size n_pop = 1000 # crossover rate r_cross = 0.9 # mutation rate r_mut = 1.0 / float(n_bits) # perform the genetic algorithm search best, score = genetic_algorithm(URL_fitness, n_bits, n_iter, n_pop, r_cross, r_mut) print('Done!') print('f(%s) = %f' % (best, score)) ``` Results ``` >0, new best f(g.jt_/!$/>-@5c<'%+)%oc%+4xj<q9:z[)i) = 1148.000 >0, new best f(?l{\#?!1&+]"\{s^u%z\+$0|ylwh=!;/[ox) = 1117.000 >0, new best f(abwo=])?sc<h#?-{2)1,{!v!~fq:&$&3l/#) = 986.000 >0, new best f(~(nc8"4~@@|_7~1;szi1n;8`%up,$j~1nz$) = 964.000 >0, new best f(;^8b%ny~~`ytbad&{k~8}(j$j_xhe][}zxt) = 895.000 >0, new best f(a}wf@4&^1w|zf(s'!8o<xrp+)g2]=#*8nij) = 772.000 >1, new best f(\\{}%\=e~n(}jyl+8kb[<4|>~x`@kda19^r) = 750.000 >1, new best f(\\{}%g=e~n(}jyl+8k]m{>w?(>?(}:22}ze) = 717.000 >2, new best f(]qyt0+'<y1h8fzv8en\/zhbzk_~;r('#>~<) = 692.000 >2, new best f(gine])-?qb,~5}j`?xn~{~$*~]g.90>;gd:) = 673.000 >2, new best f(\\{}%g=e~n(}jyl+8k]m{>u,d6b]/a!.ujc) = 646.000 >3, new best f(\\{}%g=e~n(}jyl+8k]m{nu,d]']/a!.ujc) = 634.000 >3, new best f(gine])-?qb,~2qcfjh@%h=`-m<l-g+h.igu) = 604.000 >3, new best f(k1yw.."'`b,t{d]_yil[\]c/w\d-^+6-re<) = 587.000 >3, new best f(]qyt0+'<y1h8fzv,en\/zhbzku6183@#pnm) = 527.000 >4, new best f(\\{}%\=e~n(.jyv,en\/ohbzku6183@#pnm) = 477.000 >5, new best f(]ryt0+:?qw8y~szpiqg?\gk.yt6190>;gdx) = 429.000 >6, new best f(i{pf-/-ow|:g`~{-iqg?\gk.ytzh_'*1e^r) = 367.000 >8, new best f(]qyt5+-rvo&bg~;"vzr%}nl?sd6190);gdx) = 328.000 >8, new best f(gunt5+-rzo.bg~b3rn\/w%s7vnl-86]1e^r) = 291.000 >8, new best f(]qyt5+-rzn(}jyl+8kd4sv]4{ad\:/68hwx) = 288.000 >9, new best f(giny5+-rzo.bg~b3ri{0y^j!rud/86]?e^r) = 270.000 >9, new best f(qxat0/=ryn(`gwl+kk34sv]4imh(:/68hwx) = 267.000 >9, new best f(gint5+-rzo.ba~b>ri{0y^j7nnh'86?;urc) = 228.000 >10, new best f(giny5+-rzo.bg~b3ri{0y^j!rgd/9<>;urc) = 209.000 >13, new best f(_pkv;'&qvo.bg~b,rnf2jqi7nnl-.+>;hwx) = 208.000 >13, new best f(zvjj;'&s|u(}jyl<iqg/zhb"if`%907+k{u) = 198.000 >14, new best f(_pkt5+-r~n(`gwb3rkd0y^j!rgd/9<>;urc) = 195.000 >15, new best f(gunt5+-rzo._jyl)s|i'zh]7nn`-86?1e^r) = 194.000 >15, new best f(]unt5+-rz|._jyl)s|^/z^b!l_d-90>5urc) = 191.000 >15, new best f(cinv;'&qvo.bg~b,rqf2jr]4xsd-90>5ysx) = 181.000 >15, new best f(]unt5+1rzo._p{z-iqg4shb$vk^.9068hwx) = 176.000 >15, new best f(gq{m5+-rzn._jyl)snf2joi&w]i.64=8pxm) = 168.000 >15, new best f(]qyp5+-rvo/bf~b3rng3h_b4{ad9:/68hwx) = 165.000 >16, new best f(giyp5+-rvo/bf~b3rng3h_b4{ad9:/68hwx) = 163.000 >17, new best f(]unt5+-rzo._jyl-iqg4shb$vk^.9068hwx) = 154.000 >18, new best f(nupt5+-rvo/_jyl-iqg4shb$vk^.9068hwx) = 146.000 >19, new best f(gsny;+-rzo.bg~b,rqg3h_b4{ad99.7+k{u) = 143.000 >20, new best f(]ryt5+-r}n.bhwo-iqg7q`]7ne`-866(qwv) = 142.000 >20, new best f(dpyt5+-rvo+bg~b-iqg0zhi-nnh/:/65qwx) = 138.000 >21, new best f(]qyp5+-svo/bf~b3rni/zhb$vki.648/ixu) = 135.000 >22, new best f(guyt5.-rvr%bjyl)s|i.zhb0if`1907+hwx) = 134.000 >23, new best f(gqyt5+-ryy,g`yb,rsg5s]c4om^.9765ezy) = 133.000 >23, new best f(nukt>/-ow|.bgyl+iqg/qh]4xsd-836(qwx) = 124.000 >25, new best f(d|yt5+-ryy-g`~l)rqf/zhb4xjd-836(qwx) = 123.000 >25, new best f(gunt5+-svo/bf~b3rng3hg`4om^.648/nxu) = 122.000 >26, new best f(goyh5,/ryy,gfkb3rni/qhc-pf`-906,hwx) = 108.000 >28, new best f(iunm5+-svo/bfsb,rri/phb4xsd3936(qwx) = 106.000 >29, new best f(gsny;+-zzo,gfkb3rni/qhc-pf`-9/6(qwv) = 104.000 >29, new best f(gsnt1+-rzo.bgsb,rri/u`c/if`1648/ixu) = 100.000 >30, new best f(gs{t5+,ryy/g`sb2iqg0yhb/rfd/<568qwu) = 96.000 >31, new best f(gutt5+-zzo,gfkb3rni/qhc-pf`-<56-qwu) = 92.000 >33, new best f(hqyt5+-rzy,g`uc+ini/qhc-pf`18/8/ixu) = 89.000 >34, new best f(nutq5-/rvz/gpsb2iqg0yhb/rid.906'txu) = 87.000 >36, new best f(jqpt5+-ryy/g`sb3rri/qhc-pf`-<56-qwu) = 85.000 >36, new best f(guvt5+-rzy,g`ub+vqg/qhc-pf`-<56-qwu) = 83.000 >38, new best f(hqvt5+-rz|.bgyh-kqg4sgi/ofc1648/nxu) = 81.000 >38, new best f(guvt5+-rzy,g`ub+vrf/qhc)pf`1848/nxu) = 78.000 >40, new best f(gryq5-/rvx.kgwb,rqh/qhc4of`-<56-zwu) = 77.000 >41, new best f(hqqx8+-vyy/ggsb,rqf2qhc-pf`-456-qwu) = 74.000 >41, new best f(hqqx8+-vyy/ggwb3rrh/qhc-pf`1648/nxu) = 68.000 >44, new best f(gstt5,0{vx.kgwb,krf/qhc-pfc/947+qwx) = 63.000 >45, new best f(gstt5,0{vx.kgwb,krf/qhc-pfd.956-qwu) = 62.000 >47, new best f(jquo9+-rvt+kgwi-oqg2sgc/pfc1348/nxu) = 58.000 >49, new best f(jquo9+-rvt+kgwi-oqg2sgc/pfc1348-qwu) = 56.000 >49, new best f(iutt?+0vyy.igwi-oqg/qhb/rid3906.ywu) = 55.000 >51, new best f(gsvt9.-svx.kgsh,rrf0shc/pfc1348/zxu) = 50.000 >53, new best f(jquo9/-rvv+kfse,oqg/qgc-pfc-836/nxu) = 49.000 >54, new best f(jquo9/-rvv+kfse,oqg/qgc-pfc/646-qwu) = 46.000 >61, new best f(goto9+/svx/igse,org2sgc/pfd1348-qwu) = 44.000 >62, new best f(goto9+/svx/igse,org2sgc/pfd1348/txu) = 40.000 >64, new best f(jquo9/-yvx.kgse,org2qhb/rfd/959-txu) = 39.000 >66, new best f(jsto9.-svx.ggse,oqf/qhc-pfc1648.qwu) = 38.000 >70, new best f(gsto9+.vvx.gbsg-org2sgc/pfc1848-qwu) = 35.000 >70, new best f(gsto9+/vvx.kgsh-krg/qgc/rfd1648.qwu) = 33.000 >73, new best f(gsuo9/-rvv/igse,oqf/sgc/pfc1848-txu) = 31.000 >75, new best f(huto9./yvy/ggsh,rrg/qgc/pfc1848-txu) = 30.000 >76, new best f(jstp9/-svx.ifsb.org/qgc/rfd/647,txu) = 29.000 >78, new best f(gstp9/-svx.ifsb.org/qgc/rfd/647,txu) = 28.000 >79, new best f(huto9./uyw/igse,oqg0qhc/pfc1948.txs) = 26.000 >79, new best f(huto9./uyv/hgtg-oqg/qgc/pfc1848-txu) = 24.000 >84, new best f(gstp9/-svx.ifse-org0shc/rfc1648-txu) = 23.000 >92, new best f(gsto9//yvw.ggsg-org/ugc/rfc1848-txu) = 22.000 >93, new best f(gvtp9/-wvx.ifsg-org/qgc/ofc1848/txu) = 21.000 >95, new best f(huto9/-wvx.ifsg-org/qgc/ofc1648/txu) = 20.000 >95, new best f(guto9/-wvx.ifse.org/shc/qfc1648-txu) = 19.000 >96, new best f(gutp8/0vvw.igse.org/qgc/rfc1848-txu) = 17.000 >111, new best f(gstp9./vvw.igsg.org/sgc/rfc1848-txu) = 16.000 >111, new best f(gutp8//vvw.ifse.org/sgc/rfc1848-txu) = 15.000 >126, new best f(hutp9//wvx.ifsg-org/qgc/rfc1848.txu) = 13.000 >142, new best f(futp9//wvw.iesg-org/qgc/rfc1638.txu) = 12.000 >152, new best f(hstp9//wvw.iesg-org/qgc/rfc1848/txt) = 11.000 >164, new best f(hutp9//wvw.iesg-org/sgc/rfc1838/txt) = 10.000 >172, new best f(http9//wvw.iesg-org/sgc/rfc1838.txt) = 8.000 >209, new best f(http9//wvw.iesg-org/qfc/rfc1838.txt) = 7.000 >229, new best f(http9//wvw.ietg-org/qfc/rfc1838.txt) = 6.000 >255, new best f(http9//wvw.ietf-org/sfc/rfc1838.txt) = 5.000 >263, new best f(http://wvw.ietf-org/sfc/rfc1838.txt) = 4.000 >287, new best f(http://wvw.ietf-org/qfc/rfc1738.txt) = 3.000 >294, new best f(http://wvw.ietf.org/sfc/rfc1738.txt) = 2.000 >308, new best f(http://www.ietf.org/rfc/rfc1838.txt) = 1.000 >373, new best f(http://www.ietf.org/rfc/rfc1738.txt) = 0.000 Done! f(http://www.ietf.org/rfc/rfc1738.txt) = 0.000000 ```