Add command-line parameter for occasional buyers
Some buyers are only available based on a world quality. The solver now skips buyers if they are not available. This is specified using a new parameter, which is mutually-exclusive with specifying a specific buyer. If no buyer is specified, this world quality must be specified instead to tell the solver who is around.
This commit is contained in:
parent
2dd7643909
commit
3032ec320a
|
@ -1145,8 +1145,20 @@ class Fluctuation(enum.Enum):
|
||||||
ANTIQUITY = 1
|
ANTIQUITY = 1
|
||||||
AMALGAMY = 2
|
AMALGAMY = 2
|
||||||
|
|
||||||
|
# Which of several unusual buyers are available.
|
||||||
|
class OccasionalBuyer(enum.Enum):
|
||||||
|
AN_ENTHUSIAST_IN_SKULLS = [Buyer.AN_ENTHUSIAST_IN_SKULLS]
|
||||||
|
|
||||||
def Solve(bone_market_fluctuations, zoological_mania, desired_buyer = None, maximum_cost = cp_model.INT32_MAX, maximum_exhaustion = cp_model.INT32_MAX, time_limit = float('inf'), stdscr = None):
|
A_DREARY_MIDNIGHTER = [Buyer.A_DREARY_MIDNIGHTER]
|
||||||
|
|
||||||
|
A_COLOURFUL_PHANTASIST = [
|
||||||
|
Buyer.A_COLOURFUL_PHANTASIST_BAZAARINE,
|
||||||
|
Buyer.A_COLOURFUL_PHANTASIST_NOCTURNAL,
|
||||||
|
Buyer.A_COLOURFUL_PHANTASIST_CELESTIAL,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def Solve(bone_market_fluctuations, zoological_mania, occasional_buyer = None, desired_buyer = None, maximum_cost = cp_model.INT32_MAX, maximum_exhaustion = cp_model.INT32_MAX, time_limit = float('inf'), stdscr = None):
|
||||||
model = cp_model.CpModel()
|
model = cp_model.CpModel()
|
||||||
|
|
||||||
actions = {}
|
actions = {}
|
||||||
|
@ -1182,10 +1194,19 @@ def Solve(bone_market_fluctuations, zoological_mania, desired_buyer = None, maxi
|
||||||
for embellishment in Embellishment:
|
for embellishment in Embellishment:
|
||||||
actions[embellishment] = model.NewIntVar(0, cp_model.INT32_MAX, embellishment.value.name)
|
actions[embellishment] = model.NewIntVar(0, cp_model.INT32_MAX, embellishment.value.name)
|
||||||
|
|
||||||
|
|
||||||
# Buyer
|
# Buyer
|
||||||
for buyer in Buyer:
|
for buyer in Buyer:
|
||||||
actions[buyer] = model.NewBoolVar(buyer.value.name)
|
actions[buyer] = model.NewBoolVar(buyer.value.name)
|
||||||
|
|
||||||
|
# Mark unavailable buyers
|
||||||
|
model.AddAssumptions([
|
||||||
|
actions[buyer].Not()
|
||||||
|
for unavailable_buyer in OccasionalBuyer if unavailable_buyer != occasional_buyer
|
||||||
|
for buyer in unavailable_buyer.value if buyer != desired_buyer
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
# One torso
|
# One torso
|
||||||
model.Add(cp_model.LinearExpr.Sum([value for (key, value) in actions.items() if isinstance(key, Torso)]) == 1)
|
model.Add(cp_model.LinearExpr.Sum([value for (key, value) in actions.items() if isinstance(key, Torso)]) == 1)
|
||||||
|
|
||||||
|
@ -2124,6 +2145,7 @@ class EnumAction(argparse.Action):
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(prog='Bone Market Solver', description='Devise the optimal skeleton at the Bone Market in Fallen London.')
|
parser = argparse.ArgumentParser(prog='Bone Market Solver', description='Devise the optimal skeleton at the Bone Market in Fallen London.')
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-f', '--bone-market-fluctuations',
|
'-f', '--bone-market-fluctuations',
|
||||||
action=EnumAction,
|
action=EnumAction,
|
||||||
|
@ -2132,6 +2154,7 @@ def main():
|
||||||
help='current value of Bone Market Fluctuations, which grants various bonuses to certain buyers',
|
help='current value of Bone Market Fluctuations, which grants various bonuses to certain buyers',
|
||||||
dest='bone_market_fluctuations'
|
dest='bone_market_fluctuations'
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-m', '--zoological-mania',
|
'-m', '--zoological-mania',
|
||||||
action=EnumAction,
|
action=EnumAction,
|
||||||
|
@ -2140,13 +2163,23 @@ def main():
|
||||||
help='current value of Zoological Mania, which grants a 10%% bonus to value for a certain declaration',
|
help='current value of Zoological Mania, which grants a 10%% bonus to value for a certain declaration',
|
||||||
dest='zoological_mania'
|
dest='zoological_mania'
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
|
||||||
|
buyer = parser.add_mutually_exclusive_group(required=True)
|
||||||
|
buyer.add_argument(
|
||||||
|
'-o', '--occasional-buyer',
|
||||||
|
action=EnumAction,
|
||||||
|
type=OccasionalBuyer,
|
||||||
|
help='current value of Occasional Buyer, which allows access to a buyer that is not otherwise available',
|
||||||
|
dest='occasional_buyer'
|
||||||
|
)
|
||||||
|
buyer.add_argument(
|
||||||
'-b','--buyer', '--desired-buyer',
|
'-b','--buyer', '--desired-buyer',
|
||||||
action=EnumAction,
|
action=EnumAction,
|
||||||
type=Buyer,
|
type=Buyer,
|
||||||
help='specific buyer that skeleton should be designed for',
|
help='specific buyer that skeleton should be designed for',
|
||||||
dest='desired_buyer'
|
dest='desired_buyer'
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'-c', '--cost', '--maximum-cost',
|
'-c', '--cost', '--maximum-cost',
|
||||||
default=cp_model.INT32_MAX,
|
default=cp_model.INT32_MAX,
|
||||||
|
@ -2180,7 +2213,7 @@ def main():
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
arguments = (args.bone_market_fluctuations, args.zoological_mania, args.desired_buyer, args.maximum_cost, args.maximum_exhaustion, args.time_limit)
|
arguments = (args.bone_market_fluctuations, args.zoological_mania, args.occasional_buyer, args.desired_buyer, args.maximum_cost, args.maximum_exhaustion, args.time_limit)
|
||||||
|
|
||||||
if not args.verbose:
|
if not args.verbose:
|
||||||
def WrappedSolve(stdscr, arguments):
|
def WrappedSolve(stdscr, arguments):
|
||||||
|
|
Loading…
Reference in New Issue