2010-11-30 35 views
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进位(通过检查功能和预测结果确定路线(s)?

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

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

    可以p知道在某种程度上这条路不好则避免选择这条道路?

    (1.2)的另一个混淆是如果p是自定义的类型,这个类的内部的有效载荷基本上是一个字符串,当它与一个路径[A,C,d]携带,可以p知道a()绝用int类型然后避免选择这个节点?'

  2. 相同1.2生成的路径时,可予避免这种糟糕

    DEF一个(P):返回P + 1点

    DEF(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造成麻烦,列表类型会很麻烦。 请考虑如果路径的功能

PS拉姆达列表:作为整个模型还不是很清楚在我心中的任何领导和指导将不胜感激。

谢谢!

+0

你如何构造计算功能?该函数可以返回一个不同的数据类型,然后它收到什么? – Krab 2010-11-30 11:58:05

+1

另外,请注意,p.append(1)将p添加到位,并且不会返回任何有用的内容。你可以通过`return p + [1]`来获得列表`p`,并在结尾添加额外的元素1。 – 2010-11-30 12:06:27

+0

实际上返回部分混淆了我,如果我限制输入和返回类型,可能很容易链接函数,但很难使其灵活。 – user478514 2010-11-30 18:07:29

回答

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 

如果你一无所知什么功能呢,你将不得不主要做了充分的广度优先搜索树,错误检查在每个节点丢弃坏的结果。如果你有更多的功能,这将会非常快速地变大。如果您可以保证某些功能的行为,那么您可能会大大减少搜索空间 - 但这是特定于域的,需要更准确地了解问题。

如果你有一个启发式的方法来测量每个结果离你想要的结果有多远,你可以做一个定向搜索来更快地找到好的答案 - 但是这样的启发式将取决于知道函数的整体形式(用于乘法函数的距离启发式将比用于加法函数的距离启发式等)。

0

我对你想要做的事情有些困惑,但是:p不能“知道”这些函数,直到它们通过它们运行。根据设计,Python函数并未指定它们操作的数据类型:例如a*5对于a是字符串,列表,整数还是浮点数都是有效的。

如果有一些功能可能无法在您的链接功能页上进行操作,那么你可以捕获异常,例如:

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 
+0

感谢您的建议,关于“eg a * 5是否有效a是否是字符串,一个列表,一个整数或一个浮点数“,这是我试图避免的最难的部分。因为假设我想要a = 5并且由于错误返回而给出a = [5],那将导致所有链路走向错误的方向。 – user478514 2010-11-30 18:17:29

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)