拓扑&&reward

http://acm.hdu.edu.cn/showproblem.php?pid=2647


Problem Description
Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards.
The workers will compare their rewards ,and some one may have demands of the distributing of rewards ,just like a's reward should more than b's.Dandelion's unclue wants to fulfill all the demands, of course ,he wants to use the least money.Every work's reward will be at least 888 , because it's a lucky number.
 

Input
One line with two integers n and m ,stands for the number of works and the number of demands .(n<=10000,m<=20000)
then m lines ,each line contains two integers a and b ,stands for a's reward should be more than b's.
 

Output
For every case ,print the least money dandelion 's uncle needs to distribute .If it's impossible to fulfill all the works' demands ,print -1.
 

Sample Input
  
2 1 1 2 2 2 1 2 2 1
 

Sample Output
  
1777 -1
这个题是简单的拓扑排序。。。以前做过,这次就是把它重新回忆一下。。

代码:

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define N 10005
int in[N];
int ran[N];
vector<int> v[N];
int n,m;
bool tp()
{   queue<int> q;
    for(int i=1;i<=n;i++)
      if(in[i]==0)
       q.push(i);
       int count=0;
         while(!q.empty())
         {  count++;
           int t=q.front();
             q.pop();
            for(int i=0;i<v[t].size();i++ )
              { int k=v[t][i];
              ran[k]=max(ran[k],ran[t]+1);//记录k节点有多少前继节点,为得到至少得到的工资数。
              if(in[k]==1) q.push(k);
              else in[k]--;
              }
         }
         if(count==n) return true;//判断是否形成环。
          else return false;
}
int main()
{    while(cin>>n>>m)
    {    for(int i=0;i<=n;i++)
          { v[i].clear();
            in[i]=0;
            ran[i]=0;
          }
           for(int i=0;i!=m;i++)
           {  int a,b;
                cin>>a>>b;
                v[b].push_back(a);//把后继点存在本节点的邻接表内。
                  in[a]++;//记录每一点的入度。
           }
           if(tp())
           { int ans=0;
           for(int i=1;i<=n;i++)
              ans+=ran[i];
               cout<<n*888+ans<<endl;
           }
            else cout<<"-1"<<endl;     
  }return 0;
    
}


### 基于强化学习的拓扑优化算法实现与介绍 #### 1. 强化学习在拓扑优化中的应用 强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习最优决策的机器学习方法。在拓扑优化领域,强化学习可以用于指导优化过程中的材料分布调整,从而提高优化效率和解的质量[^1]。具体而言,强化学习代理通过尝试不同的行动(如增加或减少特定单元格中的材料),并根据获得的奖赏信号(如结构性能指标的变化)来调整策略。 #### 2. 核心算法原理 基于强化学习的拓扑优化算法结合了全局搜索能力和局部寻优能力。其核心思想是利用强化学习的智能体(Agent)对设计空间进行探索,并通过奖赏函数引导优化方向。以下为该算法的主要组成部分: - **状态表示**:状态通常由当前结构的设计变量组成,例如每个单元格的密度值或材料分布矩阵。 - **动作空间**:动作定义为对设计变量的修改操作,例如增加或减少某个单元格的密度。 - **奖赏函数**:奖赏函数设计为衡量优化目标的指标,如结构重量、应力分布或位移等。奖赏函数的形式可以根据具体问题调整,例如: \[ R = w_1 \cdot f_{\text{weight}} + w_2 \cdot f_{\text{stress}} + w_3 \cdot f_{\text{displacement}} \] 其中 \(w_1, w_2, w_3\) 是权重参数,\(f_{\text{weight}}, f_{\text{stress}}, f_{\text{displacement}}\) 分别表示重量、应力和位移的目标函数值。 #### 3. 算法流程 以下是基于强化学习的拓扑优化算法的基本流程: ```python # 初始化参数 state = initialize_state() # 初始状态 agent = initialize_agent() # 初始化强化学习智能体 for episode in range(num_episodes): while not is_terminal(state): # 检查是否达到终止条件 action = agent.select_action(state) # 根据当前状态选择动作 next_state, reward = perform_action(state, action) # 执行动作并计算奖赏 agent.update_policy(state, action, reward, next_state) # 更新智能体策略 state = next_state # 更新状态 ``` #### 4. 示例代码 以下是一个简化的基于强化学习的拓扑优化算法的Python实现示例: ```python import numpy as np class TopologyOptimizer: def __init__(self, design_space_shape, gamma=0.99, learning_rate=0.1): self.design_space = np.ones(design_space_shape) # 初始设计空间 self.gamma = gamma # 折扣因子 self.learning_rate = learning_rate # 学习率 def select_action(self, state): # 简单策略:随机选择一个单元格并调整其密度 idx = np.random.randint(0, len(state)) action = np.random.choice([-0.1, 0.1]) # 减少或增加密度 return idx, action def update_policy(self, state, action, reward, next_state): # 简单更新规则:调整密度值以最大化奖赏 q_value = reward + self.gamma * np.max(next_state) self.design_space[action[0]] += self.learning_rate * (q_value - state[action[0]]) def calculate_reward(design_space): # 奖赏函数:假设目标是最小化重量同时满足应力约束 weight = np.sum(design_space) stress = np.mean(design_space > 0.5) # 简化应力计算 return -weight if stress < 0.8 else -np.inf # 主循环 optimizer = TopologyOptimizer((10, 10)) for episode in range(100): state = optimizer.design_space.copy() idx, action = optimizer.select_action(state) next_state = state.copy() next_state[idx] += action reward = calculate_reward(next_state) optimizer.update_policy(state, (idx, action), reward, next_state) ``` #### 5. 实验验证 通过数值算例验证了基于强化学习的拓扑优化方法的有效性。实验结果表明,该方法能够在较短时间内找到接近最优的材料分布方案,同时具有良好的鲁棒性和适应性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值