In [5]:
import numpy as np
from ipythonblocks import BlockGrid as bg
from IPython.html.widgets import interact, interactive, fixed
from IPython.html import widgets
from IPython.display import display
import timeit
In [60]:
#Creating interacts that allow the user to choose the percent of each color,
#size of the grid, the individual box size, satisfaction percentage.
def interacts(size1):
return size1
def interacts1(satisfaction_1):
return satisfaction_1
def interacts2(orange_1):
return orange_1
def interacts3(blue_1, ):
return blue_1
def interacts4(block_size1):
return block_size1
def interacts5(magenta_1):
return magenta_1
j = interactive(interacts, size1 = (1,100))
p = interactive(interacts1, satisfaction_1 = (0,1,0.01))
o = interactive(interacts2, orange_1 = (0,1,0.01))
b = interactive(interacts3, blue_1 = (0,1,0.01))
bs = interactive(interacts4, block_size1 = (0,30,0.1))
m = interactive(interacts5, magenta_1 = (0,1,0.01))
display(bs)
display(j)
display(m)
display(b)
display(o)
display(p)
In [56]:
#Creates an nxn numpy grid with a chosen percent of 1's and 2's which correspond to orange and blue blocks.
k = j.result
size_of_block = bs.result
satisfaction_percentage = p.result
blue = b.result
orange = o.result
magenta = m.result
black = 1 - blue - orange - magenta
y = k - 1
grid = np.random.choice([0,1,2,3],size=(k,k),p = [black,orange,blue,magenta])
print (grid)
grid2 = np.hstack(grid)
print (grid2)
grid1 = bg(k,k, block_size=size_of_block)
grid3 = bg(k,k, block_size=size_of_block)
grid4 = bg(k,k, block_size=size_of_block)
In [57]:
#Creates an nxn IPythonBlocks grid.
def make_grid():
x = 0
orange2 = 0
blue2 = 0
magenta2 = 0
black2 = 0
for i in grid4:
if grid2[x]==1:
orange2 += 1
i.set_colors(300, 178, 34)
elif grid2[x]==2:
blue2 += 1
i.set_colors(90, 300, 420)
elif grid2[x]==3:
magenta2+=1
i.set_colors(600, 42, 200)
else:
black2+=1
x += 1
return orange2,blue2,black2,magenta2
orange3, blue3, black3, magenta3 = make_grid()
display(grid4)
print ('Orange', orange3)
print ('Blue', blue3)
print ('Black', black3)
print ('Magenta', magenta3)
%timeit -n1 -r1 make_grid()
In [52]:
#Finds the neighbors of the grid and checks to see if the neighbors
#have the same value and then calculates the satisfaction of that block.
def satisfaction_percent():
same_c1 = 0
same_c2 = 0
same_c3 = 0
same_c4 = 0
same_col_1 = 0
same_col_2 = 0
same_row_1 = 0
same_row_2 = 0
satisfaction_c1 = 0
satisfaction_c2 = 0
satisfaction_c3 = 0
satisfaction_c4 = 0
satisfaction_col_1 = 0
satisfaction_col_2 = 0
satisfaction_row_1 = 0
satisfaction_row_2 = 0
sat_col_1=[]
sat_col_2=[]
sat_row_1=[]
sat_row_2=[]
sat_1=[]
same = 0
row = 0
col = 0
i_5 = 0
i_6 = 0
i_7 = 0
i_8 = 0
i_9 = 0
for n in grid:
if row==0 and col==0:
if grid[0,0]==0:
same_c1+=3
else:
if grid[0,0]==grid[1,0]:
same_c1+=1
if grid[0,0]==grid[0,1]:
same_c1+=1
if grid[0,0]==grid[1,1]:
same_c1+=1
satisfaction_c1 = same_c1/3
print ('satisfaction_c1', satisfaction_c1)
if row==0 and col==y:
if grid[0,y]==0:
same_c2+=3
else:
if grid[0,y]==grid[0,y-1]:
same_c2+=1
if grid[0,y]==grid[1,y-1]:
same_c2+=1
if grid[0,y]==grid[1,y]:
same_c2+=1
satisfaction_c2 = same_c2/3
print ('satisfaction_c2',satisfaction_c2)
if row==y and col==0:
if grid[y,0]==0:
same_c3+=3
else:
if grid[y,0]==grid[y-1,0]:
same_c3+=1
if grid[y,0]==grid[y-1,1]:
same_c3+=1
if grid[y,0]==grid[y,1]:
same_c3+=1
satisfaction_c3 = same_c3/3
print ('satisfaction_c3',satisfaction_c3)
if row==y and col==y:
if grid[y,y]==0:
same_c4+=3
else:
if grid[y,y]==grid[y-1,y]:
same_c4+=1
if grid[y,y]==grid[y,y-1]:
same_c4+=1
if grid[y,y]==grid[y-1,y-1]:
same_c4+=1
satisfaction_c4 = same_c4/3
print ('satisfaction_c4', satisfaction_c4)
if row==0 and col!=(0 or y):
i_5+=1
if grid[row,col]==0:
same_col_1+=5
else:
if grid[row,col]==grid[row,col-1]:
same_col_1+=1
if grid[row,col]==grid[row,col+1]:
same_col_1+=1
if grid[row,col]==grid[row+1,col-1]:
same_col_1+=1
if grid[row,col]==grid[row+1,col]:
same_col_1+=1
if grid[row,col]==grid[row+1,col+1]:
same_col_1+=1
satisfaction_col_1 = same_col_1/5
sat_col_1.append(satisfaction_col_1)
true_satisfaction_col_1 = np.hstack(sat_col_1)
if i_5>y-1:
sats_col_1 = true_satisfaction_col_1
print ('sats_col_1',sats_col_1)
elif row==y and col!=(0 or y):
i_6+=1
if grid[row,col]==0:
same_col_2+=5
else:
if grid[row,col]==grid[row,col-1]:
same_col_2+=1
if grid[row,col]==grid[row,col+1]:
same_col_2+=1
if grid[row,col]==grid[row-1,col-1]:
same_col_2+=1
if grid[row,col]==grid[row-1,col]:
same_col_2+=1
if grid[row,col]==grid[row-1,col+1]:
same_col_2+=1
satisfaction_col_2 = same_col_2/5
sat_col_2.append(satisfaction_col_2)
true_satisfaction_col_2 = np.hstack(sat_col_2)
if i_6>y-1:
sats_col_2 = true_satisfaction_col_2
print ('sats_col_2',sats_col_2)
elif row!=(0 or y) and col==0:
i_7+=1
if grid[row,col]==0:
same_row_1+=5
else:
if grid[row,col]==grid[row-1,col]:
same_row_1+=1
if grid[row,col]==grid[row+1,col]:
same_row_1+=1
if grid[row,col]==grid[row-1,col+1]:
same_row_1+=1
if grid[row,col]==grid[row,col+1]:
same_row_1+=1
if grid[row,col]==grid[row+1,col+1]:
same_row_1+=1
satisfaction_row_1 = same_row_1/5
sat_row_1.append(satisfaction_row_1)
true_satisfaction_row_1 = np.hstack(sat_row_1)
if i_7>y-1:
sats_row_1 = true_satisfaction_row_1
print ('sats_row_1',sats_row_1)
elif row!=(0 or y) and col==y:
i_8+=1
if grid[row,col]==0:
same_row_2+=5
else:
if grid[row,col]==grid[row-1,col]:
same_row_2+=1
if grid[row,col]==grid[row+1,col]:
same_row_2+=1
if grid[row,col]==grid[row-1,col-1]:
same_row_2+=1
if grid[row,col]==grid[row,col-1]:
same_row_2+=1
if grid[row,col]==grid[row+1,col-1]:
same_row_2+=1
satisfaction_row_2 = same_row_2/5
sat_row_2.append(satisfaction_row_2)
true_satisfaction_row_2 = np.hstack(sat_row_2)
if i_8>y-1:
sats_row_2 = true_satisfaction_row_2
print ('sats_row_2',sats_row_2)
else:
i_9+=1
if grid[row,col]==0:
same+=8
else:
if grid[row,col]==grid[row-1,col]:
same+=1
if grid[row,col]==grid[row,col-1]:
same+=1
if grid[row,col]==grid[row-1,col-1]:
same+=1
if grid[row,col]==grid[row+1,col]:
same+=1
if grid[row,col]==grid[row,col+1]:
same+=1
if grid[row,col]==grid[row+1,col+1]:
same+=1
if grid[row,col]==grid[row-1,col+1]:
same+=1
if grid[row,col]==grid[row+1,col-1]:
same+=1
satisfaction = same/8
sat_1.append(satisfaction)
true_satisfaction_1 = np.hstack(sat_1)
if i_9>y-2:
sats_1 = true_satisfaction_1
print ('sats_1',sats_1)
col+=1
if col>=10:
col = col - 10
row+=1
sat_c_1_1 = []
sat_c_2_1 = []
sat_c_3_1 = []
sat_c_4_1 = []
sat_col_1_1 = []
sat_col_2_1 = []
sat_row_1_1 = []
sat_row_2_1 = []
sat_1_1 = []
m_1=0
m_2=0
m_3=0
m_4=0
m_5=0
m_6=0
m_7=0
m_8=0
m_9=0
for n in sat_col_1:
if m_5==0:
new_value_5 = sat_col_1[0]
sat_col_1_1.append(new_value_5)
s_col_1 = np.hstack(sat_col_1_1)
m_5+=1
else:
new_value_5 = sat_col_1[m_5] - sat_col_1[m_5-1]
sat_col_1_1.append(new_value_5)
m_5+=1
for n in sat_col_2:
if m_6==0:
new_value_6 = sat_col_2[0]
sat_col_2_1.append(new_value_6)
s_col_2 = np.hstack(sat_col_2_1)
m_6+=1
else:
new_value_6 = sat_col_2[m_6] - sat_col_2[m_6-1]
sat_col_2_1.append(new_value_6)
m_6+=1
for n in sat_row_1:
if m_7==0:
new_value_7 = sat_row_1[0]
sat_row_1_1.append(new_value_7)
sat_row_1 = np.hstack(sat_row_1_1)
m_7+=1
else:
new_value_7 = sat_row_1[m_7] - sat_row_1[m_7-1]
sat_row_1_1.append(new_value_7)
m_7+=1
for n in sat_row_2:
if m_8==0:
new_value_8 = sat_row_2[0]
sat_row_2_1.append(new_value_8)
s_row_2 = np.hstack(sat_row_2_1)
m_8+=1
else:
new_value_8 = sat_row_2[m_8] - sat_row_2[m_8-1]
sat_row_2_1.append(new_value_8)
m_8+=1
for n in sat_1:
if m_9==0:
new_value_9 = sat_1[0]
sat_1_1.append(new_value_9)
sat_1 = np.hstack(sat_1_1)
m_9+=1
else:
new_value_9 = sat_1[m_9] - sat_1[m_9-1]
sat_1_1.append(new_value_9)
m_9+=1
s_col_1 = np.hstack(sat_col_1_1)
print ("satisfaction of 1st row", s_col_1)
In [53]:
satisfaction_percent()
In [58]:
#If the block's satisfaction is below the satisfaction percentage chosen by the user
#then the blocks moves to another position in the nxn grid.
def move_unsatisfied():
row = 0
col = 0
ii = 0
for n in grid:
if sat_c_1_1 < satisfaction_percentage:
n.set_color(0,0,0)
if grid[0,0]==1:
if grid[row,col]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[0,0]==2:
if grid[row,col]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[0,0]==3:
if grid[row,col]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if sat_c_2_1 < satisfaction_percentage:
n.set_color(0,0,0)
if grid[0,y]==1:
if grid[row,col]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[0,y]==2:
if grid[row,col]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[0,y]==3:
if grid[row,col]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if sat_c_3_1 < satisfaction_percentage:
n.set_color(0,0,0)
if grid[y,0]==1:
if grid[row,col]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[y,0]==2:
if grid[row,col]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[y,0]==3:
if grid[row,col]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if sat_c_4_1 < satisfaction_percentage:
n.set_color(0,0,0)
if grid[y,y]==1:
if grid[row,col]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[y,y]==2:
if grid[row,col]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[y,y]==3:
if grid[row,col]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if sat_col_1_1[ii] < satisfaction_percentage:
n.set_color(0,0,0)
if grid[row,col]==1:
if grid[row+ii,col+ii]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==2:
if grid[row+ii,col+ii]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==3:
if grid[row+ii,col+ii]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if sat_col_2_1[ii] < satisfaction_percentage:
n.set_color(0,0,0)
if grid[row,col]==1:
if grid[row+ii,col+ii]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==2:
if grid[row+ii,col+ii]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==3:
if grid[row+ii,col+ii]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if sat_row_1_1[ii] < satisfaction_percentage:
n.set_color(0,0,0)
if grid[row,col]==1:
if grid[row+ii,col+ii]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==2:
if grid[row+ii,col+ii]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==3:
if grid[row+ii,col+ii]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if sat_row_2_1[ii] < satisfaction_percentage:
n.set_color(0,0,0)
if grid[row,col]==1:
if grid[row+ii,col+ii]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==2:
if grid[row+ii,col+ii]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==3:
if grid[row+ii,col+ii]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if sat_1_1[ii] < satisfaction_percentage:
n.set_color(0,0,0)
if grid[row,col]==1:
if grid[row+ii,col+ii]==0:
n.set_colors(90, 300, 420)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==2:
if grid[row+ii,col+ii]==0:
n.set_colors(300, 178, 34)
else:
col+=1
if col>=10:
col = col - 10
row+=1
if grid[row,col]==3:
if grid[row+ii,col+ii]==0:
n.set_colors(600, 42, 200)
else:
col+=1
if col>=10:
col = col - 10
row+=1
ii+=1
col+=1
if col>=10:
col = col - 10
row+=1
return grid
In [59]:
#Displays the final grid after all the blocks are at their max satisfaction.
def final_grid():
x = 0
orange4 = 0
blue4 = 0
black4 = 0
magenta4 = 0
for i in grid3:
if orange3 > orange4:
i.set_colors(300, 178, 34)
orange4+=1
elif black3 > black4:
i.set_colors(0,0,0)
black4+=1
elif magenta3 > magenta4:
i.set_colors(600, 42, 200)
magenta4+=1
else:
i.set_colors(90, 300, 420)
print ('Orange', orange3)
print ('Blue', blue3)
print ('Black', black3)
display(grid3)
%timeit -n1 -r1 final_grid()
In [ ]: