0

在网络内部,信息​​(包)可以传递给不同的节点(主机),通过修改其内容可以承载不同的含义。最终的包取决于主机通过给定的网络路由输入。

现在我想实现一个计算网络模型,可以通过给出不同的计算路径来做一些小工作。

原型:

def a(p): return p + 1
def b(p): return p + 2
def c(p): return p + 3
def d(p): return p + 4
def e(p): return p + 5


def link(p, r):
    p1 = p
    for x in r:
        p1 = x(p1)
    return p1

p = 100
route = [a,c,d]
result = link(p,result)
#========
target_result = 108
if result = target_result:
   # route is OK

我想最后我需要这样的东西:

  p with [init_payload, expected_target, passed_path, actual_calculated_result]
  |
  \/
 [CHAOS of possible of functions networks]
  |
  \/
  px [a,a,b,c,e]  # ok this path is ok and match the target 

以下是我的问题,希望能得到您的帮助:

  1. 可以p通过检查函数和估计结果来携带(确定)路线吗?</p>

    (1.1) 例如,如果路线上有一个节点x()

    def x(p): return x / 0 # I suppose it can pass the compile

    p以某种方式知道这条路径不好然后避免选择这条路径吗?

    (1.2) 另一个困惑是如果p是自定义的类类型,这个类里面的payload本质上是一个字符串,当它带有路径[a,c,d]时,可以p知道a()must带有一个int类型然后避免选择这个节点?

  2. 生成路径时与1.2相同,我可以避免这样的oops吗

    def a(p): 返回 p + 1

    def b(p): 返回 p + 2

    def x(p): 返回 p.append(1)

    def y(p): 返回 p.append(2)

    full_node_list = [a,b,x,y]

    path = random(2,full_node_list) # oops x,y 对于 inttype P 来说会很麻烦,而 a,b 在 list 类型上会很麻烦。请考虑路径是否是函数的 lambda 列表

PS:由于整个模型在我的脑海中不是很清楚,任何领导和指导将不胜感激。

谢谢!

4

3 回答 3

1

您可以先使用一组样本数据测试每个功能;任何返回一致不可用值的函数都可能被丢弃。

def isGoodFn(f):
    testData = [1,2,3,8,38,73,159]   # random test input
    goodEnough = 0.8 * len(testData)  # need 80% pass rate

    try:
        good = 0
        for i in testData:
            if type(f(i)) is int:
                good += 1
        return good >= goodEnough
    except:
        return False

如果您对函数的作用一无所知,则基本上必须进行完整的广度优先树搜索,并在每个节点上进行错误检查以丢弃不良结果。如果您有多个功能,这将很快变得非常大。如果您可以保证某些函数的行为,您可能可以大大减少搜索空间 - 但这将是特定于域的,需要更准确地了解问题。

如果您对每个结果与所需结果的距离有一个启发式测量,您可以进行定向搜索以更快地找到好的答案 - 但这样的启发式将取决于了解函数的整体形式(距离启发式乘法函数与加法函数等的函数非常不同)。

于 2010-11-30T21:01:51.680 回答
0

我对您要执行的操作感到有些困惑,但是: p 无法“知道”这些功能,直到它通过它们运行。按照设计,Python 函数不指定它们操作的数据类型:例如a*5,a 是字符串、列表、整数还是浮点数都有效。

如果有一些函数可能无法在 p 上运行,那么您可以捕获异常,例如在您的链接函数中:

def link(p, r):
    try:
        for x in r:
            p = x(p)
    except ZeroDivisionError, AttributeError: # List whatever errors you want to catch
        return None
    return p
于 2010-11-30T12:04:14.850 回答
0

raise TypeError如果他们对收到的数据类型不满意,您的函数可以。然后,您可以捕获此异常并查看您是否传递了适当的类型。您还可以捕获任何其他异常类型。但是尝试调用函数并捕获异常可能会很慢。

您还可以根据参数类型将函数组织成不同的集合。

functions = { list : [some functions taking a list], int : [some functions taking an int]}

...
x = choose_function(functions[type(p)])
p = x(p)
于 2010-11-30T12:07:44.027 回答