You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							292 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							292 lines
						
					
					
						
							12 KiB
						
					
					
				| mdp | |
| 
 | |
| // parameters | |
| const int n_resources = 3; | |
| const int n_tasks = 2; | |
| const int n_sensors = 3; | |
| 
 | |
| 
 | |
| // sensor resources | |
| const int resource1=1; | |
| const int resource2=2; | |
| const int resource3=3; | |
| 
 | |
| // network configuration | |
| const int e12=1; | |
| const int e13=1; | |
| 
 | |
| const int e21=e12; | |
| const int e23=1; | |
| 
 | |
| const int e31=e13; | |
| const int e32=e23; | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| // agent is committed to some team | |
| formula committed = (m1_t1+m1_t2) > 0; | |
| 
 | |
| // formulae to compute team sizes | |
| formula team_size_t1 = m1_t1+m2_t1+m3_t1; | |
| formula team_size_t2 = m1_t2+m2_t2+m3_t2; | |
| 
 | |
| // formulae to check whether the agent can join the team | |
| formula can_join_t1 = e12*m2_t1 + e13*m3_t1 > 0; | |
| formula can_join_t2 = e12*m2_t2 + e13*m3_t2  > 0; | |
| 
 | |
| // formulae to check whether agent has the resource required by the task | |
| formula has_resource_t1 = ( (t1_r1=1&resource1=1) | (t1_r2=1&resource1=2) | (t1_r3=1&resource1=3) ); | |
| formula has_resource_t2 = ( (t2_r1=1&resource1=1) | (t2_r2=1&resource1=2) | (t2_r3=1&resource1=3) ); | |
| 
 | |
| // formulae to check whether the resource of an agent has been already filled in the team | |
| formula resource_filled_t1 = (m2_t1=1 & resource1=resource2) | (m3_t1=1 & resource1=resource3); | |
| formula resource_filled_t2 = (m2_t2=1 & resource1=resource2) | (m3_t2=1 & resource1=resource3); | |
| 
 | |
| // formula to compute team initiation probability (assuming each agent has at least one connection) | |
| formula IP = (e12*(1-((m2_t1+m2_t2)=0?0:1))+e13*(1-((m3_t1+m3_t2)=0?0:1))) / (e12+e13); | |
| 
 | |
| 
 | |
| module controller // schedules the algorithm | |
| 
 | |
| 	// algorithm status | |
| 	status : [0..6]; | |
| 
 | |
| 	// task resource indicator variables | |
| 	t1_r1 : [0..1]; | |
| 	t1_r2 : [0..1]; | |
| 	t1_r3 : [0..1]; | |
| 	 | |
| 	t2_r1 : [0..1]; | |
| 	t2_r2 : [0..1]; | |
| 	t2_r3 : [0..1]; | |
| 
 | |
| 	// schedule placeholders | |
| 	turn1 : [0..n_sensors]; | |
| 	turn2 : [0..n_sensors]; | |
| 	turn3 : [0..n_sensors]; | |
| 
 | |
| 	// selecting schedule uniformly at random | |
| 	[] status=0 -> 1/6 : (turn1'=1) & (turn2'=2) & (turn3'=3) & (status'=1) | |
| 		 + 1/6 : (turn1'=1) & (turn2'=3) & (turn3'=2) & (status'=1) | |
| 		 + 1/6 : (turn1'=2) & (turn2'=1) & (turn3'=3) & (status'=1) | |
| 		 + 1/6 : (turn1'=2) & (turn2'=3) & (turn3'=1) & (status'=1) | |
| 		 + 1/6 : (turn1'=3) & (turn2'=1) & (turn3'=2) & (status'=1) | |
| 		 + 1/6 : (turn1'=3) & (turn2'=2) & (turn3'=1) & (status'=1); | |
| 
 | |
| 
 | |
