创建一个使用时态逻辑在两个不同状态之间切换的模型?

2024-10-03 11:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图设计一个模型,可以管理不同的要求不同的水源。 平台:macosx,使用安装郁金香模块的最新Python。在

例如

Definitions :

Two water sources : w1 and w2
3 different requests : r1,r2,and r3

-

^{pr2}$

-

水源不是离散的而是连续的,这将增加模型建立的难度。我可以对水位进行粗略的离散化,但我更喜欢先找到连续状态的模型。在

那我该怎么开始呢?在

我的一些想法:

  • 创建一个矩阵W,其中w1,w2∈W
  • 创建一个矩阵R,其中r1,r2,r3∈R
  • 或者让所有变量保持单数而不把它们放入矩阵中

我不是编码专家,所以我需要帮助。不知道什么是开始解决这个问题的最佳方法。 我只对模型感兴趣,或者是一个如何将其组合在一起的代码示例。在

编辑

现在假设我对水源做了一个粗略的离散化,得到w1=[0…4]和w2=[0…4],分别为0,25,50,75100%。在

==>;意味着意味着

水源的使用:

  • 如果w1[0]==>;w2[4]——即如果水源1有0%,则使用100%的水源2等
  • 如果w1[1]==>;w2[3]
  • 如果w1[2]==>;w2[2]
  • 如果w1[3]==>;w2[1]
  • 如果w1[4]==>;w2[0]

r1=r2=r3=[0,1]——0表示请求关闭,1表示请求打开

现在可以设计什么模型来根据w1和w2的值为每个请求提供100%的水(w1和w2的值是不可控的,所以不能定义具体的值,但是为了简单起见,使用0…4)


Tags: 模块and模型gt矩阵平台macosxw1
1条回答
网友
1楼 · 发布于 2024-10-03 11:23:20

这就是所谓的流问题:http://en.wikipedia.org/wiki/Maximum_flow_problem

Wiki有一些解决方案的代码:http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm

我不确定时间逻辑在这里有多大帮助。例如,负载平衡是一个主要的研究课题,我相信它大部分都没有使用这种形式主义。在

我编写了一些代码,它只代表一个简单的优先级列表,这有点微不足道。我将使用类和函数来表示状态,而不是矩阵。优先级方面的依赖关系非常简单。否则,也可以将它们添加到类watersource。(类水源优先队列之类的)。为了得到一个模拟,最好使用线程,我在这里没有。您可以使用逐步迭代(rounds),这更符合程序程序。在

import time
from random import random
from math import floor
import operator

class Watersource:

    def __init__(self,initlevel,prio,name):
        self.level = initlevel
        self.priority = prio
        self.name = name

    def requestWater(self,amount):
        if amount < self.level:
            self.level -= amount
            return True
        else:
            return False


#watersources
w1 = Watersource(40,1,"A")
w2 = Watersource(30,2,"B")
w3 = Watersource(20,3,"C")

probA = 0.8 # probability A will be requested
probB = 0.7
probC = 0.9

probs = {w1:probA,w2:probB,w3:probC}
amounts = {w1:10,w2:10,w3:20} # amounts requested

ws = [w1,w2,w3]

numrounds = 100
for round in range(1,numrounds):
    print 'round ',round

    done = False
    i = 0
    priorRequest = False
    prioramount = 0

    while not done or priorRequest:
        if i==len(ws):
            done=True
            break

        w = ws[i]
        probtresh = probs[w]
        prob = random()

        if prob > probtresh: # request water
            if prioramount != 0:
                amount = prioramount
            else:
                amount = floor(random()*amounts[w])
                prioramount = amount

            print 'requesting ',amount

            success = w.requestWater(amount)

            if not success:
                print 'not enough'

                priorRequest=True
            else:
                print 'got water'
                done = True
                priorRequest=False

        i+=1



    time.sleep(1)

相关问题 更多 >