首先,我正在使用线性编程包PuLP
好的,我正在使用
通过shell收集用户输入x = raw_input('-->')
现在用户将要输入的信息是线性不等式形式(例如2 * a + 3 * b <= 4)。我已经编写了一个方法,将用户定义的变量a和b存储到LP中。
我现在无法通过以下方式获取输入并将其存储为LP中的约束:
prob += x
如果您对python文件中的信息进行硬编码,则只需添加:
prob += 2*a +3*b <= 4
这个例子
我得到的错误信息是:
TypeError:+ =的不支持的操作数类型:&#39; int&#39;和&#39; str&#39;
有什么想法吗?
答案 0 :(得分:2)
尝试做:
x = float(raw_input('-->'))
我假设prob
是一个整数。 raw_input
以字符串形式返回变量,因此您希望将其转换为整数/浮点数。你得到错误,因为你试图“添加”一个字符串和一个整数;要么添加两个整数,要么连接两个字符串,但它们不能相互完成。因此,由于x必须是整数(或浮点数),使用float(obj)
或int(obj)
---你不知道x
是浮点数还是整数,所以只需使用float
。
要解析给出的不等式,请执行以下操作:
#assuming no spaces in the inequality are included; if the input isn't in the correct form, the program will NOT work correctly
ineq = input("What is the inequality? Input in the form: ax+by<=c: ")
a, b, c, sign, index = 0, 0, 0, '', 0 #multiple assignment
while ineq[index] != 'x': #until it reaches x, it will keep going
a += int(ineq[index])
if ineq[index] == 'x':
break
index += 1 # index = index + 1
index += 2 #to go through the 'x' and '+'
while ineq[index] != 'y':
b += int(ineq[index])
if ineq[index] == 'y':
break
index += 1
index += 1 #to go through the 'y'
if ineq[index] == '<' and ineq[index + 1] == '=':
sign = '<='
elif ineq[index] == '>' and ineq[iddex + 1] == '=':
sign = '>='
elif ineq[index] == '>':
sign = '>'
else:
sign = '<'
if sign == '<=' or sign == '>=':
index += 2 #to go through the '>' or '<' and the '='
else:
index += 1 #to go through the '>' or '<'
c = int(ineq[index:])
#code to solve the inequality
更简单快捷的方法是只提示用户输入'a','b','c'和'sign'的每个值。
答案 1 :(得分:2)
因此,您的用户输入和代码内python的示例之间存在根本区别:
在此示例中,用户输入将是字符串文字"2*a + 3*b <=4"
您无法将字符串文字附加到prob
,因为它需要约束或类似对象 - 这是您的错误来源。
prob += x
当你在python中评估相同的表达式时,你会注意到它缺少我在那里的语句周围放置的引号。
这不是字符串文字,它是一个python表达式。纸浆的某些部分将其评估为约束对象,然后将该约束添加到问题中。
prob += 2*a +3*b <= 4
现在,完全忽略了任意代码执行的可能性,解决问题的最简单方法是将用户输入评估为python代码,然后让语言完成剩下的工作:
exec("prob +="+x);
应该注意的是,除非此脚本完全供您个人使用,否则这是一个可怕的想法。
从一般编程的角度来看,正确的解决方案是从字符串构造LPConstraint对象,然后将新构造的对象添加到prob。
在理想的世界中,你有一个LPConstraint的构造函数,它在库中的某个地方采用字符串或辅助方法来为你做这个。
我已经完成了(不可否认的是所有5分钟......)一些阅读文档,但找不到任何此类方法。假设其他人没有任何运气,你就会自己解析字符串(以及所有需要的麻烦)并从结果中构建一个约束对象。
对于这样的问题,问题实际上是范围之一:
如果您要创建在高中或大学的计算机实验室中运行的python脚本,为了上帝之爱不要使用exec。
如果您为了自己的目的而创建在您的(可能还有朋友的)机器上运行的python脚本,那么编写解析器是浪费您的时间和精力 - 您不会执行你自己的盒子上的恶意代码。