/* Goal programming (1) in Picat. Winston Operations Research, page 191ff """ The Leon Burnit Advertising Agency is trying to determine a TV advertisin schedule for Priceles Auto Company. Priceler has three goals: Goal 1: Its ads should be seen by at least 40 million high-income men (HIM) Goal 2: 60 low-income person (LIP) Goal 3: 35 hight-incom women (HIW) Leon Burnit can purchase two types of ad: those shon during football games and those shown during soap operas. At most, $6000000 can be spent on ads. The advertising costs and potential audience of a one-minute ad is: Million of views Ad HIM LIP HIW Cost Football 7 10 5 100000 Soap-opera 3 5 4 60000 """ The original version is infeasible, so goals (priorities) is added to decide what to do. original version (AMPL): minimize z: 0*x1+0*x2; subject to c1: 7*x1 + 3*x2 >= 40; HIW c2: 10*x1 + 5*x2 >= 60; LIP c3: 5*x1 + 4*x2 >= 35; HIW c4: 100*x1 + 60*x2 <= 600; (This model is a translation from an earlier AMPL model of mine.) * go/0 football_game = 4.3333333 soap_operas = 3.3333333 z = 33.333333000000003 penalties [s1_minus = 0,s1_plus = 0] [s2_minus = 0,s2_plus = 0] [s3_minus = 0,s3_plus = 0] [s4_minus = 0,s4_plus = 33.333333000000003] * go2/0 (integer approach) football_game = 4 soap_operas = 4 z = 40 penalties [s1_minus = 0,s1_plus = 0] [s2_minus = 0,s2_plus = 0] [s3_minus = 0,s3_plus = 0] [s4_minus = 0,s4_plus = 40] This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import mip. % import cp. % only for go2/0 main => go. go => S1_Penalty = 200.0, S2_Penalty = 100.0, S3_Penalty = 50.0, X1 :: 0.0..1000.0, % football game X2 :: 0.0..1000.0, % soap operas % penalties S1_Minus :: 0.0..1000.0,% penalty for x1 < limit S2_Minus :: 0.0..1000.0, S3_Minus :: 0.0..1000.0, S4_Minus :: 0.0..1000.0, % penalty for exceeding budget S1_Plus :: 0.0..1000.0, % penalty for x1 > limit S2_Plus :: 0.0..1000.0, S3_Plus :: 0.0..1000.0, S4_Plus :: 0.0..1000.0, Z :: 0.0..1000.0, Z #= S1_Penalty*S1_Minus + S2_Penalty*S2_Minus + S3_Penalty*S3_Minus + S4_Plus, 7.0*X1 + 3.0*X2 + S1_Minus - S1_Plus #>= 40.0, % HIW 10.0*X1 + 5.0*X2 + S2_Minus - S2_Plus #>= 60.0, % LIP 5.0*X1 + 4.0*X2 + S3_Minus - S3_Plus #>= 35.0, % HIW 100.0*X1 + 60.0*X2 + S4_Minus - S4_Plus #<= 600.0, % Budget constraint Vars = [X1,X2,S1_Minus,S2_Minus,S3_Minus,S4_Minus,S1_Plus,S2_Plus,S3_Plus,S4_Plus], solve($[min(Z)],Vars), println(football_game=X1), println(soap_operas=X2), println(z=Z), println("penalties\n"), println([s1_minus=S1_Minus,s1_plus=S1_Plus]), println([s2_minus=S2_Minus,s2_plus=S2_Plus]), println([s3_minus=S3_Minus,s3_plus=S3_Plus]), println([s4_minus=S4_Minus,s4_plus=S4_Plus]), nl. % % Integer version % go2 => S1_Penalty = 200, S2_Penalty = 100, S3_Penalty = 50, X1 :: 0..1000, % football game X2 :: 0..1000, % soap operas % penalties S1_Minus :: 0..1000,% penalty for x1 < limit S2_Minus :: 0..1000, S3_Minus :: 0..1000, S4_Minus :: 0..1000, % penalty for exceeding budget S1_Plus :: 0..1000, % penalty for x1 > limit S2_Plus :: 0..1000, S3_Plus :: 0..1000, S4_Plus :: 0..1000, Z :: 0..1000, Z #= S1_Penalty*S1_Minus + S2_Penalty*S2_Minus + S3_Penalty*S3_Minus + S4_Plus, 7*X1 + 3*X2 + S1_Minus - S1_Plus #>= 40, % HIW 10*X1 + 5*X2 + S2_Minus - S2_Plus #>= 60, % LIP 5*X1 + 4*X2 + S3_Minus - S3_Plus #>= 35, % HIW 100*X1 + 60*X2 + S4_Minus - S4_Plus #<= 600, % Budget constraint Vars = [X1,X2,S1_Minus,S2_Minus,S3_Minus,S4_Minus,S1_Plus,S2_Plus,S3_Plus,S4_Plus], solve($[min(Z)],Vars), println(football_game=X1), println(soap_operas=X2), println(z=Z), println("penalties\n"), println([s1_minus=S1_Minus,s1_plus=S1_Plus]), println([s2_minus=S2_Minus,s2_plus=S2_Plus]), println([s3_minus=S3_Minus,s3_plus=S3_Plus]), println([s4_minus=S4_Minus,s4_plus=S4_Plus]), nl.