2012-11-04 20 views
1

我試圖設計一個模型,可以管理不同水源的不同請求。 平臺:MAC OSX,使用安裝了TuLip模塊的最新Python。使用時態邏輯創建一個在兩種不同狀態之間切換的模型?

例如,

Definitions : 

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

-

Specifications : 

Water 1 (w1) is preferred, but w2 will be used if w1 unavailable. 
Water 2 is only used if w1 is depleted. 
r1 has the maximum priority. 
If all entities request simultaneously, r1's supply must not fall below 50%. 

-

的水源是不是離散而是連續的,這將增加創建模型的難度。我可以對水位進行粗略的離散化處理,但我更喜歡首先爲連續狀態找到一個模型。

那麼我該怎麼做呢?

我的一些想法:

  • 創建一個矩陣W其中W1,W2∈w^
  • 創建一個矩陣R其中,R1,R2,R3∈R
  • 或離開奇異所有變量沒有把他們在一個矩陣

我不是編碼方面的專家,所以這就是爲什麼我需要幫助。不知道什麼是開始解決這個問題的最好方法。 我只對模型感興趣,或者如何將它放在一起的代碼示例。

編輯

現在想象我做的水源的粗離散有W1 = [0 ... 4]和w2 = [0 ... 4]爲0,25,50, 75,100%。

==>表示意味着水源

用法:

  • 如果W1 [0] ==> W2 [4] - 這意味着如果水源1具有0%,則使用水源2等的100%
  • 如果W1 [1] ==> W2 [3]
  • 如果W1 [2] ==> W2 [2]
  • 如果W1 [3] ==> W2 [1]
  • 如果W1 [4] ==> W2 [0]

R1 = R2 = R3 = [0,1] - 0手段請求OFF,1表示請求ON

現在可以設計什麼模型,根據w1和w2的值給出每個請求100%的水量(w1和w2的值是不可控制的,因此不能定義具體的值,但0 ...4用於簡單)

+0

只是一個想法 - 這不是我的專業領域 - 你能利用事件循環系統嗎?也許這樣當w1耗盡時,會發生一個事件,它可以被捕獲並用於切換到w2? –

+0

@CallumMcLean嗯,請你詳細說明一下嗎? – NLed

+0

什麼?什麼是事件循環或如何使用它? –

回答

1

這就是所謂的流量問題:http://en.wikipedia.org/wiki/Maximum_flow_problem

維基的解決方案的一些代碼:http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm

我不知道時間的邏輯是有很大幫助這裏。例如,負載均衡是一個重要的研究課題,我相信其中大部分並不使用這種形式主義。

我已經編碼了一些東西,它只代表一個簡單的優先級列表,這是一種微不足道的。我會用類和函數來表示狀態,而不是矩陣。優先級的依賴關係很簡單。否則,您可以將這些添加到類watersource中。 (類WaterSourcePriorityQueue或類似的東西)。爲了得到一個模擬,使用線程是很好的,我不在這裏。您可以使用逐步迭代(輪次),這更符合程序化程序。

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

很好的回覆,我喜歡你在這裏所做的。這也可以在線性時間邏輯中實現。但是,我需要弄清楚如何指示組件需要水的供水。 – NLed

相關問題