# PARAMS param periods := 2; # number of periods # -- DONT CHANGE BELOW THIS LINE -- # SET set Boat := { read "ppp_008_2.txt" as "<1s>" comment "#" }; set Boats := { in Boat * Boat }; set Period := { 1 .. periods }; set BoatsPeriod := Boats * Period; # PARAMS param capacity[Boat] := read "ppp_008_2.txt" as "<1s> 2n" comment "#"; param crewSize[Boat] := read "ppp_008_2.txt" as "<1s> 3n" comment "#"; # FUNCTIONS defnumb availableCapacity(x) := capacity[x] - crewSize[x]; # VARIABLES var isGuest[Boat] binary; var isHost[Boat] binary; var visit[BoatsPeriod] binary; var meet[BoatsPeriod] binary; # OBJECTIVE FUNCTION minimize hostNumber: sum in Boat : isHost[boat]; # RESTRICTIONS subto guest_or_host : forall in Boat do isHost[boat] + isGuest[boat] == 1; subto visit_check_capacity: forall in Period do forall in Boat : (sum in Boat - {host}: crewSize[guest]*visit[guest,host,t]) <= availableCapacity(host); subto guest_can_only_visit_hosts : forall in Period do forall in Boat do forall in Boat - {guest} do vif visit[guest,host,t] == 1 then isHost[host] + isGuest[guest] == 2 end; subto each_guest_on_one_and_only_one_boat : forall in Period do forall in Boat do vif isGuest[guest] == 1 then (sum in Boat - {guest} : visit[guest,host,t]) == 1 end; subto cannot_visit_two_times_same_host : forall in Boat do forall in Boat - {guest} do (sum in Period : visit[guest,host,t]) <= 1; subto guests_meet_in_period : forall in Boat do forall in Boat - {guest1} do forall in Boat - {guest1,guest2} do forall in Period do vif (visit[guest1,host,t] == 1) and (visit[guest2,host,t] == 1) then meet[guest1,guest2, t] == 1 end; subto cannot_meet_two_times_same_crew : forall in Boat do forall in Boat - {guest1} do (sum in Period : meet[guest1,guest2,t]) <= 1;