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%.

-

水源は離散的ではなく連続的であるため、モデルの作成が難しくなります。水位の大まかな離散化を行うことができますが、最初に連続状態のモデルを見つけることを好みます。

では、どうすればそれを開始できますか?

私の考えのいくつか:

  • w1,w2 ∈ W である行列 W を作成します。
  • r1,r2,r3 ∈ R である行列 R を作成します。
  • または、変数を行列に入れずにすべての変数を単数のままにします

私はコーディングの専門家ではないので、助けが必要です。この問題への取り組みを開始する最良の方法が何であるかはわかりません。私はモデル、またはこれをどのようにまとめることができるかのコードサンプルにのみ興味があります.

編集

ここで、水源の大まかな離散化を行って、それぞれ 0、25、50、75、100 パーセントに対して w1=[0...4] および w2=[0...4] になると想像してください。

==> 意味する

水源の利用:

  • if 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 を使用します)。

4

1 に答える 1

1

これはフロー問題と呼ばれます:http://en.wikipedia.org/wiki/Maximum_flow_problem

Wikiには、ソリューションのコードがいくつかあります:http: //en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm

ここで時相論理が大いに役立つかどうかはわかりません。たとえば、負荷分散は主要な研究トピックであり、そのほとんどはこの形式を使用していないと思います。

私は何かをコーディングしましたが、それは単純な優先順位リストを表すだけで、それはちょっと些細なことです。行列ではなく、状態を表すためにクラスと関数を使用します。優先度に関する依存関係は十分に単純です。それ以外の場合は、それらをクラスの水源に追加することもできます。(クラス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)
于 2012-11-04T22:58:15.653 に答える