| 	// initialising non-empty tasks uniformly at random | |
| 	[] status=1 -> 1/49 : (t1_r1'=0) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=0) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=0) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=0) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=0) & (t2_r2'=1) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=0) & (t2_r3'=1) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=0) & (status'=2) | |
| 		 + 1/49 : (t1_r1'=1) & (t1_r2'=1) & (t1_r3'=1) & (t2_r1'=1) & (t2_r2'=1) & (t2_r3'=1) & (status'=2); | |
| 
 | |
| 	// executing the schedule | |
| 
 | |
| 	// 1st round | |
| 	[str1] status=2 & turn1=1 -> (status'=2); | |
| 	[fin1] status=2 & turn1=1 -> (status'=3); | |
| 	[str2] status=2 & turn1=2 -> (status'=2); | |
| 	[fin2] status=2 & turn1=2 -> (status'=3); | |
| 	[str3] status=2 & turn1=3 -> (status'=2); | |
| 	[fin3] status=2 & turn1=3 -> (status'=3); | |
| 
 | |
| 	// 2nd round | |
| 	[str1] status=3 & turn2=1 -> (status'=3); | |
| 	[fin1] status=3 & turn2=1 -> (status'=4); | |
| 	[str2] status=3 & turn2=2 -> (status'=3); | |
| 	[fin2] status=3 & turn2=2 -> (status'=4); | |
| 	[str3] status=3 & turn2=3 -> (status'=3); | |
| 	[fin3] status=3 & turn2=3 -> (status'=4); | |
| 
 | |
| 	// 3rd round | |
| 	[str1] status=4 & turn3=1 -> (status'=4); | |
| 	[fin1] status=4 & turn3=1 -> (status'=5); | |
| 	[str2] status=4 & turn3=2 -> (status'=4); | |
| 	[fin2] status=4 & turn3=2 -> (status'=5); | |
| 	[str3] status=4 & turn3=3 -> (status'=4); | |
| 	[fin3] status=4 & turn3=3 -> (status'=5); | |
| 
 | |
| 	[] status=5 -> (status'=6); | |
| 
 | |
| 	[] status=6 -> true; | |
| 
 | |
| endmodule | |
| 
 | |
| module sensor1 | |
| 
 | |
| 	state1 : [0..1]; | |
| 
 | |
| 	// team membership indicators | |
| 	m1_t1 : [0..1]; | |
| 	m1_t2 : [0..1]; | |
| 
 | |
| 	// starting turn, selecting order of tasks | |
| 	[str1] state1=0 -> (state1'=1); | |
| 
 | |
| 	// if there is no team and has required skill - initiating the team | |
| 	[] state1=1 & !committed & team_size_t1=0 & has_resource_t1 -> (m1_t1'=1); | |
| 	[] state1=1 & !committed & team_size_t2=0 & has_resource_t2 -> (m1_t2'=1); | |
| 
 | |
| 	// if team already exists and one of the neighbours is in it - joining the team  | |
| 	[] state1=1 & !committed & team_size_t1>0 & can_join_t1 & has_resource_t1 & !resource_filled_t1 -> (m1_t1'=1); | |
| 	[] state1=1 & !committed & team_size_t2>0 & can_join_t2 & has_resource_t2 & !resource_filled_t2 -> (m1_t2'=1); | |
| 	 | |
| 	[fin1] state1>0 -> (state1'=0);  | |
| 
 | |
| endmodule | |
| 
 | |
| module sensor2 = sensor1  | |
| [  | |
| 	state1=state2,  | |
| 
 | |
| 	str1=str2, | |
| 	fin1=fin2, | |
| 
 | |
| 	m1_t1=m2_t1, | |
| 	m1_t2=m2_t2, | |
| 
 | |
| 	m2_t1=m1_t1, | |
| 	m2_t2=m1_t2, | |
| 
 | |
| 	resource1=resource2,	 | |
| 	resource2=resource1, | |
| 
 | |
| 	e12=e21, | |
| 	e13=e23, | |
| 	e14=e24, | |
| 	e15=e25, | |
| 
 | |
| 	e21=e12, | |
| 	e23=e13, | |
| 	e24=e14, | |
| 	e25=e15 | |
| ]  | |
| endmodule | |
| 
 | |
| module sensor3 = sensor1  | |
| [  | |
| 	state1=state3,  | |
| 
 | |
| 	str1=str3, | |
| 	fin1=fin3, | |
| 
 | |
| 	m1_t1=m3_t1, | |
| 	m1_t2=m3_t2, | |
| 	m3_t1=m1_t1, | |
| 	m3_t2=m1_t2, | |
| 
 | |
| 	resource1=resource3,	 | |
| 	resource3=resource1, | |
| 
 | |
| 	e12=e32, | |
| 	e13=e31, | |
| 	e14=e34, | |
| 	e15=e35, | |
| 
 | |
| 	e31=e13, | |
| 	e32=e12, | |
| 	e34=e14, | |
| 	e35=e15 | |
| ]  | |
| endmodule | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| // labels and formulae for property specification  | |
| formula finished = (status=5); | |
| label "end" = (status=6); | |
| 
 | |
| 
 | |
| formula task1_completed = finished  | |
| 		 	 & ((t1_r1=1)=>((m1_t1=1&resource1=1)|(m2_t1=1&resource2=1)|(m3_t1=1&resource3=1))) | |
| 			 & ((t1_r2=1)=>((m1_t1=1&resource1=2)|(m2_t1=1&resource2=2)|(m3_t1=1&resource3=2))) | |
| 			 & ((t1_r3=1)=>((m1_t1=1&resource1=3)|(m2_t1=1&resource2=3)|(m3_t1=1&resource3=3))); | |
| 
 | |
| formula task2_completed = finished | |
| 			 & ((t2_r1=1)=>((m1_t2=1&resource1=1)|(m2_t2=1&resource2=1)|(m3_t2=1&resource3=1))) | |
| 			 & ((t2_r2=1)=>((m1_t2=1&resource1=2)|(m2_t2=1&resource2=2)|(m3_t2=1&resource3=2))) | |
| 			 & ((t2_r3=1)=>((m1_t2=1&resource1=3)|(m2_t2=1&resource2=3)|(m3_t2=1&resource3=3))); | |
| 
 | |
| 
 | |
| 
 | |
| formula agent1_joins_successful_team = (task1_completed & m1_t1=1) | (task2_completed & m1_t2=1); | |
| formula agent1_joins_successful_team_of_1 = (task1_completed & m1_t1=1 & team_size_t1=1) | (task2_completed & m1_t2=1 & team_size_t2=1); | |
| formula agent1_joins_successful_team_of_2 = (task1_completed & m1_t1=1 & team_size_t1=2) | (task2_completed & m1_t2=1 & team_size_t2=2); | |
| formula agent1_joins_successful_team_of_3 = (task1_completed & m1_t1=1 & team_size_t1=3) | (task2_completed & m1_t2=1 & team_size_t2=3); | |
| 
 | |
| formula agent2_joins_successful_team = (task1_completed & m2_t1=1) | (task2_completed & m2_t2=1); | |
| formula agent2_joins_successful_team_of_1 = (task1_completed & m2_t1=1 & team_size_t1=1) | (task2_completed & m2_t2=1 & team_size_t2=1); | |
| formula agent2_joins_successful_team_of_2 = (task1_completed & m2_t1=1 & team_size_t1=2) | (task2_completed & m2_t2=1 & team_size_t2=2); | |
| formula agent2_joins_successful_team_of_3 = (task1_completed & m2_t1=1 & team_size_t1=3) | (task2_completed & m2_t2=1 & team_size_t2=3); | |
| 
 | |
| formula agent3_joins_successful_team = (task1_completed & m3_t1=1) | (task2_completed & m3_t2=1); | |
| formula agent3_joins_successful_team_of_1 = (task1_completed & m3_t1=1 & team_size_t1=1) | (task2_completed & m3_t2=1 & team_size_t2=1); | |
| formula agent3_joins_successful_team_of_2 = (task1_completed & m3_t1=1 & team_size_t1=2) | (task2_completed & m3_t2=1 & team_size_t2=2); | |
| formula agent3_joins_successful_team_of_3 = (task1_completed & m3_t1=1 & team_size_t1=3) | (task2_completed & m3_t2=1 & team_size_t2=3); | |
| 
 | |
| 
 | |
| label "task1_compl" = task1_completed; | |
| label "task2_compl" = task2_completed; | |
| 
 | |
| // rewards | |
| rewards "w_1_total" | |
|     [] agent1_joins_successful_team : 1; | |
|     [] agent2_joins_successful_team : 1; | |
|     [] agent3_joins_successful_team : 1; | |
| endrewards | |
| 
 | |
| rewards "w_2_total" | |
|     [] task1_completed : 1; | |
|     [] task2_completed : 1; | |
| endrewards | |
| 
 | |
| 
 | |
| 
 | |
| 
 |