#ifndef _PROJECT_H_ #define _PROJECT_H_ #include #include #include #include #include #include #include #include /* robot control */ #define FWD_SPEED MAX_SPEED #define REV_SPEED MAX_SPEED #define PRIO_AVOID PRIO_LOWEST+2 #define PRIO_EXPLORE PRIO_LOWEST+2 #define PRIO_RESOLVE PRIO_LOWEST+3 #define PROX_THRESH 0x30 #define IDLE 0 #define SIGNAL 1 pid_t pid0, pid1, pid2, pid3, pid4, pid5; int ready = 1; unsigned proximity = 0, cur_pri = PRIO_LOWEST, phase = IDLE, detecting = 0; /* GA parameters */ #define state_bits 3 #define states 8 #define action_bits 2 #define popsize 5 #define generations 10 #define iterations 100 #define choose 50 #define mutate 1 #define crossover_num (int)(0.4*popsize) #define mutate_num (int)(0.4*popsize) #define ctrl_bits (states<<1)*(state_bits+action_bits) unsigned state = 0; int fitness = 0; typedef struct controller_t { int fsa[ctrl_bits]; int fitness; } controller; int cur_rank[popsize]; int new_rank[popsize + crossover_num + mutate_num]; controller* cur_pop[popsize]; controller* new_pop[popsize + crossover_num + mutate_num]; int new_popsize; controller *cur_ctrl; void decode(controller *, int *, int *, int, int); void init_arrays(); void free_arrays(); void rank_ctrl(); void rank_ctrl_new(); int select_ctrl(); void crossover_ctrl(); void mutate_ctrl(); void select_next_generation(); void init_new_generation(); void move_forward(); void turn_left(); void turn_right(); void reverse(); void stop(int sleep); wakeup_t turn(wakeup_t); wakeup_t finish(wakeup_t); wakeup_t collision(wakeup_t); int resolve(); int explore(); int ticker(); int signal(); int avoid(); void simulate(controller *); void set_control(controller *); controller* get_control(); void motor_control(int, int, int, int, int); #endif