Untitled

 avatar
unknown
plain_text
a month ago
7.2 kB
6
Indexable
// 在路徑上優化連結
void optimizeLinksOnPath(QuantumNetwork* network, int pairID, int source, int destination, int* path, int pathLength) {
    // 儲存每個節點對間已建立的糾纏鏈路數量
    int entangledLinksCount[MAX_NODES];
    // 儲存各節點對的Fidelity與糾纏probability,索引 [1] 表示未經優化,索引 [2] 表示已優化
    double probability[4][pathLength];
    double fide[4][pathLength];

    int minPathCount = 0; // 記錄成功建立糾纏鏈路的節點對數
    int node1_quantumMemories = network->nodes[path[0]].quantumMemories; // 起始節點的量子記憶體數量
    int node2_quantumMemories = network->nodes[path[pathLength - 1]].quantumMemories; // 終止節點的量子記憶體數量
    double finalFidelity = 1.0; // 路徑的總Fidelity
    double total_dis = 0.0;     // 路徑的總距離
    double finalprobability = 0.0; // 路徑的總probability

    // 建立初始的糾纏鏈路,逐一處理路徑上的節點對
    for (int i = 0; i < pathLength - 1; i++) {
        int node1 = path[i];
        int node2 = path[i + 1];
        total_dis += graph[node1][node2].distance; // 計算整體路徑距離

        // 檢查兩節點是否有可用的量子記憶體
        if (network->nodes[node1].quantumMemories > 0 && network->nodes[node2].quantumMemories > 0) {
            entangledLinksCount[i] = 1; // 初始化糾纏鏈路數量

            // 計算未經優化的Fidelity與probability
            fide[1][i] = calculateFidelity(graph[node1][node2].distance, network->beta);
            fide[2][i] = fide[1][i];
            probability[1][i] = calculateprobability(graph[node1][node2].distance, network->alpha) * network->swapProb;
            probability[2][i] = probability[1][i];

            // 更新路徑的總Fidelity與probability
            finalFidelity *= fide[2][i];
            finalprobability += probability[2][i];

            // 消耗兩節點的量子記憶體
            network->nodes[node1].quantumMemories--;
            network->nodes[node2].quantumMemories--;
            minPathCount++; // 計算成功建立的節點對數量
        } else {
            // 若任何一段無法建立,恢復節點的初始狀態並結束
            for (int i = 0; i < pathLength; i++) {
                network->nodes[path[i]].quantumMemories = network->nodes[path[i]].iniQMemories;
            }
            return;
        }
    }

    // 若只有一段鏈路,嘗試通過純化提升Fidelity
    if (minPathCount == 1) {
        int node1 = path[0];
        int node2 = path[1];

        // 持續純化直到Fidelity達到閾值或無法繼續純化
        while (network->nodes[node1].quantumMemories > 0 && network->nodes[node2].quantumMemories > 0) {
            network->nodes[node1].quantumMemories--;
            network->nodes[node2].quantumMemories--;
            probability[2][0] = compute_purification_probability(probability[2][0], probability[1][0]) * network->swapProb;
            fide[2][0] = purify(fide[2][0], fide[1][0]);
            entangledLinksCount[0]++;
            if (fide[2][0] >= network->fidelityThreshold) {
                break;
            }
        }
    } else {
        // 若路徑包含多段,嘗試優化整體Fidelity
        while (finalFidelity < network->fidelityThreshold) {
            int count = -1;
            double max_puri = 0.0;

            // 遍歷所有節點對,選擇Fidelity提升最大的一對進行純化
            for (int i = 0; i < minPathCount; i++) {
                int node1 = path[i];
                int node2 = path[i + 1];

                if (network->nodes[node1].quantumMemories > 0 && network->nodes[node2].quantumMemories > 0) {
                    fide[3][i] = purify(fide[2][i], fide[1][i]) - fide[2][i];
                    if (max_puri < fide[3][i]) {
                        max_puri = fide[3][i];
                        count = i;
                    }
                }
            }

            if (count == -1) break; // 無法進行進一步優化,結束

            // 執行選定節點對的純化操作
            network->nodes[path[count]].quantumMemories--;
            network->nodes[path[count + 1]].quantumMemories--;
            entangledLinksCount[count]++;
            finalFidelity /= fide[2][count];
            finalprobability -= probability[2][count];
            fide[2][count] = purify(fide[2][count], fide[1][count]);
            probability[2][count] = compute_purification_probability(probability[2][count], probability[1][count]) * network->swapProb;
            finalFidelity *= fide[2][count];
            finalprobability += probability[2][count];
        }
    }

    // 嘗試直接建立起點到終點的糾纏鏈路(bypass 機制)
    int cnt_link = 0;
    double probability1[2] = {0.0, 0.0};
    double fide1[2] = {0.0, 0.0};
    int node1 = path[0];
    int node2 = path[pathLength - 1];

    while (node1_quantumMemories > 0 && node2_quantumMemories > 0) {
        node1_quantumMemories--;
        node2_quantumMemories--;

        if (cnt_link == 0) {
            fide1[0] = calculateFidelity(total_dis, network->beta);
            fide1[1] = fide1[0];
            probability1[0] = calculateprobability(total_dis, network->alpha) * network->swapProb;
            probability1[1] = probability1[0];
            cnt_link++;
        } else {
            probability1[1] = compute_purification_probability(probability1[1], probability1[0]) * network->swapProb;
            fide1[1] = purify(fide1[1], fide1[0]);
            cnt_link++;
        }

        if (fide1[1] >= network->fidelityThreshold) {
            break;
        }
    }

    // 檢查路徑是否達到目標Fidelity
    if (finalFidelity >= network->fidelityThreshold) {
        printf("%d %d %d\n", pairID, source, destination);
        printf("%d\n", pathLength - 1);

        if (cnt_link != 0 && fide1[1] >= network->fidelityThreshold && finalprobability < probability1[1]) {
            printf("%d %d %d\n", node1, node2, cnt_link);
        } else {
            for (int i = 0; i < pathLength - 1; i++) {
                printf("%d %d %d\n", path[i], path[i + 1], entangledLinksCount[i]);
            }
        }

        // 恢復節點的初始量子記憶體數量
        for (int i = 0; i < pathLength; i++) {
            network->nodes[path[i]].iniQMemories = network->nodes[path[i]].quantumMemories;
        }
    } else if(fide1[1] >= network->fidelityThreshold){
        printf("%d %d %d\n", pairID, source, destination);
        printf("%d\n", pathLength - 1);
        printf("%d %d %d\n", node1, node2, cnt_link);
        for (int i = 0; i < pathLength; i++) {
            network->nodes[path[i]].iniQMemories = network->nodes[path[i]].quantumMemories;
        }
    }
    else {
        // 若未達到目標Fidelity,恢復節點的初始量子記憶體數量
        for (int i = 0; i < pathLength; i++) {
            network->nodes[path[i]].quantumMemories = network->nodes[path[i]].iniQMemories;
        }
    }
}
Leave a Comment