1

首先,我正在使用线性编程包 PuLP

好的,所以我正在使用 shell 通过 shell 收集用户输入

x = raw_input('-->')

现在用户将输入的信息是线性不等式形式(例如2*a + 3*b <= 4)。我已经编写了一个将用户定义的变量 a 和 b 存储到 LP 中的方法。

我现在无法通过以下方式获取输入并将其作为约束存储在 LP 中:

prob += x 

如果您对 python 文件中的信息进行硬编码,您只需添加:

prob += 2*a +3*b <= 4

对于这个例子

我得到的错误信息是:

类型错误:+= 不支持的操作数类型:“int”和“str”

有任何想法吗?

4

2 回答 2

2

尝试做:

x = float(raw_input('-->'))

我假设prob是一个整数。raw_input将变量作为字符串返回,因此您希望将其转换为整数/浮点数。您收到错误是因为您试图“添加”一个字符串和一个整数;要么添加两个整数,要么连接两个字符串,但它们不能相互连接。因此,由于 x 必须是整数(或浮点数),使用float(obj)or 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”和“符号”的每个值。

于 2012-12-07T00:06:14.887 回答
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 脚本以在您(也可能是您朋友的)机器上运行,那么编写解析器是公然浪费您的时间和精力——您不会执行恶意代码你自己的盒子。

于 2012-12-07T00:24:31.913 回答