2012-02-21 11 views
3

ブランチとバインドされたアルゴリズムを実装して、私の学士論文でストレージ管理の戦略を割り当てる効果を証明する必要があります。 私はプログラマーではありません、私はCで少しのノウハウを持っていますが、このアルゴリズムは人工知能の一種であり、決定を下す必要があるため、すぐに書き込むことはできません。ブランチとバインドされたアルゴリズムの実装

私はこの問題に近づく方法を知りたいと思います。

私は各ノードに必要なものすべてを計算するように、反復1の作業コードを持っていますが、レベル1のノードを表す構造の単純な配列にデータを格納しています。問題は、レベルノードの数ですが、ノード1,2,3から始まるx-1、x-2、x-3、...という新しいノードを作成する必要があります。

もし誰かが私の問題に近づくために私を正しい方法で置くことがとても親切であれば。

ここで私は、最初の反復のために働いて、これまで持っていたコードは申し訳ありませんが、ですが、コメントはイタリア語である:

// 
// main.cpp 
// prova1 
// 
// Created by Marco Braglia on 13/02/12. 
// Copyright (c) 2012 __MyCompanyName__. All rights reserved. 
// 

#include <fstream> 
#include <iostream> 
#include <vector> 

using namespace std; 

// definizione nuova struttura per i nodi dell'albero decisionale 
struct nodo{ 
    int last_prod; 
    int last_slot; 
    float Z_L; 
    float Z_U; 
    float g; 
    bool fathomed; 
}; 

// dichiarazione variabili 
float distanze[361]; 
int slot[112]; 
int slot_cum[112]; 
float COIp[112]; 
int domanda[112]; 
struct nodo n_0; 
struct nodo n_1[112]; 
struct nodo n_2[111][111]; 
float Zb; 

float LowerBound(struct nodo n); 
float UpperBound(struct nodo n); 

int main() 
{ 



// lettura dati input 
// distanze slot 

ifstream dist_file ("/Users/MarcoBi/Desktop/TESI di LAUREA/Xcode/dati/distanze.txt"); 


if (!dist_file.is_open()) { 
    // il file non può essere aperto 
} 
else { 
    // leggi i dati nell'array distanze[] 
    for(int i=1; !dist_file.eof(); i++){ 
     dist_file >> distanze[i]; 
    } 

    // visualizza l'array per controllo 
    //for(int i=0; i<360; i++){ 
    //cout << distanze[i] << "\n "; 
    //} 
} 

//slot necessari per prodotto 

ifstream slot_file ("/Users/MarcoBi/Desktop/TESI di LAUREA/Xcode/dati/slot.txt"); 

if (!slot_file.is_open()) { 
    // il file non può essere aperto 
} 
else { 
    // leggi i dati nell'array slot[] 
    for(int i=1; !slot_file.eof(); i++){ 
     slot_file >> slot[i]; 
    } 

    for(int i=0; i<112; i++){ 
     slot_cum[i]=0; 
    } 

    for(int i=1; i<112; i++){ 
     slot_cum[i]=slot_cum[i-1]+slot[i]; 
    } 
    // visualizza l'array per controllo 
    // for(int i=0; i<111; i++){ 
    // cout << slot[i] << "\n "; 
    // } 
// cin.get(); 
} 

// COIp 

ifstream coi_file ("/Users/MarcoBi/Desktop/TESI di LAUREA/Xcode/dati/COIp.txt"); 

if (!coi_file.is_open()) { 
    // il file non può essere aperto 
} 
else { 
    // leggi i dati nell'array COIp[] 
    for(int i=1; !coi_file.eof(); i++){ 
     coi_file >> COIp[i]; 
    } 

    // visualizza l'array per controllo 
    //for(int i=0; i<111; i++){ 
    // cout << COIp[i] << "\n "; 
    // } 
} 

ifstream d_file ("/Users/MarcoBi/Desktop/TESI di LAUREA/Xcode/dati/domanda.txt"); 

if (!d_file.is_open()) { 
    // il file non può essere aperto 
} 
else { 
    // leggi i dati nell'array COIp[] 
    for(int i=1; !d_file.eof(); i++){ 
     d_file >> domanda[i]; 
    } 
} 


//inizializzazione nodi 
n_0.last_prod=0; 
n_0.last_slot=0; 
n_0.Z_L = 0; 
n_0.Z_U = 0; 
n_0.g = 0; 
n_0.fathomed = false; 
    for (int j=0; j<112; j++){ 

      n_1[j].last_prod = 0; 
      n_1[j].last_slot = 0; 
      n_1[j].Z_L = 0; 
      n_1[j].Z_U = 0; 
      n_1[j].g = 0; 
      n_1[j].fathomed = false; 
     } 


//inizializzazione soluzione obiettivo ad infinito 
Zb=999999999999; 

//calcolo bounds per nodi al livello 1 
for(int i=1;i<112;i++){ 
     n_1[i].last_prod=i; 
     n_1[i].last_slot=slot_cum[i]; 
     n_1[i].Z_L=LowerBound(n_1[i]); 
     n_1[i].Z_U=UpperBound(n_1[i]); 

    //calcolo g_c 
    float dm; 
    int D; 
    for(int i=1;i<112;i++){ 
     dm=0; 
     for(int j=1;j<=slot_cum[i];j++){ 
      dm=dm+distanze[j]; 
     } 
     dm=dm/slot_cum[i]; 
     D=0; 
     for(int k=1;k<=n_1[i].last_prod;k++){ 
      D=D+domanda[k]; 
     }    
     n_1[i].g=2*dm*D; 
    } 
    if (i==111) (n_1[i].fathomed=true);       //fathoming Rule 1 (ultimo prodotto) 
    if (n_1[i].Z_L>n_1[i].Z_U) (n_1[i].fathomed=true);   //fathoming Rule 3 (LB > UB) 
    if (n_1[i].Z_U<Zb) (Zb=n_1[i].Z_U);       //aggiorna UB migliore 

} 

ofstream livello1 ("/Users/MarcoBi/Desktop/TESI di LAUREA/Xcode/risultati/livello1.txt"); 

for(int i=1; i<112; i++){ 
    if (n_1[i].fathomed==false) 
     (livello1 <<"("<< i <<","<<n_1[i].last_slot<<")"<< " LB=" << n_1[i].Z_L << " UB=" << n_1[i].Z_U << " g=" << n_1[i].g <<'\n'); 
} 

} 

