///////////////////////////////////////////////// // bike.cpp // code for ILOG Solver 6.0 // Tarik // IT-University of Copenhagen 07-July-2004 ///////////////////////////////////////////////// #include #include #include #include clock_t worst; ILOSTLBEGIN struct assignment_pair{ int varid; int value; }; int main(int argc, char** argv) { if (argc < 2) { cerr << "Usage: machine? \n "; exit(1); } IloEnv env; try { IloModel model(env); //////////////////////////////////////////////////////////// // Make aux. data structures for interactive configuration /////////////////////////////////////////////////////////// vector varDom; vector varPtr; /* ----------------- Person ----------------- */ IloIntVar person_gender(env,0,1), person_height(env,0,4), person_biketype(env,0,3); varPtr.push_back(&person_gender); varDom.push_back(2); varPtr.push_back(&person_height); varDom.push_back(5); varPtr.push_back(&person_biketype); varDom.push_back(4); model.add( (person_gender == 0) || (person_gender == 1) ); model.add( (person_height == 0) || (person_height == 1) || (person_height == 2) || (person_height == 3) || (person_height == 4) ); model.add( (person_biketype == 0) || (person_biketype == 1) || (person_biketype == 2) || (person_biketype == 3) ); /* ----------------- Extra accessories ----------------- */ IloIntVar extra_carrier(env,0,1), extra_mudguard(env,0,1), extra_lock(env,0,1); IloIntVar extra_pump(env,0,1), extra_bottle(env,0,1), extra_basket(env,0,1); IloIntVar extra_cateye(env,0,1), extra_sidereflex(env,0,1), extra_frontreflex(env,0,1); IloIntVar extra_propstand(env,0,1); varPtr.push_back(&extra_carrier); varDom.push_back(2); varPtr.push_back(&extra_mudguard); varDom.push_back(2); varPtr.push_back(&extra_lock); varDom.push_back(2); varPtr.push_back(&extra_pump); varDom.push_back(2); varPtr.push_back(&extra_bottle); varDom.push_back(2); varPtr.push_back(&extra_basket); varDom.push_back(2); varPtr.push_back(&extra_cateye); varDom.push_back(2); varPtr.push_back(&extra_sidereflex); varDom.push_back(2); varPtr.push_back(&extra_frontreflex); varDom.push_back(2); varPtr.push_back(&extra_propstand); varDom.push_back(2); model.add((extra_carrier == 0) || (extra_carrier == 1)); model.add((extra_mudguard == 0) || (extra_mudguard == 1)); model.add((extra_lock == 0) || (extra_lock == 1)); model.add((extra_pump == 0) || (extra_pump == 1)); model.add((extra_bottle == 0) || (extra_bottle == 1)); model.add((extra_basket == 0) || (extra_basket == 1)); model.add((extra_cateye == 0) || (extra_cateye == 1)); model.add((extra_sidereflex == 0) || (extra_sidereflex == 1)); model.add((extra_frontreflex == 0) || (extra_frontreflex == 1)); model.add((extra_propstand == 0) || (extra_propstand == 1)); /* Carrier -> Mudguard */ model.add( !(extra_carrier==1) || (extra_mudguard==1)); /* not (Pump and Bottle) */ model.add( !((extra_pump==1) && (extra_bottle==1))); /* ----------------- Pedals ----------------- */ IloIntVar pedal_sku(env,0,8), pedal_pedaltype(env,0,2); varPtr.push_back(&pedal_sku); varDom.push_back(9); varPtr.push_back(&pedal_pedaltype); varDom.push_back(3); model.add( (pedal_sku == 0) || (pedal_sku == 1) || (pedal_sku == 2) || (pedal_sku == 3) || (pedal_sku == 4) || (pedal_sku == 5) || (pedal_sku == 6) || (pedal_sku == 7) || (pedal_sku == 8) ); model.add( (pedal_pedaltype == 0) || (pedal_pedaltype == 1) ); model.add( ((pedal_sku==4) && (pedal_pedaltype==1)) || ((pedal_sku==3) && (pedal_pedaltype==1)) || ((pedal_sku==8) && (pedal_pedaltype==2)) || ((pedal_sku==7) && (pedal_pedaltype==2)) || ((pedal_sku==2) && (pedal_pedaltype==1)) || ((pedal_sku==1) && (pedal_pedaltype==1)) || ((pedal_sku==6) && (pedal_pedaltype==0)) || ((pedal_sku==0) && (pedal_pedaltype==0)) || ((pedal_sku==5) && (pedal_pedaltype==0)) ); /* ----------------- Shoes ----------------- */ IloIntVar shoe_sku(env,0,4), shoe_pedaltype(env,0,2); varPtr.push_back(&shoe_sku); varDom.push_back(5); varPtr.push_back(&shoe_pedaltype); varDom.push_back(3); model.add( (shoe_sku == 0) || (shoe_sku == 1) || (shoe_sku == 2) || (shoe_sku == 3) || (shoe_sku == 4) ); model.add( (shoe_pedaltype == 0) || (shoe_pedaltype == 1) || (shoe_pedaltype == 2) ); model.add( (shoe_sku == 0) || (shoe_sku == 1) || (shoe_sku == 2) || (shoe_sku == 3) || (shoe_sku == 4) ); model.add( (shoe_pedaltype == 0) || (shoe_pedaltype == 1) || (shoe_pedaltype == 2) ); model.add( ((shoe_sku==4) && (shoe_pedaltype==1)) || ((shoe_sku==3) && (shoe_pedaltype==2)) || ((shoe_sku==2) && (shoe_pedaltype==1)) || ((shoe_sku==1) && (shoe_pedaltype==2)) || (shoe_sku==0) ); /* ----------------- Rims ----------------- */ IloIntVar rim_sku(env,0,11), rim_height(env,0,2), rim_width(env,0,4); varPtr.push_back(&rim_sku); varDom.push_back(12); varPtr.push_back(&rim_height); varDom.push_back(3); varPtr.push_back(&rim_width); varDom.push_back(5); model.add( (rim_sku == 0) || (rim_sku == 1) || (rim_sku == 2) || (rim_sku == 3) || (rim_sku == 4) || (rim_sku == 5) || (rim_sku == 6) || (rim_sku == 7) || (rim_sku == 8) || (rim_sku == 9) || (rim_sku == 10) || (rim_sku == 11) ); model.add( (rim_height == 0) || (rim_height == 1) || (rim_height == 2) ); model.add( (rim_width == 0) || (rim_width == 1) || (rim_width == 2) || (rim_width == 3) || (rim_width == 4) ); model.add( ((rim_sku==8) && (rim_height==2) && (rim_width==0)) || ((rim_sku==10) && (rim_height==2) && (rim_width==1)) || ((rim_sku==6) && (rim_height==2) && (rim_width==2)) || ((rim_sku==9) && (rim_height==2) && (rim_width==1)) || ((rim_sku==11) && (rim_height==1) && (rim_width==3)) || ((rim_sku==4) && (rim_height==1) && (rim_width==2)) || ((rim_sku==5) && (rim_height==0) && (rim_width==3)) || ((rim_sku==1) && (rim_height==1) && (rim_width==1)) || ((rim_sku==3) && (rim_height==1) && (rim_width==0)) || ((rim_sku==2) && (rim_height==1) && (rim_width==0)) || ((rim_sku==0) && (rim_height==1) && (rim_width==1)) || ((rim_sku==7) && (rim_height==0) && (rim_width==2)) ); /* ----------------- Tires ----------------- */ IloIntVar tire_sku(env,0,15), tire_height(env,0,2), tire_width(env,0,4), tire_profile(env,0,10); varPtr.push_back(&tire_sku); varDom.push_back(16); varPtr.push_back(&tire_height); varDom.push_back(3); varPtr.push_back(&tire_width); varDom.push_back(5); varPtr.push_back(&tire_profile); varDom.push_back(11); model.add( (tire_sku == 0) || (tire_sku == 1) || (tire_sku == 2) || (tire_sku == 3) || (tire_sku == 4) || (tire_sku == 5) || (tire_sku == 6) || (tire_sku == 7) || (tire_sku == 8) || (tire_sku == 9) || (tire_sku == 10) || (tire_sku == 11) || (tire_sku == 12) || (tire_sku == 13) || (tire_sku == 14) || (tire_sku == 15) ); model.add( (tire_height == 0) || (tire_height == 1) || (tire_height == 2) ); model.add( (tire_width == 0) || (tire_width == 1) || (tire_width == 2) || (tire_width == 3) || (tire_width == 4) ); model.add( (tire_profile == 0) || (tire_profile == 1) || (tire_profile == 2) || (tire_profile == 3) || (tire_profile == 4) || (tire_profile == 5) || (tire_profile == 6) || (tire_profile == 7) || (tire_profile == 8) || (tire_profile == 9) || (tire_profile == 10) ); model.add( ((tire_sku==15) && (tire_profile==1) && (tire_height==1) && (tire_width==1)) || ((tire_sku==3) && ((tire_profile==4) || (tire_profile==8)) && (tire_height==2) && ((tire_width==0) || (tire_width==2))) || ((tire_sku==13) && ((tire_profile==1) || (tire_profile==4) || (tire_profile==6)) && (tire_height==2) && ((tire_width==1) || (tire_width==2))) || ((tire_sku==12) && ((tire_profile==0) || (tire_profile==3) || (tire_profile==5)) && (tire_height==2) && ((tire_width==0) || (tire_width==1))) || ((tire_sku==6) && ((tire_profile==9) || (tire_profile==10)) && (tire_height==2) && ((tire_width==3) || (tire_width==4))) || ((tire_sku==1) && ((tire_profile==1) || (tire_profile==2)) && (tire_height==2) && (tire_width==1)) || ((tire_sku==14) && (tire_profile==3) && (tire_height==2) && (tire_width==0)) || ((tire_sku==4) && (tire_profile==2) && (tire_height==2) && (tire_width==1)) || ((tire_sku==0) && ((tire_profile==1) || (tire_profile==3)) && (tire_height==2) && (tire_width==2)) || ((tire_sku==2) && (tire_profile==1) && (tire_height==1) && ((tire_width==2) || (tire_width==3))) || ((tire_sku==7) && (tire_profile==1) && (tire_height==1) && ((tire_width==2) || (tire_width==1))) || ((tire_sku==8) && ((tire_profile==1) || (tire_profile==3)) && ((tire_height==1) || (tire_height==2)) && ((tire_width==1) || (tire_width==2))) || ((tire_sku==9) && ((tire_profile==3) || (tire_profile==5)) && ((tire_height==1) || (tire_height==2)) && ((tire_width==1) || (tire_width==2))) || ((tire_sku==11) && ((tire_profile==3) || (tire_profile==4) || (tire_profile==5) || (tire_profile==6) || (tire_profile==7)) && ((tire_height==1) || (tire_height==2)) && ((tire_width==1) || (tire_width==2))) || ((tire_sku==10) && ((tire_profile==1) || (tire_profile==0)) && ((tire_height==1) || (tire_height==2)) && ((tire_width==0) || (tire_width==2))) || ((tire_sku==5) && (tire_profile==9) && (tire_height==0) && ((tire_width==2) || (tire_width==3))) ); /* ----------------- Gear set ----------------- */ IloIntVar gear_sku(env,0,14), gear_gears(env,0,9), gear_biketype(env,0,3), gear_internal(env,0,1); varPtr.push_back(&gear_sku); varDom.push_back(15); varPtr.push_back(&gear_gears); varDom.push_back(10); varPtr.push_back(&gear_biketype); varDom.push_back(4); varPtr.push_back(&gear_internal); varDom.push_back(2); model.add( (gear_sku == 0) || (gear_sku == 1) || (gear_sku == 2) || (gear_sku == 3) || (gear_sku == 4) || (gear_sku == 5) || (gear_sku == 6) || (gear_sku == 7) || (gear_sku == 8) || (gear_sku == 9) || (gear_sku == 10) || (gear_sku == 11) || (gear_sku == 12) || (gear_sku == 13) || (gear_sku == 14) ); model.add( (gear_gears == 0) || (gear_gears == 1) || (gear_gears == 2) || (gear_gears == 3) || (gear_gears == 4) || (gear_gears == 5) || (gear_gears == 6) || (gear_gears == 7) || (gear_gears == 8) || (gear_gears == 9) ); model.add( (gear_biketype == 0) || (gear_biketype == 1) || (gear_biketype == 2) || (gear_biketype == 3) ); model.add( (gear_internal == 0) || (gear_internal == 1) ); model.add( ((gear_sku==0) && (gear_biketype==3) && (gear_internal==0) && (gear_gears==6)) || ((gear_sku==14) && (gear_biketype==3) && (gear_internal==0) && (gear_gears==5)) || ((gear_sku==12) && (gear_biketype==3) && (gear_internal==0) && (gear_gears==5)) || ((gear_sku==11) && (gear_biketype==2) && (gear_internal==0) && (gear_gears==7)) || ((gear_sku==0) && (gear_biketype==2) && (gear_internal==0) && (gear_gears==8)) || ((gear_sku==9) && ((gear_biketype==0) || (gear_biketype==2) || (gear_biketype==1)) && (gear_internal==1) && ((gear_gears==1) || (gear_gears==2) || (gear_gears==4))) || ((gear_sku==10) && (gear_biketype==3) && (gear_internal==0) && (gear_gears==5)) || ((gear_sku==6) && (gear_biketype==3) && (gear_internal==0) && (gear_gears==6)) || ((gear_sku==1) && (gear_biketype==3) && (gear_internal==0) && (gear_gears==5)) || ((gear_sku==2) && (gear_biketype==3) && (gear_internal==0) && (gear_gears==6)) || ((gear_sku==3) && (gear_biketype==3) && (gear_internal==0) && (gear_gears==6)) || ((gear_sku==8) && (gear_biketype==2) && (gear_internal==0) && (gear_gears==9)) || ((gear_sku==7) && (gear_biketype==2) && (gear_internal==0) && (gear_gears==8)) || ((gear_sku==13) && ((gear_biketype==0) || (gear_biketype==1)) && (gear_internal==1) && ((gear_gears==1) || (gear_gears==3))) || ((gear_sku==5) && (gear_internal==1) && (gear_gears==0)) ); model.add( !(gear_biketype==3) || (gear_internal==0) ); /* ----------------- Frames ----------------- */ IloIntVar frame_sku(env,0,36), frame_color(env,0,13), frame_biketype(env,0,3), frame_internal(env,0,1); IloIntVar frame_size(env,0,13), frame_gender(env,0,1); varPtr.push_back(&frame_sku); varDom.push_back(37); varPtr.push_back(&frame_color); varDom.push_back(14); varPtr.push_back(&frame_biketype); varDom.push_back(4); varPtr.push_back(&frame_internal); varDom.push_back(2); varPtr.push_back(&frame_size); varDom.push_back(14); varPtr.push_back(&frame_gender); varDom.push_back(2); model.add( (frame_sku == 0) || (frame_sku == 1) || (frame_sku == 2) || (frame_sku == 3) || (frame_sku == 4) || (frame_sku == 5) || (frame_sku == 6) || (frame_sku == 7) || (frame_sku == 8) || (frame_sku == 9) || (frame_sku == 10) || (frame_sku == 11) || (frame_sku == 12) || (frame_sku == 13) || (frame_sku == 14) || (frame_sku == 15) || (frame_sku == 16) || (frame_sku == 17) || (frame_sku == 18) || (frame_sku == 19) || (frame_sku == 20) || (frame_sku == 21) || (frame_sku == 22) || (frame_sku == 23) || (frame_sku == 24) || (frame_sku == 25) || (frame_sku == 26) || (frame_sku == 27) || (frame_sku == 28) || (frame_sku == 29) || (frame_sku == 30) || (frame_sku == 31) || (frame_sku == 32) || (frame_sku == 33) || (frame_sku == 34) || (frame_sku == 35) || (frame_sku == 36) ); model.add( (frame_color == 0) || (frame_color == 1) || (frame_color == 2) || (frame_color == 3) || (frame_color == 4) || (frame_color == 5) || (frame_color == 6) || (frame_color == 7) || (frame_color == 8) || (frame_color == 9) || (frame_color == 10) || (frame_color == 11) || (frame_color == 12) || (frame_color == 13) ); model.add( (frame_biketype == 0) || (frame_biketype == 1) || (frame_biketype == 2) || (frame_biketype == 3) ); model.add( (frame_size == 0) || (frame_size == 1) || (frame_size == 2) || (frame_size == 3) || (frame_size == 4) || (frame_size == 5) || (frame_size == 6) || (frame_size == 7) || (frame_size == 8) || (frame_size == 9) || (frame_size == 10) || (frame_size == 11) || (frame_size == 12) || (frame_size == 13) ); model.add( (frame_internal == 0) || (frame_internal == 1) ); model.add( (frame_gender == 0) || (frame_gender == 1) ); model.add( ((frame_sku==0) && (frame_biketype==1) && ((frame_size>=7) && (frame_size<=10)) && (frame_gender==1) && (frame_internal==1) && ((frame_color==0) || (frame_color==10) || (frame_color==4) || (frame_color==2))) || ((frame_sku==3) && (frame_biketype==0) && ((frame_size==7) || (frame_size==9) || (frame_size==10)) && (frame_gender==1) && (frame_internal==1) && (frame_color==7)) || ((frame_sku==2) && (frame_biketype==0) && ((frame_size==9) || (frame_size==10) || (frame_size==12)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==11) || (frame_color==7))) || ((frame_sku==5) && (frame_biketype==0) && ((frame_size==7) || (frame_size==9) || (frame_size==10)) && (frame_gender==1) && (frame_internal==1) && ((frame_color==11) || (frame_color==10))) || ((frame_sku==4) && (frame_biketype==0) && ((frame_size==9) || (frame_size==10) || (frame_size==12)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==11) || (frame_color==9) || (frame_color==10))) || ((frame_sku==6) && (frame_biketype==0) && ((frame_size==7) || (frame_size==9) || (frame_size==10)) && (frame_gender==1) && (frame_internal==1) && ((frame_color==11) || (frame_color==5) || (frame_color==9) || (frame_color==10))) || ((frame_sku==1) && (frame_biketype==0) && ((frame_size==9) || (frame_size==10) || (frame_size==12)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==11) || (frame_color==5) || (frame_color==2) || (frame_color==0))) || ((frame_sku==7) && (frame_biketype==1) && ((frame_size>=7) && (frame_size<=10)) && (frame_gender==1) && (frame_internal==1) && (frame_color==10)) || ((frame_sku==9) && (frame_biketype==0) && ((frame_size==7) || (frame_size==9) || (frame_size==10)) && (frame_gender==1) && (frame_internal==1) && ((frame_color==9) || (frame_color==7) || (frame_color==10) || (frame_color==0))) || ((frame_sku==8) && (frame_biketype==0) && ((frame_size==4) || (frame_size==6) || (frame_size==7) || (frame_size==9) || (frame_size==10)) && (frame_gender==1) && (frame_internal==1) && ((frame_color==2) || (frame_color==3) || (frame_color==7) || (frame_color==9) || (frame_color==10))) || ((frame_sku==8) && (frame_biketype==0) && ((frame_size==9) || (frame_size==10) || (frame_size==12)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==7) || (frame_color==2) || (frame_color==0))) || ((frame_sku==11) && (frame_biketype==2) && ((frame_size==2) || (frame_size==4) || (frame_size==6) || (frame_size==7)) && (frame_gender==1) && (frame_internal==1) && ((frame_color==11) || (frame_color==10) || (frame_color==0))) || ((frame_sku==10) && (frame_biketype==2) && ((frame_size==2) || (frame_size==4) || (frame_size==6) || (frame_size==7) || (frame_size==9)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==11) || (frame_color==3) || (frame_color==2) || (frame_color==0))) || ((frame_sku==12) && (frame_biketype==2) && ((frame_size==2) || (frame_size==4) || (frame_size==6) || (frame_size==7) || (frame_size==9)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==11) || (frame_color==2))) || ((frame_sku==14) && (frame_biketype==0) && ((frame_size==7) || (frame_size==9) || (frame_size==10)) && (frame_gender==1) && (frame_internal==1) && ((frame_color==9) || (frame_color==11) || (frame_color==10))) || ((frame_sku==13) && (frame_biketype==0) && ((frame_size==9) || (frame_size==10) || (frame_size==12)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==11) || (frame_color==5) || (frame_color==9))) || ((frame_sku==16) && (frame_biketype==0) && ((frame_size==7) || (frame_size==9) || (frame_size==10)) && (frame_gender==1) && (frame_internal==1) && ((frame_color==11) || (frame_color==2))) || ((frame_sku==15) && (frame_biketype==0) && ((frame_size==6) || (frame_size==7) || (frame_size==9) || (frame_size==10) || (frame_size==12)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==11) || (frame_color==10) || (frame_color==5) || (frame_color==9) || (frame_color==2))) || ((frame_sku==17) && (frame_biketype==2) && ((frame_size==2) || (frame_size==4) || (frame_size==6) || (frame_size==7) || (frame_size==9)) && (frame_gender==0) && !(frame_internal==1) && (frame_color==10)) || ((frame_sku==18) && (frame_biketype==3) && ((frame_size==9) || (frame_size==10) || (frame_size==11) || (frame_size==12)) && (frame_gender==0) && !(frame_internal==1) && ((frame_color==5) || (frame_color==8))) || ((frame_sku==19) && (frame_biketype==3) && ((frame_size==9) || (frame_size==10) || (frame_size==11) || (frame_size==12)) && (frame_gender==0) && !(frame_internal==1) && ((frame_color==10) || (frame_color==8))) || ((frame_sku==20) && (frame_biketype==3) && ((frame_size==9) || (frame_size==10) || (frame_size==11) || (frame_size==12)) && (frame_gender==0) && !(frame_internal==1) && ((frame_color==5) || (frame_color==7))) || ((frame_sku==21) && (frame_biketype==2) && ((frame_size==2) || (frame_size==4) || (frame_size==6) || (frame_size==7) || (frame_size==9)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==11) || (frame_color==5) || (frame_color==9))) || ((frame_sku==23) && (frame_biketype==3) && ((frame_size==6) || (frame_size==7) || (frame_size==8) || (frame_size==9)) && (frame_gender==1) && !(frame_internal==1) && (frame_color==11)) || ((frame_sku==22) && (frame_biketype==3) && ((frame_size==9) || (frame_size==10) || (frame_size==11) || (frame_size==12)) && (frame_gender==0) && !(frame_internal==1) && ((frame_color==11) || (frame_color==2) || (frame_color==9))) || ((frame_sku==24) && (frame_biketype==3) && ((frame_size==9) || (frame_size==10) || (frame_size==11) || (frame_size==12)) && (frame_gender==0) && !(frame_internal==1) && (frame_color==7)) || ((frame_sku==25) && (frame_biketype==0) && ((frame_size==7) || (frame_size==9) || (frame_size==11)) && (frame_gender==0) && (frame_internal==1) && ((frame_color==0) || (frame_color==6) || (frame_color==13) || (frame_color==2) || (frame_color==12) || (frame_color==10) || (frame_color==5) || (frame_color==11) || (frame_color==7))) || ((frame_sku==26) && (frame_biketype==3) && ((frame_size==7) || (frame_size==9) || (frame_size==10) || (frame_size==12) || (frame_size==13)) && (frame_gender==0) && !(frame_internal==1) && (frame_color==0)) || ((frame_sku==27) && (frame_biketype==3) && ((frame_size==7) || (frame_size==9) || (frame_size==10) || (frame_size==12) || (frame_size==13)) && (frame_gender==0) && !(frame_internal==1) && (frame_color==1)) || ((frame_sku==28) && (frame_biketype==3) && ((frame_size==7) || (frame_size==9) || (frame_size==10) || (frame_size==12) || (frame_size==13)) && (frame_gender==0) && !(frame_internal==1) && ((frame_color==0) || (frame_color==12))) || ((frame_sku==29) && (frame_biketype==2) && ((frame_size==2) || (frame_size==4) || (frame_size==6) || (frame_size==8)) && ((frame_gender==0) || (frame_gender==1)) && (frame_internal==1) && (frame_color==11)) || ((frame_sku==30) && ((frame_biketype==0) || (frame_biketype==2)) && ((frame_size==7) || (frame_size==8) || (frame_size==9)) && (frame_gender==1) && (frame_internal==1) && (frame_color==11)) || ((frame_sku==30) && ((frame_biketype==0) || (frame_biketype==2)) && ((frame_size==8) || (frame_size==9) || (frame_size==11)) && (frame_gender==0) && (frame_internal==1) && (frame_color==11)) || ((frame_sku==31) && ((frame_biketype==0) || (frame_biketype==2)) && ((frame_size==7) || (frame_size==8) || (frame_size==9) || (frame_size==11)) && (frame_gender==0) && (frame_internal==1) && (frame_color==11)) || ((frame_sku==31) && ((frame_biketype==0) || (frame_biketype==2)) && ((frame_size==7) || (frame_size==8)) && (frame_gender==1) && (frame_internal==1) && (frame_color==11)) || ((frame_sku==32) && (frame_biketype==0) && ((frame_size==9) || (frame_size==10) || (frame_size==11)) && ((frame_gender==0) || (frame_gender==1)) && (frame_internal==1) && ((frame_color==11) || (frame_color==7))) || ((frame_sku==33) && (frame_biketype==2) && ((((frame_size==7) || (frame_size==9) || (frame_size==10)) && (frame_gender==0)) || (((frame_size==7) || (frame_size==9)) && (frame_gender==1))) && !(frame_internal==1) && (frame_color==11)) || ((frame_sku==34) && (frame_biketype==2) && ((frame_size==3) || (frame_size==5) || (frame_size==7)) && (frame_gender==0) && (frame_internal==1) && (frame_color==5)) || ((frame_sku==35) && (frame_biketype==2) && ((frame_size>=0) && (frame_size<=10)) && (frame_gender==0) && !(frame_internal==1) && (frame_color==10)) || ((frame_sku==36) && (frame_biketype==2) && ((frame_size>=0) && (frame_size<=10)) && (frame_gender==0) && !(frame_internal==1) && (frame_color==11)) ); model.add( !((frame_biketype==0) || (frame_biketype==1)) || (frame_internal==1) ); model.add( !(frame_biketype==4) || !(frame_internal==1) ); /* --------------------- GLOBAL CONSTRAINTS -------------------------- */ /* --------------------- GLOBAL CONSTRAINTS -------------------------- */ /* --------------------- GLOBAL CONSTRAINTS -------------------------- */ /* Different rim heights imply different frame sizes */ model.add(!(rim_height==0) || ((frame_size>=2) && (frame_size<=9))); model.add(!(rim_height==1) || ((frame_size>=4) && (frame_size<=13))); model.add(!(rim_height==2) || ((frame_size>=6) && (frame_size<=13))); /* different types of frames require different sizes of tire profiles */ model.add(!(frame_biketype==3) || ((tire_profile>=0) && (tire_profile<=6) && !(extra_mudguard==1) && !(extra_basket==1))); model.add(!(frame_biketype==2) || ((tire_profile>=7) && !(extra_carrier==1) && !(extra_basket==1))); model.add(!(frame_biketype==0) || ((tire_profile>=3) && (tire_profile<=9))); model.add(!(frame_biketype==1) || ((tire_profile>=5) && (tire_profile<=9) && (extra_carrier==1) && (extra_propstand==1) && (extra_basket==1))); /* External gear doesn't go with prop stands */ model.add((frame_internal==1) || !(extra_propstand==1)); /* The tires must fit on the rims */ model.add(rim_height == tire_height); model.add(rim_width == tire_width); /* The gear must fit on the frame */ model.add(frame_internal == gear_internal); /* Shoes and pedals must be of the same type */ model.add(pedal_pedaltype == shoe_pedaltype); /* The type of gear must match frame */ model.add(frame_biketype == gear_biketype); model.add(person_gender == frame_gender); model.add(person_biketype == frame_biketype); model.add(!(((frame_biketype==3) || (frame_biketype==0)) && ((person_height==0))) || ((frame_size>=4) && (frame_size<=7))); model.add(!(((frame_biketype==3) || (frame_biketype==0)) && (person_height==1)) || ((frame_size>=6) && (frame_size<=9))); model.add(!(((frame_biketype==3) || (frame_biketype==0)) && ((person_height==2))) || ((frame_size>=7) && (frame_size<=11))); model.add(!(((frame_biketype==3) || (frame_biketype==0)) && (person_height==3)) || ((frame_size>=10) && (frame_size<=13))); model.add(!(((frame_biketype==3) || (frame_biketype==0)) && (person_height==4)) || ((frame_size>=12) && (frame_size<=13))); model.add(!((frame_biketype==2) && (person_height==0)) || ((frame_size>=2) && (frame_size<=5))); model.add(!((frame_biketype==2) && (person_height==1)) || ((frame_size>=3) && (frame_size<=6))); model.add(!((frame_biketype==2) && (person_height==2)) || ((frame_size>=4) && (frame_size<=7))); model.add(!((frame_biketype==2) && ((person_height==3) || (person_height==4))) || ((frame_size>=5) && (frame_size<=9))); model.add(!((tire_sku == 7) || (tire_sku == 8) || (tire_sku == 11) || (tire_sku == 9) || (tire_sku == 10)) || !(extra_sidereflex==1)); model.add(!(frame_biketype==3) || (pedal_pedaltype!=0)); model.add(!(frame_biketype==2) || (pedal_pedaltype!=0)); model.add(!(frame_biketype==0) || (pedal_pedaltype!=0)); model.add(!(frame_biketype==1) || (pedal_pedaltype!=0)); //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- // keep track of interaction int** var_isvalid = new int*[varPtr.size()]; int* is_assigned = new int[varPtr.size()]; for(int i=0;i< varPtr.size();i++) { var_isvalid[i] = new int[varDom[i]]; is_assigned[i] = 0; for(int j=0; j < varDom[i]; j++) var_isvalid[i][j] = 1; } int** var_shownValidThisStep = new int*[varPtr.size()]; for(int i=0;i< varPtr.size();i++) { var_shownValidThisStep[i] = new int[varDom[i]]; for(int j=0; j < varDom[i]; j++) var_shownValidThisStep[i][j] = 0; } assignment_pair* assignments = new assignment_pair[varPtr.size()]; assignment_pair* old_assignments = new assignment_pair[varPtr.size()]; int old_num_assigns = 0; int start_from_scratch = 1; ifstream ti(argv[1]); if (!ti) { cerr << argv[1] << " cannot be opened\n"; exit(1); } int num_assigns = 0; int varid; int value; int inp; int inp2; int itr_count=0; ti >> inp; ti >> inp2; int start_assign = 0; //////////////////////////////// // Do interactive configuration from trace file /////////////////////////////// IloExtractableArray iloextractablearray(env,varPtr.size()); IloSolver solver(model); do{ clock_t t1=clock(); for(int k = 0; k < old_num_assigns; k++) old_assignments[k] = assignments[k]; ti >> inp; ti >> inp2; while(inp != -1 && inp != -2){ varid = inp; value = inp2; assignments[num_assigns].varid = varid; assignments[num_assigns].value = value; //cerr<<"varid "<> inp; ti >> inp2; } // make the assignments // check for each valid value in previous request. if(num_assigns == old_num_assigns + 1){ int i; for(i = 0; i < old_num_assigns; i++){ if(assignments[i].varid != old_assignments[i].varid || assignments[i].value != old_assignments[i].value) break; } if(i == old_num_assigns) start_from_scratch = 0; else start_from_scratch = 1; } else start_from_scratch=1; if(start_from_scratch){ //remove old_num_assigns of iloextractable array constraints from the model //valid all values are valid values for(int i = 0; i < old_num_assigns; i++){ model.remove(iloextractablearray[i]); } for(int i = 0; i < varPtr.size(); i++) for(int j = 0; j < varDom[i];j++) var_isvalid[i][j] = 1; for(int i = 0; i < varPtr.size(); i++) is_assigned[i]=0; start_assign = 0; } else start_assign = old_num_assigns; for(int i = start_assign; i < num_assigns; i++){ iloextractablearray[i] = model.add(*varPtr[assignments[i].varid] == assignments[i].value); // debug: I want to know what is assigned // cout << "Assigned: " << varName[assignments[i].varid] << " = " << assignments[i].value << endl; // cout.flush(); is_assigned[assignments[i].varid] = 1; } for(int i = 0; i < varPtr.size(); i++) for(int j = 0; j < varDom[i];j++) var_shownValidThisStep[i][j] = 0; for(int i = 0; i < varPtr.size(); i++){ if (is_assigned[i]) continue; for(int j = 0; j < varDom[i]; j++) { if (!var_isvalid[i][j]) continue; if (var_shownValidThisStep[i][j]) continue; //cout << "i=" << i << " j=" << j << endl; //cout.flush(); IloExtractable current = model.add(*varPtr[i] == j); solver.startNewSearch(); if( solver.next() ) for (int g = 0; g < varPtr.size(); g++) { var_shownValidThisStep[g][int(solver.getValue(*varPtr[g]))] = 1; // cout << " fi=" << g << " fj=" << int(solver.getValue(*varPtr[g])); } else var_isvalid[i][j] = 0; // cout << endl; solver.endSearch(); model.remove(current); } } itr_count++; old_num_assigns = num_assigns; num_assigns = 0; clock_t t2=clock(); if(itr_count==0) worst = (t2-t1); if(worst < (t2-t1)) worst = (t2-t1); } while (inp != -2); solver.out() << "End Simulation of " << itr_count << " Requests" << endl; solver.out()<<"Worst Time is "<<(worst/(double)CLOCKS_PER_SEC) << endl; } catch (IloException& ex) { cerr << "Error: " << ex << endl; } env.end(); return 0; }