From 86cff25f11cf8fb04c484dc1cab0136b8180bc53 Mon Sep 17 00:00:00 2001 From: Nemo Date: Wed, 10 Jun 2020 19:41:00 +0530 Subject: [PATCH] Fixes the max cards being repeated issue, adds awards --- modernart-game.mzn | 62 +++++++++++++++++++++++++++++++++++----------- modernart.mzn | 28 ++++++++++++--------- 2 files changed, 63 insertions(+), 27 deletions(-) diff --git a/modernart-game.mzn b/modernart-game.mzn index b5296f7..9f6d179 100644 --- a/modernart-game.mzn +++ b/modernart-game.mzn @@ -25,29 +25,61 @@ constraint forall (a in Artists, r in Rounds) ( cards_per_artist_per_round[r, a] = sum(p in Players) (visible_count_per_round_per_artist_per_player[r,p,a]) ); +% Sanity check constraint forall (a in Artists, r in Rounds) ( cards_per_artist_per_round[r,a]>=0 ); +% So they don't go negative +constraint forall (a in Artists, r in Rounds, p in Players) ( + visible_count_per_round_per_artist_per_player[r,p, a]>=0 +); +% Calculate total score per player +constraint forall(r in Rounds, p in Players) ( + score_per_round_per_player[r,p] = sum(a in Artists) (visible_count_per_round_per_artist_per_player[r,p,a] * ranking_score_per_artist_per_round[r,a]) +); -% Decide the top 3 artists by picikng the cards per artist for that round, and sorting them, then slice to get top 3 -constraint forall(r in Rounds)(row(top_3_artists_per_round,r)= reverse(arg_sort(row(cards_per_artist_per_round, Round1)))[1..3]); +% Max number of visible cards can be 6 for any artist per player +var 5..6: max_visible_cards; +constraint max_visible_cards = if card(Players)>2 then 6 else 5 endif; +% Maximum max_visible_cards of the artist with maximum cards +constraint forall(r in Rounds) (max(row(cards_per_artist_per_round,r)) = max_visible_cards); +% second highest value should not be the max +constraint forall(r in Rounds) (sort(row(cards_per_artist_per_round, r))[4] != max_visible_cards); -% Top three artists get ranking score in each round as 3,2,1 -constraint forall(r in Rounds) (ranking_score_per_artist_per_round[r, row(top_3_artists_per_round,r)[1]] = 3); -constraint forall(r in Rounds) (ranking_score_per_artist_per_round[r, row(top_3_artists_per_round,r)[2]] = 2); -constraint forall(r in Rounds) (ranking_score_per_artist_per_round[r, row(top_3_artists_per_round,r)[3]] = 1); +% Decide the top artists by picikng the cards per artist for that round, and sorting them +constraint forall(r in Rounds)(row(sorted_artists_per_round,r)= reverse(arg_sort(row(cards_per_artist_per_round, r)))); -% Max number of visible cards can be 6 -constraint forall(r in Rounds, p in Players, a in Artists) (visible_count_per_round_per_artist_per_player[r,p,a] <=6); -constraint forall(r in Rounds, p in Players, a in Artists) (visible_count_per_round_per_artist_per_player[r,p,a] >=0); +% Top three artists get ranking score in each round as 3,2,1 others get 0 +constraint forall(r in Rounds) (ranking_score_per_artist_per_round[r, row(sorted_artists_per_round,r)[1]] = 3); +constraint forall(r in Rounds) (ranking_score_per_artist_per_round[r, row(sorted_artists_per_round,r)[2]] = 2); +constraint forall(r in Rounds) (ranking_score_per_artist_per_round[r, row(sorted_artists_per_round,r)[3]] = 1); +constraint forall(r in Rounds) (ranking_score_per_artist_per_round[r, row(sorted_artists_per_round,r)[4]] = 0); +constraint forall(r in Rounds) (ranking_score_per_artist_per_round[r, row(sorted_artists_per_round,r)[5]] = 0); + +% AWARDS +% Total number of awards for each artist = 1 +constraint forall(a in Artists) ( sum(col(awards_per_round_per_artist,a)) = 1 ); +% awards can only be given if an artist's card was played that turn +constraint forall(r in Rounds, a in Artists) ( + awards_per_round_per_artist[r,a] = 1 -> cards_per_artist_per_round[r,a] > 0 +); + +% Score = ranking_score + award_score if an award was given this round +constraint forall(r in Rounds, a in Artists) ( + total_score_per_round_per_artist[r,a] = + if awards_per_round_per_artist[r,a] then + ranking_score_per_artist_per_round[r,a] + 2 + else + ranking_score_per_artist_per_round[r,a] + endif +); + +% constraint forall(r in Rounds, a in Artists) ( +% awards_per_round_per_artist +% ); % TODO: This is actual not VISIBLE, but TOTAL cards LIMIT +% TODO: This does not consider any of the symbols % You can max play 13 cards in Round 1 constraint forall(p in Players) (sum(a in Artists) (visible_count_per_round_per_artist_per_player[Round1,p,a]) <=13); - -% array[1..5] of var Artists: artists_sorted_by_count_round1; -% constraint alldifferent(artists_sorted_by_count_round1); -% constraint artists_sorted_by_count_round1 = reverse(arg_sort(row(cards_per_artist_per_round, Round1))); - -% output [show_int(reverse(arg_sort(row(cards_per_artist_per_round, Round1))))]; \ No newline at end of file diff --git a/modernart.mzn b/modernart.mzn index a92546b..a06f902 100644 --- a/modernart.mzn +++ b/modernart.mzn @@ -3,26 +3,30 @@ enum Players; enum Artists; enum Rounds; -Players = { Nemo, Jana }; +Players = { Nemo, Jana, Adam}; Artists = {Krypto,KarlGitter,ChristinP,Yoko,LiteMetal}; Rounds = {Round1}; % Number of cards per round per player per artist array[Rounds,Players,Artists] of var int: visible_count_per_round_per_artist_per_player; + % How much score was made by each artist in each round by just RANKING array[Rounds,Artists] of var int: ranking_score_per_artist_per_round; -% Winning artists for each round -array[Rounds,1..3] of var Artists: top_3_artists_per_round; +% Total points that an artist has in a given round +array[Rounds,Artists] of var int: total_score_per_round_per_artist; + +% Whether an artist won an award in a given round +array[Rounds,Artists] of var bool: awards_per_round_per_artist; + +% Winning artists for each round (just-by-ranking) +array[Rounds,1..card(Artists)] of var Artists: sorted_artists_per_round; + +array[Rounds,Players] of var int: score_per_round_per_player; % Total number of a cards of an artist that were PLAYED this round array[Rounds, Artists] of var int: cards_per_artist_per_round; -% constraint forall(a,b in Artists, r in Rounds) ( - - -% ); - -% solve maximize visible_count_per_round_per_artist_per_player[LiteMetal, Nemo, Round1] + -% visible_count_per_round_per_artist_per_player[Krypto, Nemo, Round1] + -% visible_count_per_round_per_artist_per_player[Yoko, Nemo, Round1] + -% visible_count_per_round_per_artist_per_player[ChristinP, Nemo, Round1]; \ No newline at end of file +% Dumb constraints to help maximize score +constraint score_per_round_per_player[Round1,Nemo] > score_per_round_per_player[Round1,Jana]; +constraint score_per_round_per_player[Round1,Jana] > 15; +solve maximize score_per_round_per_player[Round1,Nemo]; \ No newline at end of file