This is a simple decision maker. It chooses the best option between N items. Each item can have M constraint values (non-zero). It is assumed each constraint has equal importance (weight).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | # decisionmaker.py
# FB - 201010155
# Choose the best item from N options.
# Each item can have M constraints (non-zero).
# All constraints assumed to have equal importance (weight).
import sys
def makeDecision(constraintsTable, constraintTypes):
# calculate item values
itemValues = []
for i in range(n):
itemValues.append(float(1))
for j in range(m):
if constraintTypes[j] == 0: # min value is better
itemValues[i] /= constraintsTable[i][j]
else: # max value is better
itemValues[i] *= constraintsTable[i][j]
# choose the best item
maxIndex = 0
maxValue = itemValues[0]
for i in range(n):
if itemValues[i] > maxValue:
maxValue = itemValues[i]
maxIndex = i
return itemNames[maxIndex]
# MAIN
n = int(raw_input('Number of items: '))
if n < 2:
sys.exit()
m = int(raw_input('Number of constraints for each item: '))
if m < 2:
sys.exit()
constraintNames = []
constraintTypes = [] # min or max is better
for j in range(m):
constraintName = raw_input('Constraint ' + str(j + 1) + ' name: ')
constraintNames.append(constraintName)
constraintType = int(raw_input('Lower(0) or Higher(1) is better: '))
if constraintType < 0 or constraintType > 1:
sys.exit()
constraintTypes.append(constraintType)
itemNames = []
constraintsTable = []
for i in range(n):
itemName = raw_input('Item ' + str(i + 1) + ' name: ')
itemNames.append(itemName)
constraints = []
for j in range(m):
constraint = float(raw_input(constraintNames[j] + ': '))
if constraint == 0.0:
print 'Constraint value cannot be 0!'
sys.exit()
constraints.append(constraint)
constraintsTable.append(constraints)
print 'Best item decided: ' + makeDecision(constraintsTable, constraintTypes)
|
This is a sample run:
Number of items: 2
Number of constraints for each item: 3
Constraint 1 name: price
Lower(0) or Higher(1) is better: 0
Constraint 2 name: speed
Lower(0) or Higher(1) is better: 1
Constraint 3 name: ram
Lower(0) or Higher(1) is better: 1
Item 1 name: laptop1
price: 500
speed: 1.5
ram: 4
Item 2 name: laptop2
price: 600
speed: 2
ram: 8
The best item decided: laptop2
It is also assumed that each constraint is a linear quantity.
You might want to organize your code into functions if you want others to appreciate your work more.
Converted the decision making part to a function.
Also here is another test run w/ more items and constraints:
Number of items: 3
Number of constraints for each item: 4
Constraint 1 name: price
Lower(0) or Higher(1) is better: 0
Constraint 2 name: speed
Lower(0) or Higher(1) is better: 1
Constraint 3 name: ram
Lower(0) or Higher(1) is better: 1
Constraint 4 name: disk
Lower(0) or Higher(1) is better: 1
Item 1 name: laptop1
price: 500
speed: 1.5
ram: 4
disk: 320
Item 2 name: laptop2
price: 600
speed: 2
ram: 8
disk: 500
Item 3 name: laptop3
price: 700
speed: 2
ram: 6
disk: 750
Best item decided: laptop2
Actually I think there is a simple way to allow weights for each item: Just add another constraint called 'weight' (w/ 'higher is better' selected).
For example, that could be used to implement brand name importance in decisions. Like, if a laptop has a better-known brand name then it would have weight=2 otherwise weight=1 etc.