float LowerBound(struct nodo n){ 
int S[112]; 
float d[112]; 
float dmin[112]; 
int q[112]; 
float D; 
float LB; 

for(int i=1; i<112; i++){ 
    q[i]=q[i-1]+slot[i]; 
} 

//Calcolo S_pigreco 
for(int i=0;i<112;i++){ 
    S[i]=0; 
} 

for(int i=n.last_prod +2;i<112;i++){ 
    for(int j=n.last_prod +1;j<=i;j++){ 
     S[j]=S[j-1]+slot[j]; 
    } 
} 
S[110]=S[109] + slot[110]; 
S[111]=S[110] + slot[111]; 

//calcolo somma distanze da slot j+1 a q 
for(int i=0;i<112;i++){ 
    d[i]=0; 
} 

for(int j=n.last_prod + 1;j<112;j++){ 
    for(int i=n.last_slot + 1; i<n.last_slot + 1 + S[j]; i++){ 
     d[j]=d[j]+distanze[i]; 
    } 
} 

//calcolo dmin_pigreco 
for(int i=n.last_prod +1; i<112; i++){ 
    dmin[i]= d[i]/S[i]; 
} 

D=0; 
for(int i=n.last_prod +1; i<112; i++){ 
    D=D+dmin[i]*domanda[i]; 
} 
LB=(2*D); 
    return LB; 
} 

float UpperBound(struct nodo n){ 
float Ud; 
float Ur; 
int S[112]; 
float d[112]; 
float dm; 
int D; 

for(int i=0;i<112;i++){ 
    S[i]=0; 
} 
for(int i=n.last_prod +2;i<112;i++){ 
    for(int j=n.last_prod +1;j<=i;j++){ 
     S[j]=S[j-1]+slot[j]; 
    } 
} 

//calcolo Ud 
for(int i=0;i<112;i++){ 
    d[i]=0; 
} 

int t=n.last_slot; 

for(int i=n.last_prod +1;i<112;i++){ 
    for(int j=t + 1; j<=t + slot[i]; j++){ 
     d[i]=d[i]+distanze[j]; 
    } 
    t=t+slot[i]; 
    d[i]=d[i]/slot[i]; 
} 
Ud=0; 
Ur=0; 

for(int i=n.last_prod +1;i<112;i++){ 
    Ud=Ud + 2*(d[i]*domanda[i]); 
} 

//calcolo Ur 
dm=0; 
for(int i=n.last_slot +1; i<361; i++){ 
    dm=dm+distanze[i]; 
} 

dm=dm/(360-n.last_slot); 

D=0; 

for(int i=n.last_prod +1; i<112; i++){ 
    D=D+domanda[i]; 
} 

Ur=2*dm*D; 

return min(Ur,Ud); 
} 
+0

あなたが最初の反復のために持っているものを投稿して、私たちが何を処理しているかを見ることができます。 –

+0

@HunterMcMillenがコードを投稿しました。一種の混乱ですが、私が言ったように、C++での最初の経験です。私はすべてのサイクルが0番ではなく1番のインデックスから始まっていることを知っています。今すぐ修正します。 – MarcoBi

答えて

1

あなたが動的に構造体の配列を割り当て、その後のノードにリンクする必要があるようですねあなたの構造体。これを行うには、you would add a pointer to the struct type in the struct itselfを入力し、次に構造体の新しい配列とassign the resulting address to the pointer in your original structを割り当てます。次に、検索スペースを通過するときにnavigate from node to node as necessaryすることができます。

あなたの例は、上記のリンクリストの例よりも少し複雑です。これは、検索スペースを使って作業するときにツリーになるためですが、Cで動的データ構造の基礎を得るために使用できます。あなたの状況にそれを適応させることができます。

+0

私のノードは配列ではなく、単一のアイテムである必要があると思います。ルートノードから始めて、特定の条件が発生するまで新しいノードを作成してから、作成した新しいノードごとに繰り返してください。同じ反復で作成されたノードは、同じノード(父)を参照する必要があります。それをどうすれば実現できますか? – MarcoBi

+0

親に後ろのポインタを追加するといいですよね、ロセッタコードの二重リンクリストの例があります。また、配列を持たないと、ポインタが単一のノードだけを指すことができ、構造体の1つに十分なメモリを割り当てるだけです。これが本当にあなたにとって初めての場合は、sizeof演算子を構造体の1つに適用して、どれだけのメモリを割り当てるかを知ることになります。 – Bill

+0

ちょうどしました。私は二重リンクされた "ツリー"を実装しました。各ノードには、ナビゲーション順の次のものへのポインタと親へのポインタがあります。 thx btw – MarcoBi

関連する問題